MLflow: 紀錄您 Train 步驟的平台

黃馨平
Jackycsie
Published in
7 min readMay 18, 2020

過往,我們在做機器學習時,總會碰到以下幾個問題。

  1. 我們在 train model 時,我們總是忘記選過那些超參數。
  2. 剛剛前一個 model 訓練的效果不錯,它的參數為何 ,想保留 model 又遭到覆蓋,只能重 train 。
  3. 過了幾週,我們想要重現前一次好的訓練結果,但是我們的資料集已經不見了。
  4. 當團隊在 co-work 時,是不是因為不同的環境導致有不同的結果出現 ?

這些問題,也困擾了我非常長一段段時間,而這些問題可能也困擾著你,或許這篇文章,會是您不錯的解決方案。

那這個工具的名字叫做 MLflow。

MLflow 是由 Databricks 開發而成,那 Databricks 旗下也開發了許多 amazing 的 工具,像是 Spark 也是由同一個創辦人開發而成的。

1. 環境 Demo

在本篇的分享中,將會在 container 中進行,另外也會在 jupyter 與 CLI 中分別分享,它們的結果。

2. 安裝 MLflow

pip3 install mlflow

3. 快速開始

首先我們使用官方建議的 code 來練練手。

  • 使用 python 執行 quick_start.py file.
  • 在 mnt 資料夾中,開啟 MLflow 服務。
mlflow server --host 0.0.0.0
  • 在網址列中輸入 server 的 ip 以及 port 號,例如 http://127.0.0.1:5000,本文用的是 5555 是因為我們是 docker 環境。

有開啟的畫面以及資料的話,代表成功了,若是沒有剛剛的執行結果,可能是您開啟的服務在錯誤的資料夾,跟 quick_start.py 同一層即可。

4. 訓練手寫識別

在這節,我們透過訓練手寫識別模型,並且調整它的超參數,跟大家分享如何快速上手 MLflow,看完馬上可以直接使用。

  • 變數參數化

下面的步驟我們會將幾項超參數,改為 MLflow 可以儲存 log 的方式去撰寫。

  1. Convolutional filter
  2. Kernel_size
  3. Max pooling
  4. Dropout
  5. Dense
  6. Batch_size
  7. Epochs
  • 訓練 model
python official_keras_mnist.py
  • 訓練完,連到剛剛的網站,就可以看到多了一個訓練結果與我們剛剛設定 model 時,用到的參數。
  • 點進去專案看實驗的細節。
  • 可以看到列出了非常詳細的參數內容,方便進行回推(回顧)。
  • 在往下滑可以看到,剛剛計算的 accuracy, loss 等等資訊。
  • 點進去看以後就可以查看剛剛訓練每一個步驟的細節。
  • 接著在回到上一頁,往下滑,可以看到環境設定,所使用的工具版本,儲存的 model ,model summary 細節資訊。

5. 比較模型

上述是我們的第一次 MNIST 訓練,在平常實戰中,我們相同的資料集會訓練非常多不同的超參數,但若本身沒有紀錄,根本不會確切地記得當初下的參數內容如何,本節來跟大家分享我對 mlflow 的心動的原因。

因此我們修改了參數 train 了第二個 model,可以從圖中看到我們的第二個結果明顯變差,但是我們只改了參數,這實我們可以回推到底是改了那些參數導致結果變差。

  • 點選(兩個或多個) checkbox,並且按 compare,即可做表格類型比較,黃色的就是我們跟前一個 model 不同的地方,透過這些不同的地方就可以快速回推,我們該如何重現或修改模型。
  • 看數據細節結果,可以更快速的知道,雖然 accuracy 落差蠻大,但是 val_accuracy 並無像 train data 差別如此之大。
  • 透過視覺化比較圖表。

Search bar

  • 我們可以像 Kibana 一樣,在 search bar 中快速過濾掉我們不想看的資訊。
metrics.val_accuracy > 0.96

組織化

可以看到,當我們有很多 model 需要訓練或者儲存時,只有一個 table,不但沒有增加理解度,反而把事情搞砸了,這邊想跟大家分享,當我們有好幾個 model 時,我們應該如何將每個 model 的訓練參數放到正確的 table 中。

  • 建立新的 experiment,您可以使用 CLI 或者是 GUI 建立。
mlflow experiments create --experiment-name sklearn_train
  • 接著預估會在哪個 experiment 跑實驗下 command 切換紀錄 table。
export MLFLOW_EXPERIMENT_NAME=sklearn_train
  • 跑 Training 實驗。
python sklearn_elasticNet.py
  • 可以看到切換紀錄 table 就是如此的輕鬆愜意。
  • Jupyter 上如何實做 MLflow 追蹤以及組織化的整理呢 ,在這當中有兩種做法。
  • 第一選擇想要跑的 experiment table 接著開啟 jupyter,在執行上述的程式,但這種方法過於麻煩。
  • 第二直接在 jupyter 上選擇想要跑的 experiment table,但小壞處是,所有的 log 必須自己寫儲存方式。
  • 最後,若是只想專注在 1 個 model ,其它儲存的東西都交給 MLflow 處理的話,那使用剛剛上述的 MNIST program 就可以再 jupyter 上執行。

下面的程式碼是介紹,第二種方法的 MLflow。

  • 透過上述的第二種方法,就可以使資料科學家快速的在 jupyter 調參,也可以達到我們希望自動記錄 MLflow log 的目標。
  • 最後小提醒,若是想要可以在 jupyter 上快速調參,記得複製我 ### 上下的 code ,在一個 cell ,在執行 shift + enter,不然它會把你的調參認為是前一份工作的事情,導致誤報。

MLflow 再探

  • 到這邊 Mlflow 初探大致上結束,其實 MLflow 還有非常多值得跟大家分享的特色,如實驗資料儲存 DB,data version control,不同版本 model 直接存取,超參數自動選擇儲存,選擇 Model 跑不同的環境等等。
  • 這篇的目標在於讓大家可以快速上手 MLflow ,之後再把上述說特色一個個補齊吧。

參考網址

感謝

本篇文的產生,還是需要感謝我們 team 願意讓我嘗試與部屬,另外也非常感謝 james 的 k8s ,快速的 training model ,讓我開始思考,如何更自動化,有效率的幫助自己快速釐清,我 train 了幾百個 model 之間,不同參數所代表的意義。

當 GPU 的運算力,是你的競爭力時,如何做出藍寶堅尼與布加迪之間的差別,就是我們工程師的能力了。

--

--

黃馨平
Jackycsie

閱讀本是尋常事,繁華靜處遇知音