共用方式為


使用 MLflow 管理 Azure Machine Learning 中的模型登錄

Azure Machine Learning 支援連線到工作區時,用於模型管理的 MLflow。 這是方便可針對熟悉 MLFlow 用戶端的使用者支援整個模型生命週期的方式。

本文說明使用 MLflow 管理模型登錄的功能,以及此方法與其他管理選項的比較結果。

必要條件

  • 安裝 MLflow SDK mlflow 套件和適用於 MLflow 的 Azure 機器學習 azureml-mlflow 外掛程式,如下所示:

    pip install mlflow azureml-mlflow
    

    提示

    您可使用 mlflow-skinny 套件,這是輕量型 MLflow 套件,沒有 SQL 儲存體、伺服器、UI 或資料科學相依性。 對於主要需要 MLflow 追蹤和記錄功能的使用者,而不需匯入完整的功能套件,包括部署,建議使用此套件。

  • 建立 Azure Machine Learning 工作區。 若要建立工作區,請參閱 建立您需要開始使用的資源。 檢閱您在工作區中執行 MLflow 作業所需的存取權限

  • 若要執行遠程追蹤,或追蹤在 Azure 機器學習 外部執行的實驗,請將 MLflow 設定為指向 Azure 機器學習 工作區的追蹤 URI。 如需如何將 MLflow 連線至工作區的詳細資訊,請參閱設定適用於 Azure Machine Learning 的 MLflow

  • 本文中的程序會使用 client 物件來參考 MLflow 用戶端。

    某些作業會直接使用 MLflow Fluent API (mlflow.<method>) 來執行。 其他作業需要 MLflow 用戶端,才能在 MLflow 通訊協定中啟用與 Machine Learning 的通訊。 下列程式碼會建立 MlflowClient 物件:

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

限制

  • Azure Machine Learning 不支援重新命名模型。

  • Machine Learning 不支援刪除整個模型容器。

  • 組織登錄不支援使用 MLflow 的模型管理。

  • Machine Learning 目前不支援從特定模型階段部署模型。

  • Machine Learning 目前不支援跨工作區作業。

註冊新模型

模型登錄提供方便且集中的方式來管理工作區中的模型。 每個工作區都有自己獨立的模型登錄。 下列各節示範兩種方式,您可以使用 MLflow SDK 在登錄中登錄模型。

從現有的執行建立模型

如果您在執行內記錄 MLflow 模型,而且您想要在登錄中註冊,請使用執行識別碼和記錄模型的路徑來執行此動作。 您可以依照 管理實驗中的指示,並使用 MLflow 執行,以查詢此資訊。

mlflow.register_model(f"runs:/{run_id}/{artifact_path}", model_name)

注意

模型只能在追蹤執行所在的相同工作區中註冊至登錄。 Azure Machine Learning 目前不支援跨工作區作業。

提示

從執行或使用執行內的 mlflow.<flavor>.log_model 方法登錄模型。 此方法會保留產生資產之工作的資料譜系。

從資產建立模型

如果您有具有 MLModel MLflow 模型的資料夾,則可以將其直接進行登錄。 模型不需要永遠在執行的內容中。 您可以對這個方法使用 URI 結構描述 file://path/to/model 來註冊儲存在本機檔案系統中的 MLflow 模型。

下列程式代碼會使用 scikit-learn 套件來建立簡單的模型,並將模型以 MLflow 格式儲存在本機存放區:

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

mlflow.sklearn.save_model(reg, "./regressor")

提示

save_model() 方法的運作方式與 log_model() 方法相同。 雖然 log_model() 方法會將模型儲存在作用中的執行中,但 save_model() 方法會使用本機文件系統來儲存模型。

下列程式碼會使用本機路徑來登錄模型:

import os

model_local_path = os.path.abspath("./regressor")
mlflow.register_model(f"file://{model_local_path}", "local-model-test")

查詢模型登錄

您可以使用 MLflow SDK 來查詢和搜尋登錄中註冊的模型。 下列各節示範兩種查詢模型的方式。

查詢登錄中的所有模型

您可以使用 MLflow 用戶端來查詢登錄中所有已登錄的模型。

下列程式碼會列印登錄裡所有模型的名稱:

for model in client.search_registered_models():
    print(f"{model.name}")

使用 order_by 方法來整理特定屬性的輸出,例如 nameversioncreation_timestamplast_updated_timestamp

client.search_registered_models(order_by=["name ASC"])

注意

對於 2.0 之前的 MLflow 版本,請改用 MlflowClient.list_registered_models() 方法。

取得特定模型版本

search_registered_models() 方法會擷取包含所有模型版本的模型物件。 您可以使用 get_registered_model() 來取得指定模型的上一個已登錄模型版本:

client.get_registered_model(model_name)

請使用下列程序碼以取得特定版本的模型:

client.get_model_version(model_name, version=2)

從登錄載入模型

您可以直接從登錄載入模型,以還原記錄的模型物件。 針對這項工作,請使用函式 mlflow.<flavor>.load_model()mlflow.pyfunc.load_model() ,並指出要載入之模型的 URI。

您可以使用下列語法來實作這些函式:

  • models:/<model-name>/latest:載入模型的上一個版本。
  • models:/<model-name>/<version-number>:載入特定版本的模型。
  • models:/<model-name>/<stage-name>:在模型的特定階段載入特定版本。 如需詳細資訊,請參閱 使用模型階段

若要瞭解函式 mlflow.<flavor>.load_model()mlflow.pyfunc.load_model() 之間的差異,請參閱 載入 MLflow 模型的工作流程

使用模型階段

MLflow 支援模型管理模型生命周期的階段。 模型版本可以從某個階段轉換到另一個階段。 會指派階段給模型的特定版本。 模型在不同階段可以有多個版本。

重要

只能使用 MLflow SDK 來存取階段。 Azure Machine Learning 工作室 中看不到它們。 無法使用 Azure Machine Learning SDK、Azure Machine Learning CLI 或 Azure Machine Learning REST API 來擷取階段。 目前不支援從特定模型階段進行部署。

查詢模型階段

下列程式碼會使用 MLflow 用戶端來檢查模型的所有可能階段:

client.get_model_version_stages(model_name, version="latest")

您可以從登錄擷取模型,以查看每個模型階段的模型版本。 下列程式碼會取得目前處於 Staging 階段的模型版本:

client.get_latest_versions(model_name, stages=["Staging"])

多個模型版本可以在 MLflow 中同時處於相同階段。 在上一個範例中,方法會在階段的所有版本之間傳回最新的 (最新版本) 版本。

重要

在 MLflow SDK 中,階段名稱會區分大小寫。

轉換模型版本

您可以使用 MLflow 用戶端,將模型的版本轉換為特定階段:

client.transition_model_version_stage(model_name, version=3, stage="Staging")

當您將模型版本轉換為特定階段時,如果階段已經有其他模型版本,則現有版本會保持不變。 預設會套用這個行為。

另一種方法是在轉換期間設定 archive_existing_versions=True 參數。 此方法會指示 MLflow 將任何現有的模型版本移至階段 Archived

client.transition_model_version_stage(
    model_name, version=3, stage="Staging", archive_existing_versions=True
)

從階段載入模型

您可以使用 load_model 函式和下列 URI 格式,直接從 Python 載入特定階段中的模型。 若要讓此方法成功,所有連結庫和相依性都必須安裝在您的工作環境中。

Staging 階段載入模型:

model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")

編輯和刪除模型

MLflow 和 Azure Machine Learning 都支援編輯已登錄的模型,但有一些重要的差異。 下列各節會說明這些選項。

注意

Azure 機器學習 不支援重新命名模型,因為模型物件是不可變的。

編輯模型描述和標籤

您可以使用 MLflow SDK 來編輯模型的描述和標籤:

client.update_model_version(model_name, version=1, description="My classifier description")

若要編輯標籤,請使用 set_model_version_tagremove_model_version_tag 方法:

client.set_model_version_tag(model_name, version="1", key="type", value="classification")

若要移除標籤,請使用 delete_model_version_tag 方法:

client.delete_model_version_tag(model_name, version="1", key="type")

刪除模型版本

您可以使用 MLflow 用戶端刪除登錄中的任何模型版本:

client.delete_model_version(model_name, version="2")

注意

Machine Learning 不支援刪除整個模型容器。 若要達成這項工作,請刪除指定模型的所有模型版本。

檢閱管理模型的支援功能

MLflow 用戶端會公開數種擷取和管理模型的方法。 下表列出連線至 Azure Machine Learning 時,MLflow 目前支援的方法。 下表也會比較 MLflow 與 Azure Machine Learning 中的其他模型管理功能。


功能描述
僅限 MLflow 搭配 MLflow 進行機器學習 Machine Learning CLI v2 Machine Learning 工作室
以 MLflow 格式登錄模型
以非 MLflow 格式登錄模型
從執行輸出/成品登錄模型 1 2
在不同的追蹤伺服器/工作區中從執行輸出/成品登錄模型 5 5
依標籤搜尋/列出已註冊的模型
擷取已登註冊型版本的詳細資料
編輯已登錄的模型版本描述
編輯已登錄的模型版本標籤
重新命名已登錄的模型 3 3 3
刪除已登錄的模型 (容器) 3 3 3
刪除已登錄的模型版本
管理 MLflow 模型階段
依名稱搜尋已註冊的模型 4
使用字串比較子 LIKEILIKE 搜尋已登錄的模型 4
依標籤搜尋已註冊的模型 4
組織登錄支援

表格註腳:

  • 1 使用格式 runs:/<ruin-id>/<path> 的統一資源識別元 (URI)。
  • 2 使用格式 azureml://jobs/<job-id>/outputs/artifacts/<path> 的 URI。
  • 3 已登錄的模型是 Azure Machine Learning 中的不可變物件。
  • 4 在 Azure Machine Learning 工作室中使用搜尋方塊。 支援 部分比對。
  • 5 使用 登錄 在不同工作區之間移動模型,並保留譜系。