---
# System prepended metadata

title: Machine Learning Compilation_第一週(0618)
tags: [MLC, 陳天奇, Machine Learning Compilation]

---

# Machine Learning Compilation_第一週(0618)
###### tags: `陳天奇` `MLC` `Machine Learning Compilation`
![](https://hackmd.io/_uploads/Skh0DV0s5.png)

[官網連結](https://mlc.ai/summer22-zh/)
[課程連結](https://mlc.ai/summer22-zh/schedule)

## Outline
![](https://hackmd.io/_uploads/r17bONAsq.png)

課程大綱：
1. 說明何謂機器學習編譯及其目標
2. 目標下有那些關鍵元素
## Software Landscape
![](https://hackmd.io/_uploads/rJAMdERsq.png)

學習機器學習編譯的主要原因在於軟體開發的演化，在AI出現之前的軟體開發是漏斗型狀的，也就是像上圖看到的那般，因為我們希望所開發的軟體是可以支援非常多的應用程式。
## AI Software Landscape
![](https://hackmd.io/_uploads/r12XONAic.png)

到了AI的時代會發現，軟體已經不再是軟體，而是一個機器學習的模型，我們會希望這模型可以應用在各式各樣的硬體設備上。
## Machine Learning Deployment Problem
![](https://hackmd.io/_uploads/B1oVOVCsc.png)

回到我們的主題，什麼是機器學習編譯？這問題又必需討論到機器學習的佈署問題。上圖左是很多的機器學習應用場景，每一個應用都有它必需要做的佈署。舉例來說，自動駕駛，我們必需將模型佈署在車子裡面。又或者是一些語音的應用，就必需將模型佈署在音箱上、甚至有些模型我們可能會需要佈署在手機上。這意味著，隨著應用本身的多樣化，佈署環境本身也跟著愈來愈多樣化。

這種情況下要考慮的就很多了，要佈署的硬體是什麼？系統環境是什麼？blablabla，要考慮的事情愈來愈多，也造成機器學習佈署的複雜性的提高。這也是這門課出現的原因。
## Machine Learning Compilation
![](https://hackmd.io/_uploads/HkhH_VRsq.png)

課程中，我們將機器學習編譯(MLC)視為一個過程，這個過程就是將機器學習模型從開發型態轉為佈署型態。要考慮的事情很多，舉例來說，(1)佈署目標的相關接口，也許我們希望將模型佈署到android手機上，那我們要考慮的就是它的API接口，(2)模型資訊，要考慮能夠提供模型的相關資訊說明、模型的權重，(3)執行需求套件，在執行模型的時候也許需要特定的lib才能夠執行，(4)如何應用佈署目標的硬體。

我們必需要知道的是，開發型態的環境與佈署型態的環境不見得會是相同的，而且開發時候的眾多複雜問題都被所使用的框架處理了。因此，我們面對佈署問題的時候要考慮的問題就非常多。值得注意的是，這個過程(MLC Process)
## MLC Goal: Integration and Dependency Minimization
![](https://hackmd.io/_uploads/HylBcV0s5.png)

機器學習編譯的幾個目標：
1. 如何整合各種實現
2. 如何最小化相關依賴

我們可以想，當我們在實作一個模型的時候也許用到的只是整個框架的一小部份的功能函數，那當我們佈署在生產環境的時候是不是能夠只打包這些有用到的函數就好，而不是整個框架都帶著跑。另外就是，也許我們會有自定義的功能，將自定義功能與框架的功能整合也是整個機器學習編譯(MLC)的一個目標。
## MLC Goal: Leverage Hardward Native Acceleration
![](https://hackmd.io/_uploads/rJd89VAic.png)

3. 如何應用硬體本身所支援的加速特性

透過一些優化方式讓我們很好的應用硬體本身所提供的加速功能，像是將tf的模型佈在TPU上，或是將模型佈在nvidia的gpu上的時候轉成tensorrt之類的。

## MLC Goal: Optimization in General
![](https://hackmd.io/_uploads/rk_v9NAoq.png)

總體來看，整個機器學習編譯的過程就是在做優化，像是降低記憶體的使用、讓模型的推論更快、或是讓佈署更自動化。

## Machine Learning Compilation: Remarks
![](https://hackmd.io/_uploads/BJIOqVAjc.png)

機器學習譯編(MLC)這個用語其實也是來自平常我們開發軟體做的一個編譯的動作，從開發狀態經過compile轉成一個可執行狀態。只不過機器學習編譯的過程是跟一般的軟體開發有所不同，MLC這個過程並不一定會有寫程式的需求，只要在過程中可以來帶一些優化就可以。

雖然我們提到開發模式與佈署模式，不過在機器學習中這也許會是同一個東西，因為可能你開發完的模型就這樣佈上線也說不定。這時候MLC就可以提供一些優化，讓模型有更好的呈現，而且現在不少框架中也都有引入這類型的技術。

## Reason #1 to Study MLC: Build ML Deployment Solutions
![](https://hackmd.io/_uploads/SyZq940jq.png)

剛剛談的都是機器學習編譯在做什麼，現在我們要來談談為什麼需要機器學習編譯這個過程。

首先我們感興趣的是機器學習佈署的這個問題本身，一個模型從訓練好到真正的落地應用需要一系列的考量，而機器學習編譯就可以提供我們這個過程的解決方案。
## Reason #2 : In-depth Understanding of Existing Frameworks
![](https://hackmd.io/_uploads/ryCq9E0sc.png)

再來就是，目前愈來愈多的框架已經把機器學習編譯的技術給包進去，所以如果我們能夠理解機器學習編譯，那就能夠更好的應用這些框架所提供給我們的支援。

## Reason #3 : Build Software Stack for Emerging Hardware
![](https://hackmd.io/_uploads/S1esj9E0o9.png)

第三，目前來說已經有愈來愈多專門for機器學習的硬體設備，趁著這股風潮，可以有著一波硬體開發。而有些時候硬體開發的瓶頸就會在軟體搭配的部份。這時候MLC就可以提供一個基礎來做為新的硬體、軟體之間的溝通。
## Reason #4 : Machine Learning Compilation is Fun
![](https://hackmd.io/_uploads/ByOn9VAoq.png)

最重要的是，機器學習編譯是一件很有趣的事情。學會它，你就能夠明白從模型到佈署到機器上的所有一切。so fun。
## Outline
![](https://hackmd.io/_uploads/BJkyoECiq.png)

現在我們已經知道為什麼要學機器學習編譯(MLC)，接下來就聊聊裡面的關鍵元素。
## Key Elements in Machine Learning Compilation
![](https://hackmd.io/_uploads/B15yj4Cj5.png)

我們在談機器學習或是深度學習的時候，它包含幾個關鍵元素，就像上圖左所示，這很明顯是一個神經網路的推論架構。這裡面有兩個關鍵元素是我們應該知道的，(1)首先是Tensor，張量，輸入本身就是一個tensor，過程中每個layer得到的也是tensor。(2)接下來就是Tensor Functions，也就是張量函數，指的就是輸入與輸出之間的操作，線性函數、非線性函數，不過並不是一個函數就是一個張量函數，你也可以把整個模型視為一個張量函數。

## Example Compilation Process
![](https://hackmd.io/_uploads/Skwgs4As9.png)

機器學習編譯主要做的就是張量函數之間的變換，一樣是剛剛的範例，不同的是右邊是我們可能的執行佈署模式。佈署模式中，我們將前兩個function(linear + relu)合併成一個function(linear_relu)。這麼做是有意義的，平常我們在做推論的過程中是將每一個function的東西丟過去gpu處理，gpu處理完了再丟回來，回來之後再往下一個function去處理。合併成一個之後，就是一步完成兩個function的處理。

## Abstraction and Implementation
![](https://hackmd.io/_uploads/SkHbiNRs9.png)

剛剛所說的這麼一個過程就很像是我們平常寫程式會說到的，抽象，上圖我們可以看的到，一件事可以有三種不同的抽象表示，但細節也許是不一樣的。我們可以說愈細的抽象是higher-level abstraction的一種實現。

## MLC as Tensor Function Transformation (with different abstractions)
![](https://hackmd.io/_uploads/HJLfo4Ci9.png)

所以我們可以把機器學習編譯(MLC)視為一種張量函數在不同抽象形式上的轉換。可能一開始我們先把linear function與relu function合併成一個linear_relu function，然後再細部的去實現它。

## Four Categories of Abstractions We will Visit Later
![](https://hackmd.io/_uploads/r1f7oECic.png)

這種中我們會討論各種形式的抽象，也就是上面給出的四種抽象。

## Disclaimer
![](https://hackmd.io/_uploads/By1EoERo9.png)

這樣已經知道什麼是機器學習編譯，為什麼要學習這個議題，以及它的關鍵元素。而且這門課是地表上第一個談這個議題的課程。
## Logistics
![](https://hackmd.io/_uploads/HkFVsERsc.png)

接下來就是每週上課都會在相關網站上發佈訊息，歡迎大家來看。

## Summary
![](https://hackmd.io/_uploads/BJtHjVAi5.png)
