使用 MLflow 管理 Azure Machine Learning 中的模型登錄
Azure Machine Learning 支援連線到工作區時,用於模型管理的 MLflow。 這類方法是方便可針對熟悉 MLFlow 用戶端的使用者支援整個模型生命週期的方式。 下列文章說明不同的功能及其與其他選項的比較方式。
必要條件
安裝 MLflow SDK 套件
mlflow
和適用於 MLflowazureml-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
依特定屬性順序,例如 name
、 version
、 creation_timestamp
和 last_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_tag
和 remove_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 |
使用字串比較子 LIKE 和 ILIKE 搜尋已註冊的模型 |
✓ | ✓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 使用登錄在不同工作區之間移動模型,同時保留資料譜系。