過往,我們在做機器學習時,總會碰到以下幾個問題。
- 我們在 train model 時,我們總是忘記選過那些超參數。
- 剛剛前一個 model 訓練的效果不錯,它的參數為何 ,想保留 model 又遭到覆蓋,只能重 train 。
- 過了幾週,我們想要重現前一次好的訓練結果,但是我們的資料集已經不見了。
- 當團隊在 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 的方式去撰寫。
- Convolutional filter
- Kernel_size
- Max pooling
- Dropout
- Dense
- Batch_size
- 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 ,之後再把上述說特色一個個補齊吧。