在上一篇我們已經完成MLFlow的安裝, 這篇我們就來說明如何在jupyter notebook裡整合MLFlow.
這次的範例可以在github下載 fastai_mnist_mlflow.ipynb
這次在notebook加上跟MLFlow 有關的部份, 說明如下:
安裝mlflow
!pip install mlflow
把MLflow import進來
# Import mlflow
import mlflow
設定MLFlow的主機位置
使用set_tracking_uri函式可以設定MLFlow server的主機位置, 因此可以跳脫個人單機使用, 當多人使用時也可以將不同訓練環境的結果記錄在同一台主機上, 這樣就容易比較不同人、時、地的訓練結果.
set_tracking_uri函式可以支援四種型式, 可以參考官網說明:
我們的例子之中, 使用HTTP server
, 輸入前一篇所安裝好的MLFlow server的IP與port
mlflow.set_tracking_uri("http://172.23.180.10:30534")
設定experiment的名稱
如果這個名稱不存在則會以這個名稱建立一個新的experiment
mlflow.set_experiment("fastai_mnist")
記錄訓練資料
原本我們執行訓練時是執行微調
learn.fine_tune, 為了要將每次設定的parameter、metrics記錄起來, 我們加入下列內容.
設定執行微調的 epoch2 數值
epochs = 1
設定staru run的名稱 "jack-run-1". 當團隊中多人同時針對Dataset進行模型的調校, 則需要請團隊成員為每次的設定給個名字, 這個名字可以讓團隊其他人了解是由誰執行的training
with mlflow.start_run(run_name="jack-run-1"):
再把epochs以參數的方式記錄起來
mlflow.log_param('epochs', epochs)
然後我們再執行一次微調
learn.fine_turn(epochs)
執行完微調之後, 我們需要取得metric的結果, 這樣我們才能知道每次微調的效果如何. 因為我們所設定的metric是accuracy, 我們以下列方式取得accuracy的數值
先從learn物件取出metrics的物件avgMetric, 而avgMetric是一個清單, 因為我們設定metric只有一項為accruacy, 所以使用 avgMetric[0]取出裝有accruary值的物件(accObject), 再由accObject.value.item()取出accuracy的值
avgMetric = learn.recorder.metrics
print(avgMetric) # a list
accOjbect = avgMetric[0]
print(accObject) # an object
print(accObject.value) # Tensor
print(accObject.value.item()) # float
然後我們再把accuracy記錄在metric中
mlflow.log_metric('accuracy', accObject.value.item())
MLFlow UI確認第一次的記錄結果
這時我們再去MLFlow UI上看一下, 這時可以看到我們已經將parameter與metric記錄起來.
調整參數後再執行一次
再來, 我們把epochs改為5, 像這樣.
ps:因為將epoch由1調為5, 預期accuracy數值會提高.
epochs = 5
那後再把 run name改為jack-run-2
再執行一次notebook的內容. 在MLFlow UI可以看到第二次的執行結果.
在預期中, accuracy由0.982上升一點點到0.993
這樣, 我們就完成使用MLflow將每次執行training的paramter與metric記錄起來,這樣我們可以很容易的看出每次改了什麼與結果如何, 就可以找出最適合的組合.
這個例子用很簡單的方式(只調epoch次數)說明如何使用MLFlow做記錄, 在真實的狀況下, 資料科學家需要調的參數會更多, 但基本的操作方式則大同小異.
https://www.mlflow.org/docs/latest/tracking.html