以 HPE MLDM 實作資料的版本控制
為什麼我們需要資料版本控制?
在開發過程中,隨著時間的推移,團隊常常因為模型效能或其他考量,不斷更新訓練資料,最後累積出大量版本。想像一個情境:在增加一些訓練資料後,模型就訓練不起來了,這時大家一定很想找出到底是改了什麼,才知道怎麼還原回先前的狀態。為了滿足這些需求,版本控制工具應運而生,就如同程式碼會使用 Git 這類的版本控制(以下簡稱為版控)工具,資料和模型現在也都有對應的選擇。先前我們在「MLOps 工具介紹(一):常見的三種模型實驗管理工具」一文為大家介紹了幾種模型的開源版控工具;現在我們則將重點放在資料。
隨著近年來 MLOps 文化的推廣,市面上已有許多能針對資料與模型的版控工具,它們通常有簡潔且易於使用的圖形化介面,並逐漸朝向高整合度發展。像是著名的實驗管理工具 MLflow 就整合模型版控、部署與實驗管理,DVC 則整合資料版控與實驗重現。
在這篇文章我們將介紹能針對訓練資料進行版控與前處理自動化工具:HPE ML Data Management (MLDM)。除了基本的資料版控以外,也能在原始資料內容有差異時,自動執行事先設定好的前處理程式碼,並對處理後的資料同樣也進行版控。首先從上述兩項重點功能切入,我們以股票的日成交資訊作為原始資料,進行技術指標計算的前處理,試著在 MLDM 做到資料版控和前處理的自動化。
實作
接著我們就實際使用 MLDM,對股票的歷史資料進行前處理,來計算出幾項技術指標,並善用其版控功能來還原不同版本的資料。在範例中我們從證交所下載元大台灣卓越50證券投資信託基金(就是臺灣老字號的 ETF 0050)的日成交資訊,來計算出幾個常用的技術指標,操作以下 6 個步驟:
- 建立 Project
- 建立 Pipeline
- 上傳資料到 Repository
- 自動執行前處理
- 還原到不同版本的資料
- 從 Repository 下載資料
在操作前請先到 GitHub 下載操作需要的檔案,並且依照 HPE MLDM 的安裝流程進行完整的安裝。
建立 Project
開啟瀏覽器,進入 http://localhost:80
(如果在安裝過程中,有將httpPort
設定為其他值,請將 80
改成實際使用的值)。畫面中看到的就是 MLDM console UI,也就是其提供的使用者介面(User Interface, UI),如下圖。
MLDM 有三個最重要,同時也是一定會使用的元素:
- Project:專案,一個 Project 底下可以有數個 Pipeline 以及 Repository,不過如果非企業版的用戶最多只能建立 16 個 Pipeline
- Pipeline:資料處理的流程,例如將圖片進行縮放、隨機旋轉等等的前處理,就是一個 Pipeline
- Repository:可進行版控的資料存放處,像是大家比較熟知的 GitHub repository,存放在裡面的資料都能進行版控
接著開啟終端機,輸入並執行以下指令:
(mldm) aif@aif % pachctl create project stock-price-preprocess
(mldm) aif@aif % pachctl config update context --project stock-price-preprocess
editing the currently active context "http://localhost:80"
接著回到 MLDM console UI 頁面,就會看到名為「stock-price-preprocess」的專案出現在畫面中,當然也可以透過按下 Console 頁面右上方的「Create Project」,透過圖形化介面來建立。
建立好 Project 之後,我們還需要建立一個名為「raw
」,用來存放原始資料的 Repository,建立方式如下:
(mldm) aif@aif % pachctl create repo raw
一樣回到 MLDM console UI,點擊「stock-price-preprocess」卡片右上方的「View Project」,在左側點一下「Repositories」,就能看到目前 Project 底下有哪些 Repository。左側欄位還有許多不同功能,比較常用的有:
- DAG:整個 Project 的流程圖,並且能自由的縮放以及平移,如果要展示給其他人看時很好用
- Create:建立 Repository 或 Pipeline
- Pipelines:列出全部的 Pipeline
- Repositories:列出全部的 Repository
建立 Pipeline
執行以下指令來建立 Pipeline:
(mldm) aif@aif % pachctl create pipeline -f preprocess.yaml
指令執行後不會輸出資訊,所以我們回到 MLDM console UI,在左側點一下「DAG」就會看到名為「preprocess
」的 Pipeline。每個 Pipeline 的卡片呈現了目前這個 Pipeline 的任務以及狀態,另外還有一個重要的「Output
」,專門用來存放這個 Pipeline 輸出的資料的 Repository,這個 Repository 也可以是其他 Pipeline 的輸入 Repository。
MLDM 的 Pipeline 藉由 JSON 或 YAML 檔來設定,例如指令的後段指定的「preprocess.yaml
」。我們看一下這份檔案的內容:
pipeline: # Pipeline 設定
name: preprocess # Pipeline 名稱
input: # 輸入資料的設定
pfs: # Pachyderm File System 的設定
repo: raw # 輸入的 Repository 名稱
glob: "/*" # 檔名的篩選邏輯,同 Python 的 glob 用法
transform: # 要做的前處理
image: yusiangwu/mldm-talib:1.0 # 使用的映像檔
cmd: # 要執行的指令與參數
- python
- /work/preprocess.py
autoscaling: true # 是否允許自動擴展
MLDM 也提供 Pachyderm Pipeline System (PPS) 對 Pipeline 進行版控,關於這方面的說明請見 MLDM 官方文件的「Intro to Pipelines」章節。
上傳資料到 Repository
先執行以下指令來將範例檔案 0050.csv
上傳到 Repository:
(mldm) aif@aif % pachctl create branch raw@v1 --head master
(mldm) aif@aif % pachctl put file raw@v1:0050.csv -f ./data/0050.csv
data/0050.csv 153.73 KB / 153.73 KB [==============================================================] 0s 0.00 b/s
(mldm) aif@aif % pachctl create branch raw@master --head v1
(mldm) aif@aif % pachctl create branch raw@v2 --head master
(mldm) aif@aif % pachctl put file raw@v2:0050.csv -f ./data/0050_new.csv
data/0050_new.csv 154.90 KB / 154.90 KB [==============================================================] 0s 0.00 b/s
(mldm) aif@aif % pachctl create branch raw@master --head v2
回到 MLDM console UI,進入 raw
Repository,點選「Commits」,進到這個 Repository 的 Commit 紀錄,會看到目前已經有 3 筆 Commit,分別是創建 Repository,上傳第一及第二版的 料,並且第二版的資料的 Branch 顯示為 v2
,且檔案大小和 v1
的有些微差異。
如果想調閱更多資訊,在每個 Commit 按下最右邊的「⋯」,點選「Inspect commit」,就能看到這個 Commit 更詳細的資訊。如下圖,這是 Commit 335c46ceae98476690789e473c7ab22a
的資訊,中央的欄位是檔案的更動狀況,右側主要是建立時間以及來源 Commit 的資訊。
自動執行前處理
MLDM 的另一個亮點功能,就是它能在其輸入 Repository 的內容有差異時,自動執行前處理任務。舉例來說,當我們更新原始資料,MLDM 就會自動啟動 Pipeline,使前處理工作更自動化。因此製作好新版本的資料後,只需將 master
分支的 HEAD
(就是指向目前所在位置的指標)移動到新版本的分支位置,Pipeline 就會自動啟動。
現在就來實際操作一次,MLDM 同樣使用 pachctl create branch
指令來建立或合併分支,例如我們想將 raw
Repository 更新到 v2
版本並執行前處理(Pipeline 只監控 master
分支,所以要執行 Pipeline 都需要合併回 master
),只需執行以下指令就可完成:
(mldm) aif@aif % pachctl create branch raw@master --head v2
接著馬上回到 MLDM console UI,會發現 preprocess
Pipeline 的狀態轉為 Created,代表 MLDM 正在建立容器,過了數秒後再轉為 Running,執行前處理程式。在使用上要留意,由於 Pipeline 執行前 MLDM 需要先建立容器,如果容器的映像檔較複雜,MLDM 可能需要較多時間建立。
還原到不同版本的資料
對於將資料還原到不同版本的需求,MLDM 提供完整的版控功能。在 Repository,資料的差異都能以 Commit 的形式追蹤,這點與大家常用的 Git 一樣,並且這些 Commmit 可以用分支(Branch)來管理,因此如果已經熟悉 Git 的操作,就能快速上手。
在上一個步驟我們已經製作出 v1
以及最新的 v2
版本,現在我們將資料還原到 v1
,也就是將 master
分支的 HEAD
指向 v1
:
(mldm) aif@aif % pachctl create branch raw@master --head v1
因為我們更改 master
分支的 HEAD
,使 raw
Repository 的內容有差異,因此會觸發 preprocess
Pipeline,其狀態再次轉為 Created,隨即轉為 Running。完成後 preprocess
Repository(這裡是存放 preprocess
Pipeline 處理後的資料),會出現新的 Commit,且檔案大小與初次執行 v1
版本時相符,如下圖。
從 Repository 下載資料
在訓練或部署階段時,或多或少都有從 Repository 下載資料的需求,MLDM 當然也提供了簡便的方式下載 Repository 上的資料。假如我們需要從preprocess
Repository 下載處理後的資料,執行以下指令即可將資料存放在本地端我們指定的路徑:
(mldm) aif@aif % pachctl get file preprocess@master:/0050.csv_processed.csv --output 0050.csv_processed.csv
當然,使用者也可以透過 MLDM console UI,從圖形化介面下載,即便是不熟悉指令列操作的使用者也能隨時存取資料。
總結
在這篇文章我們使用 HPE MLDM 來管理結構化資料,包含資料上傳、更新。版控功能的使用邏輯與 Git 類似,的確可以快速上手,雖然目前還無法在圖形界面上進行分支管理,僅能透過指令,但幾個常用指令打幾次之後就能記起來,不會有太大問題。另外,MLDM 提供 Jupyter Lab 外掛,使用 Jupyter 進行實驗時就能輕鬆切換不同版本資料。最後,MLDM 還有一項強大功能,就是與自家的 MLDE 組合,達到資料版控、前處理與模型超參數調整的自動化,意味著我們甚至可以將資料的前處理到推論,完全自動化,只要 Repository 裡面的資料有更新,便觸發 Pipeline 自動執行前處理,再輸出模型的預測結果,而每個團隊成員隨時都能透過 MLDM console UI 監控整個系統。在下一篇文章我們將帶大家結合 MLDM 與 MLDE 來實作卷積神經網路模型(Convolutional Neural Network)訓練,且從資料前處理到模型訓練,就只使用這兩項工具來完成。
參考資料
- MLOps 工具介紹(一):常見的三種模型實驗管理工具 /mlops-model-management-tools/
- Pachyderm Docs/Home/Latest/Get Started/First-Time Setup https://mldm.pachyderm.com/latest/get-started/first-time-setup/
- Pachyderm Docs/Home/Latest/Learn/Intro to Pipelines https://docs.pachyderm.com/latest/learn/intro-pipelines/
- 用 MLDE 平台實作 PyTorch 卷積神經網路模型 /hpe-mlde-unboxing1/
- Pachyderm Docs/Home/Latest/Integrate/JupyterLab https://docs.pachyderm.com/latest/integrate/jupyterlab-extension/
- Pachyderm Docs/Home/Latest/Integrate/Determined https://docs.pachyderm.com/latest/integrate/determined/
* 本篇文章由人工智慧科技基金會、HPE與AMD共同合作。