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

Azure Machine Learning 支援連線到工作區時,用於模型管理的 MLflow。 這類方法是方便可針對熟悉 MLFlow 用戶端的使用者支援整個模型生命週期的方式。 下列文章說明不同的功能及其與其他選項的比較方式。

必要條件

  • 安裝 MLflow SDK 套件 mlflow 和適用於 MLflow azureml-mlflow 的 Azure Machine Learning 外掛程式。

    pip install mlflow azureml-mlflow
    

    提示

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

  • Azure Machine Learning 工作區。 您可以遵循建立機器學習資源教學課程來建立一個工作區。

  • 如果您要執行遠端追蹤 (也就是追蹤在 Azure Machine Learning 外部執行的實驗),請將 MLflow 設定為指向 Azure Machine Learning 工作區的追蹤 URI。 如需如何將 MLflow 連線至工作區的詳細資訊,請參閱設定適用於 Azure Machine Learning 的 MLflow

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

  • 某些作業可能會直接使用 MLflow Fluent API (mlflow.<method>) 來執行。 不過,其他作業可能需要建立 MLflow 用戶端,以允許在 MLflow 通訊協定中與 Azure Machine Learning 進行通訊。 您可以建立 MlflowClient 物件,如下所示。 本教學課程會使用物件 client 來參考這類 MLflow 用戶端。

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

在登錄中註冊新模型

模型登錄提供方便且集中的方式來管理工作區中的模型。 每個工作區都有自己獨立的模型登錄。 下一節說明使用 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"])

注意

MLflow 2.0 諮詢: 如果為舊版 Mlflow (<2.0),請改用 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 ML Studio 入口網站中,也無法使用 Azure ML SDK、Azure ML CLI 或 Azure ML REST API 來擷取。 目前不支援從指定的模型階段建立部署。

查詢模型階段

您可以使用 MLflow 用戶端來檢查模型的所有可能階段:

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

您可以透過從登錄取得模型,查看每個階段上的模型版本。 下列範例會取得目前在階段 Staging 中的模型版本。

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

注意

在 Mlflow 中,多個版本可以同時處於相同的階段,不過此方法會在所有版本之間傳回最新版本 (較高版本)。

警告

資料表名稱區分大小寫。

轉換模型

您可以使用 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 載入特定階段中的模型。 請注意,若要讓這個方法成功,您必須在工作的環境中安裝所有程式庫和相依性。

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

編輯和刪除模型

Mlflow 和 Azure ML 都支援編輯已註冊的模型。 不過,兩者還是有一些重要的差異值得注意:

警告

Azure Machine Learning 不支援重新命名模型,因為模型物件不可變。

編輯模型

您可以使用 Mlflow 從模型編輯模型的描述和標籤:

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")

移除標籤:

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

刪除模型的版本

您可以使用 MLflow 用戶端刪除登錄中的任何模型版本,如下列範例所示:

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

注意

Azure Machine Learning 不支援刪除整個模型容器。 若要達到相同的結果,您必須從指定的模型中刪除所有模型版本。

使用 MLflow 支援用於管理模型的矩陣

MLflow 用戶端會公開數種擷取和管理模型的方法。 下列資料表顯示連線到 Azure ML 時,MLflow 目前支援哪些方法。 其也會與 Azure ML 中的其他模型管理功能進行比較。

功能 MLflow 具有 MLflow 的 Azure ML Azure ML CLIv2 Azure ML 工作室
以 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 ML 中的不可變物件。
  • 4 在 Azure ML Studio 中使用搜尋方塊。 支援部分比對。
  • 5 使用登錄在不同工作區之間移動模型,同時保留資料譜系。

下一步