Try   HackMD

基於容器的MLflow和模型版本控制

Table of Content


Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →
你也為了整理各種版本的資料以及模型所困擾嗎?

簡介

在機器學習以及深度學習的訓練和部屬場景中,經常我們會被非常多不同版本的資料集、訓練紀錄以及模型版本所困擾。過去Tensorboard以及一些基本的紀錄工具可以協助我們在一定程度上進行模型的效能的紀錄以及模型本身的版本化,但仍缺少一個非常完善的框架。在MLOps的概念中被提出的核心概念有兩項是關於資料以及模型的版本化和自動化管理,一個是資料版本控制(Data version control,DVC)以及模型版本控制(Model Version Control, MVC)。我們將在本文中介紹一個具有模型版本控制以及模型登錄(Model Registry)功能的工具——MLflow

MLflow

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

MLflow是一個開源、免費的機器學習生命週期管理工具。他提供的功能有:

  • 紀錄訓練中所使用的各項超參數以及結果 (MLflow Tracking)
  • 將訓練程式包裝成可重複、可重現的形式 (MLflow Project)
  • 基於不同的平台以及不同的框架來進行模型的佈屬 (MLflow Models)
  • 提供中心化的儲存/紀錄方案,包含模型登錄、模型版本控制以及模型標記等等功能 (MLflow Model Registry)

MLflow也提供在各種不同的程式語言和框架中使用的API,例如:

  • 程式語言

    • Python
    • R
    • Java
    • REST
  • 機器學習框架

    • Scikit-Learn
    • CatBoost
    • fastai
    • lightgbm
    • tensorflow
    • torch
    • spark
    • onnx

架設MLflow

前置規畫

在MLflow所提供的紀錄以及成品(artifacts)存放方案中,主要有以下幾種形式 :

  • 紀錄以及成品均存放在本機資料系統
  • 紀錄儲存於資料庫,成品存放於本機資料系統
  • 紀錄儲存於本機資料系統,成品存放於遠端伺服器
  • 紀錄以及成品均存放於遠端資料庫及伺服器

在此我們將採取最後一個選項,將參數以及結果紀錄於MySQL資料庫,並將成品以及模型紀錄於FTP伺服器。

資料庫架設(基於MySQL)

我們將利用MySQL官方所提供的Docker容器映像檔來建立一個MySQL資料庫。

將主機的3306埠與容器相連,並將資料庫的IP指定為0.0.0.0,再給定root的密碼,即可以快速地建立一個MySQL容器。

詳細設定如下方所示 :

額外掛載的兩個資料夾是為了將MySQL的資料儲存在實體的位置,避免容器關閉後遺失。資料夾內容將由MySQL資料庫自動寫入,使用者不需要預先放入任何內容。

資料庫設定

由於直接使用root帳號存取資料庫是相當危險的,所以必須要另外設定一個帳號,並給予這個帳號相對應的權限來進行資料庫操作。

新增用戶

我們可以用下方的SQL語法來新增一個用戶user

CREATE USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'passwd';

給予用戶權限

我們可以用下方的SQL語法來給予用戶user相應的權限:

GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';

建立資料庫

為了存放MLflow所傳送的資料,我們需要在MySQL資料庫中建立一個資料庫。以下的SQL語法將會建立一個名為mllfow_artifacts的資料庫:

CREATE DATABASE mlflow_artifacts;

成品存放伺服器架設(基於FTP)

基於Alpine是最輕量、最簡化的Docker映像檔,故我們選擇以Alpine為基礎搭配vsftpd來建立一個FTP伺服器。

詳細的Dockerfile如下方所示:

Dockerfile中有出現一個entrypoint.sh,這是一個包含了啟動vsftpd服務的腳本,詳細內容如下:

在上方的啟動腳本中,我們啟用了vsftpd的被動模式,並且宣告了相對應的被動連接埠;我們也開啟了寫入權限,讓來自MLflow的成品可以被正常的寫入到FTP伺服器之中。

MLflow伺服器架設

在前兩個章節,我們架設了MySQL資料庫以及FTP。接下來,我們將架設一個MLflow的伺服器。同樣的,我們將使用Docker容器來建立這個伺服器。

  • Python環境要求: python >= 3.8
  • 函式庫要求: 根據所使用的資料庫以及資料伺服器而定。(以MySQL為例,需要加裝mysqlclient函式庫)。

我們將使用Python的官方Docker容器映像檔來建構MLflow的伺服器。Dockerfile的設定如下:

同樣的,我們也準備了相對應的mlflow_entrypoint.sh來啟動MLflow的服務。將<ip>以及<port>換成MySQL以及FTP相對應的IP以及連接埠即可。

其中,命令的末兩個參數--backend-store-uri以及--default-artifact-root分別帶有以下的作用:

  • --backend-store-uri:宣告資料庫的連結位置。
  • --default-artifact-root:宣告成品存放伺服器的位置。

兩者的宣告方法均為<protocol>://<user>:<password>@<ip>:<port>/<path>

只要使用docker run指令利用上方的Dockerfile所建立的映像檔來產生一個容器,就可以建立一個MLflow的伺服器。使用者可以透過以下網址來連線到MLflow的網頁:

http://<ip>:3306/

使用Mlflow紀錄Scikit-learn訓練

接下來,我們可以使用一個簡單的範例來示範如何使用MLflow所提供的服務。

假設我們的MLflow服務架設在以下網址

http://192.168.0.10:9090

我們需要在Python程式碼中,導入mlflow模組,並透過mlflow.set_tracking_uri()來設定伺服器的位置,並利用mlflow.set_experiment()來設定這次實驗的名稱。在紀錄上,我們採用MLflow所提供的自動紀錄功能,mlflow.sklearn.autolog()會基於預設的行為進行紀錄,並將模型儲存至遠端資料伺服器。

利用以下的指令,執行上方的Python程式:

python mlflow_example_sklearn.py

將會得到以下結果:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

可以發現mlflow.sklearn.autolog()自動幫我們紀錄了MAE, MSE, 以及RMSE等結果,並且將模型儲存到了遠端的FTP伺服器。

結語

在本文中,我們介紹了如何利用Docker容器來建立MLflow以及其所需要的各個必要元素,同時也示範了如何利用MLflow紀錄模型的訓練結果以及模型本身。

附錄 —— 將MLflow紀錄儲存於本機

在先前的章節中,我們於mlflow_entrypoint.sh的中宣告的參數有--backend-store-uri以及--default-artifact-root,分別對應到了資料庫以及成品存放伺服器的連結位置。

如果要將成品以及訓練所紀錄的參數以及結果存放在本機的資料夾,則不需要特別架設MLflow伺服器。只需要在Python程式中利用MLflow的記錄功能,並直接執行即可。MLlfow將會在執行Python程式的資料夾中,新建一個mlruns資料夾,並將所有記錄、結果以及模型紀錄在其中。使用者只需要執行以下指令,就可以在http://localhost:5000/的位置連接到MLflow的網頁。

mlflow ui
tags: 技術隨筆 MLOps MLflow Model Version Control MySQL vsftpd