---
# System prepended metadata

title: '2020_OS_Fall_HW4: MLOps'
tags: [Operating Systems 2020]

---

# 2020_OS_Fall_HW4: MLOps
###### tags: `Operating Systems 2020`
:::info
繳交日期：2020/11/21 ~ 2021/01/04 12:00
:::
**作業目標**
* 理解Operation System (OS)提供哪些服務。
* 對Machine Learning (ML)的技術能有所瞭解。
* 培養學生獨立思考與做研究的能力。
* 為MLOps設計客製化的OS。
___

**學號**：F74071069
**姓名**：林霆寬
**系級**：資訊111

## Machine Learning 步驟 & 需求
### 步驟
根據 [Google - The 7 steps of machine learning](https://youtu.be/nKW8Ndu7Mjw)，machine learning 一共有 7 大步驟：
1. **Gathering data**
    收集到的資料可能會有多個面向，需要做整理並建表。  
2. **Preparing data**
    收集到的資料我們不希望順序影響訓練結果，所以會打亂資料集。之後可以將資料做視覺化的處理，看看資料是否有不平衡的地方，並做預處理。最後再將資料集拆成 Training data 和 Evaluation data，前者用來訓練，後者用來驗證。
3. **Choosing a model**
    透過資料的型態、資料視覺化，我們可能會知道資料集適合什麼 model。
4. **Training**
    ![](https://i.imgur.com/HOMKyLr.png)
    此步驟會將 Training data 丟進 model 中，產生一個預測結果，再和原本預期結果比較，然後修正參數，試著降低 mistakes，再進行下一次迭代。
5. **Evaluation**
    此步驟用沒有用在訓練的 Evaluation data 來測試 model 的精確度。
6. **Parameter tuning**
    這個步驟會嘗試微調訓練參數，像是 learning rate...等，看看能否再做優化。
7. **Prediction**
    最後完成訓練後，我們可以用訓練的模型來預測結果。
    
### 需求
從 [Microsoft MLOps](https://github.com/microsoft/MLOps) 敘述的有關 MLOps 的環節，以下幾點對於 Machine Learning 會有很大的需求：
* **版本控制**
    版本控制無庸置疑，對於 Machine Learning 來說是相當重要的。訓練一個可靠的模型，中間必定會歷經許多參數修改、模型調校。可能之前訓練有不錯的參數，或是有表現不錯的模型，若是能夠 log 起來，加上一些自動化的管理，可以加速開發。
    
* **Model Monitor**
    當模型實際拿來預測時，可能因為現實資料特性改變、環境改變，造成預測結果偏差。為了維護模型的品質，需要定期做監測，並修正模型。
    
* **資源分配、管理**
    ML Programming 和 Traditional Programming，從程式運行上就有些許不同。對於穩定性及運算資源的需求度不一。
    
## MLOps 的 OS設計
以下根據 Machine Learning 的步驟、需求，以及優化 MLOps 整體流程，整理了幾點 OS 可以提供的服務，以設計出專為 Machine Learning 設計的 Operating Systems。
* **資源分配**
    ML Programming 有一些特性和 Traditional Programming 有一些區別，對於運算需求很高，但是相比於車用 OS 需要考量很高的安全性以及穩定性，ML Programming 較不需要考量這方面的問題，程式發生 crash 也沒有關係，修改再重跑即可。因此，ML OS 可以盡可能提供資源給 ML Programming，等有特殊狀況再中斷程式把資源要回來。
    
* **排程**
    專為 ML 設計的 OS，比較不需要要求 response time，比如說 User command、鍵盤...等，可能跑一個 model train 我不需要馬上知道結果，我執行的 command 下去我可以讓 OS 排程，過一段時間再回來看結果，跟一般 Traditional Programming 或是其他應用端開發的 OS 相比，不太講求即時性。因此，排程演算法的設計可以捨棄類似 Round Robin (RR) 的設計思維，提升程式執行效率，降低 context switch 的成本。
    
* **Locality**
    以 Traditional Programming 來說，locality 是相當重要的，特別是 spatial locality，在 Traditional Programming 中，我們可能會由程式開發者自行調整 memory 存取的順序，盡量讓每次迭代都在附近的 address 進行存取，確保存取在同一個 page 內。而 ML Programming 除了傳統 row 的連續存取，也會有 column 的連續存取，甚至會有大量矩陣相乘運算。若是 OS 能夠提供一個 application 來決定資料擺放的政策，是要 row major 還是 column major 或是 針對矩陣相乘、矩陣反轉做 locality 優化，對於程式的加速也會有一定幫助。當資料夠龐大，也大幅減少 page fault 的次數。
    ![](https://i.imgur.com/mByeih8.png)
(圖片來源：UC Berkeley [CS 61C lab7](https://cs61c.org/su20/labs/lab07/))
    * **row major**
    ![](https://i.imgur.com/efBLN9C.png)
    * **column major**
    ![](https://i.imgur.com/T57RNWc.png)
    * 姑且叫 **block major**
    ![](https://i.imgur.com/rhwqQgu.png)

    OS 可以像記憶體管理的 system call `madvise` 一樣提供 spacial locality 的 API 或是 memory access advise policy 的 system call，讓 User 可以決定二維陣列 address access 的方式。

* **Huge page**
    有些 OS 像是 Linux 有提供這樣的服務，而 ML OS 可能也會有這樣的需求。就好比說上面提到的矩陣運算，OS 可以切一部分的 memory 供 huge page 使用，當我需要做矩陣運算時，就把矩陣載入 huge page 的區塊，這樣可以避免運算過程中 page fault I/O 的 overhead。
    
* **版本控制、log 相關的服務**
    為優化 MLOps 運作，OS 可以提供一些自動化的管理，比如說類似 shell script 這樣，User 可以根據自己需求，寫一個自動化 training、test 的 script，從 model 命名，參數和結果的 log，甚至是當較好的 model 被訓練出來後，可以自動取代舊的 model 的功能，加速訓練和測試流程。
    
* **Model Monitor**
    當 model 實際運作於預測上時，若是預測結果有偏差，OS 可以提供訊息回報的服務，發送一些 signal，User 可以預先設定是要自動 train new model 或是 手動進行參數修正。；