從資料到模型,以 MLOps 精神實作 AI 模型訓練

在「以 HPE MLDM 實作資料的版本控制」這篇文章中,我們分享了如何以 HPE MLDM 來讓資料前處理工作自動化,以及使用內建的版控功能,管理大量資料與前處理程式。這篇文章我們將著重在結合 MLDM 與 MLDE 實作模型的訓練,從前處理到模型訓練都在版控環境中執行,讓開發過程更順暢。

HPE 的完整生態系:MLDM + MLDE

先幫大家複習一下 MLDE,它提供深度學習(Deep Learning, DL)模型的自動化超參數(Hyperparameter)搜尋功能,開發者僅需以 MLDE 指定的方式建立 PyTorchTrial 物件,指定要搜尋的超參數範圍,就能簡單執行超參數搜尋。訓練完成後,MLDE 同樣內建幾種視覺化工具,可將實驗結果以直覺易懂的圖表呈現,讓管理實驗結果變得更輕鬆;MLDM 則將重點放在資料版本控制和前處理的自動化,工程師能以近似程式碼的版本控制方式去管理資料,更重要的是,MLDE 設定實驗參數時,可以使用 MLDM 的 Repository 作為資料來源,實現從資料上傳、前處理到輸入模型、訓練一條龍的整合。

實作

在這篇文章我們會使用 MLDM + MLDE 來進行貓狗圖片分類的卷積神經網路(Convolutional Neural Network,CNN)模型訓練,並進行以下操作:

  1. 下載 Kaggle 平台上的「Dogs vs. Cats」資料集(共 854 GB,需要建立 Kaggle 帳戶且同意競賽規則才能下載)
  2. 建立 MLDM Project、Repo
  3. 建立 MLDE 模型超參數最佳化實驗

實作部分的程式碼可以從 GitHub 下載。

在 MLDM 建立 Project、Repository

打開終端機,執行以下指令來建立專案:

(dogs-vs-cats) aif@aif % pachctl create project dogs-vs-cats
(dogs-vs-cats) aif@aif % pachctl config update context --project dogs-vs-cats

到 MLDM console UI 確認一下 Project 「dogs-vs-cats」 是否建立成功:

接著建立存放訓練與測試資料的 Repository:

(dogs-vs-cats) aif@aif % pachctl create repo train
(dogs-vs-cats) aif@aif % pachctl create repo test

完成後,進到 Project dogs-vs-cats 的 DAG,就能看到兩個 Repository 已建立好。

在 MLDM 的最後一個操作,就是把我們的訓練、測試資料各自上傳到負責存放的 Repository,由於這份資料集的樣本數高達 25,000,在操作時可刪除部分樣本,只保留少部分,以利加快執行:

(mldm) aif@aif % pachctl put file -c -r train@master -f ./dogs-vs-cats/train
dogs-vs-cats/train/cat.0.jpg 12.41 KB / 12.41 KB [=====================================] 0s 0.00 b/s
dogs-vs-cats/train/cat.1.jpg 16.88 KB / 16.88 KB [=====================================] 0s 0.00 b/s
dogs-vs-cats/train/cat.10.jpg 34.31 KB / 34.31 KB [====================================] 0s 0.00 b/s
...
(mldm) aif@aif % pachctl put file -c -r test@master -f ./dogs-vs-cats/test
dogs-vs-cats/test/10.jpg 22.19 KB / 22.19 KB [==============================================================] 0s 0.00 b/s
dogs-vs-cats/test/11.jpg 14.49 KB / 14.49 KB [==============================================================] 0s 0.00 b/s
dogs-vs-cats/test/12.jpg 31.15 KB / 31.15 KB [==============================================================] 0s 0.00 b/s
...

因為訓練資料包含 25,000 張圖片,逐張上傳可能會執行很久,因此在 MLDM put file 指令加上了 -c,讓 MLDM 在上傳時將檔案壓縮,當檔案數量多的情況下可以節省時間。上傳完成後同樣可以到 Repository 觀察 Commit 是否有剛才上傳的紀錄:

在 MLDE 建立實驗

資料前處理的相關步驟都已經就緒了,接著要進行 CNN 模型訓練,我們使用 ResNet-50 的預訓練權重(Pre-train weight)來進行微調(Fine-tune)。首要步驟是建立 MLDE Cluster,由於本實作範例使用沒有 GPU 的設備,要建立 Cluster 就得在指令後面加上 --no-gpu

(dogs-vs-cats) aif@aif % det deploy local cluster-up --no-gpu

開啟新的終端機,執行以下指令來建立 MLDE 實驗:

(dogs-vs-cats) aif@aif % det e create MLDE/adaptive.yaml MLDE/
Preparing files to send to master... 8.1KB and 5 files 
Created experiment 38

MLDE 的實驗,可透過 YAML 檔來設定,以剛剛建立的實驗為例,所使用的 adaptive.yaml 檔內容如下:

name: dogs-vs-cats  # 實驗名稱

data:
  pachyderm:
    host: host.docker.internal
    port: 80
    project: dogs-vs-cats
    train_repo: train
    test_repo: test
    branch: master

hyperparameters:
  learning_rate:
    type: log
    minval: -4.0
    maxval: -0.5
    base: 10.0
  global_batch_size: 16
  weight_decay: 1e-4
  nesterov: True

searcher:  # 搜尋方式
  name: random
  metric: accuracy
  max_trials: 4  # 最大嘗試次數
  max_length:
    batches: 2000 
  smaller_is_better: false

entrypoint: model_def:DogCatTrial

前往 http://localhost:8080/,打開 MLDE Console 確認一下實驗是否成功建立:

過了一段時間後,就能看到一些結果:

模型訓練可能需要較長時間,如果想快點看到結果,可以考慮更換較簡單的模型,或減少訓練資料數量。完成後,便可以使用 MLDE 內建的 API 存取訓練好的模型,對測試資料進行推論。

總結

經過了這一系列的實作,我們使用 HPE MLDM 與 MLDE,讓模型開發專案從資料前處理到模型訓練都進行版本控制,也做到資料前處理與模型超參數調整的自動化。此外,因為有完善的版本控制,每一個版本的資料,以及每一次實驗的結果變得更易於管理,搭配簡潔的圖形化介面,任何人都能快速掌握目前的開發狀況。在這次的實作範例中,我們把重點擺在與 MLDE 的串接,其設定方式也非常簡單,只要知道 MLDM Cluster 的位址與連接埠(Port)號碼,就能在 MLDE 上存取 MLDM 的 Repository。

參考資料

  1. 用 MLDE 平台實作 PyTorch 卷積神經網路模型 /hpe-mlde-unboxing1/
  2. Pachyderm Docs/Home/Latest/Integrate/Determined https://docs.pachyderm.com/latest/integrate/determined/

* 本篇文章由人工智慧科技基金會、HPE與AMD共同合作。