使用 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
方法來整理特定屬性的輸出,例如 name
、 version
、 creation_timestamp
或 last_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 Machine Learning 不支援重新命名模型,因為模型物件不可變。
編輯模型描述和標籤
您可以使用 MLflow SDK 來編輯模型的描述和標籤:
client.update_model_version(model_name, version=1, description="My classifier description")
若要編輯標籤,請使用 set_model_version_tag
和 remove_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 |
使用字串比較子 LIKE 和 ILIKE 搜尋已登錄的模型 |
✓ | ✓ 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 使用 登錄 在不同工作區之間移動模型,並保留譜系。