使用 MLflow 記錄、載入、註冊和部署模型

MLflow 模型是封裝機器學習模型的標準格式,可用於各種下游工具,例如 Apache Spark 上的批次推斷,或透過 REST API 提供即時服務。 此格式會定義一個慣例,可讓你將模型儲存在不同的變體中(python-function、pytorch、sklearn 等等),不同的模型服務和推論平台皆可理解。

如果要瞭解如何記錄和評分串流模型,請參閱如何儲存和載入串流模型

記錄和載入模型

當你記錄模型時,MLflow 會自動記錄 requirements.txtconda.yaml 檔案。 你可以使用這些檔案重新建立模型開發環境,並使用 virtualenv(建議)或 conda 重新安裝相依性。

重要

Anaconda Inc. 已更新其 anaconda.org 頻道的服務條款。 根據新服務條款,如果你依賴 Anaconda 的套件和散發,你可能需要商業授權。 如需詳細資訊,請參閱 Anaconda 商業版本常見問題集。 你使用任何 Anaconda 通道都會受到其服務條款的規範。

在 v1.18 之前記錄的 MLflow 模型(Databricks 執行階段 8.3 ML 或更早版本)預設會以 conda defaults 頻道(https://repo.anaconda.com/pkgs/)記錄為相依性。 由於此授權變更,針對使用 MLflow v1.18 與更高本記錄的模型 Databricks 已停止使用 defaults 頻道。 預設記錄頻道現為 conda-forge,指向社群管理的 https://conda-forge.org/

如果你在 MLflow v1.18 之前記錄模型,但未從模型的 conda 環境排除 defaults 頻道,則該模型可能在 defaults 頻道具有你或未預期的相依性。 如果要手動確認模型是否具有此相依性,你可以針對以記錄模型封裝的 conda.yaml 檔案檢查其 channel 值。 例如,具有 defaults 頻道相依性的 conda.yaml 模型可能如下所示:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

由於 Databricks 無法判斷你與 Anaconda 的關係是否允許使用 Anaconda 存放庫來與模型互動,因此 Databricks 不會強制客戶進行任何變更。 如果 Anaconda 條款允許你透過 Databricks 使用 Anaconda.com 存放庫,則你無需採取任何動作。

如果你想要變更模型環境所用的頻道,你可以使用新 conda.yaml 重新註冊模型至模型登錄。 你可以藉由在 log_model() 的參數 conda_env 指定頻道來執行此動作。

如需 log_model() API 的詳細資訊,請參閱你正在使用模型類別的 MLflow 文件,例如 scikit-learn 的 log_model

如需 conda.yaml 檔案的詳細資訊,請參閱 MLflow 文件

API 命令

如果要將模型記錄至 MLflow 追蹤伺服器,請使用 mlflow.<model-type>.log_model(model, ...)

如果要載入先前記錄的模型,以進行推斷或進一步開發,請使用 mlflow.<model-type>.load_model(modelpath),其中 modelpath 需為下列其中一項:

  • 執行相對路徑(例如 runs:/{run_id}/{model-path}
  • DBFS 路徑
  • 已註冊的模型路徑(例如 models:/{model_name}/{model_stage})。

如需載入 MLflow 模型之選項的完整清單,請參閱 MLflow 文件的參考成品。

Python MLflow 模型可透過另一個選項來使用 mlflow.pyfunc.load_model() 將模型以泛型 Python 函式的形式載入。 你可以使用下列程式碼片段來載入模型並為資料點評分。

model = mlflow.pyfunc.load_model(model_path)
model.predict(model_input)

或者,你可以將模型以 Apache Spark UDF 匯出,以用於在 Spark 叢集上評分,以作為批次作業或即時 Spark 串流作業。

# load input data table as a Spark DataFrame
input_data = spark.table(input_table_name)
model_udf = mlflow.pyfunc.spark_udf(spark, model_path)
df = input_data.withColumn("prediction", model_udf())

記錄模型相依性

如果要正確載入模型,你應該確定模型相依性已使用正確的版本載入筆記本環境。 在 Databricks Runtime 10.5 ML 和更新版本中,若 MLflow 在目前環境與模型相依性之間偵測到不相符,便會警告你。

Databricks Runtime 11.0 ML 和更新版本包含可簡化還原模型相依性的其他功能。 在 Databricks Runtime 11.0 ML 和更新版本中,針對 pyfunc 變體模型,你可以呼叫 mlflow.pyfunc.get_model_dependencies 來擷取和下載模型相依性。 此函式會傳回相依性檔案的路徑,然後你可以使用 %pip install <file-path> 進行安裝。 當你將模型以 PySpark UDF 的形式載入時,請在 mlflow.pyfunc.spark_udf 呼叫中指定 env_manager="virtualenv"。 這會還原 PySpark UDF 內容中的模型相依性,而且不會影響外部環境。

你也可以手動安裝 MLflow 1.25.0 版或更新版本,在 Databricks Runtime 10.5 或更新版本中使用此功能:

%pip install "mlflow>=1.25.0"

如需有關如何記錄模型相依性(Python 和非 Python)和成品的其他資訊,請參閱記錄模型相依性

瞭解如何記錄模型相依性,以及模型服務的自訂成品:

MLflow UI 中自動產生的程式碼片段

當你在 Azure Databricks 筆記本中記錄模型時,Azure Databricks 會自動產生程式碼片段,以便複製及用來載入和執行模型。 如果要檢視這些程式碼片段:

  1. 瀏覽至 [執行] 畫面,以取得產生模型的執行。 (請參閱檢視筆記本實驗,瞭解如何顯示 [執行] 畫面。)
  2. 捲動至 [成品] 區段。
  3. 按下記錄的模型名稱。 右側面板將隨即開啟,其中顯示可用來載入記錄模型的程式碼,並在 Spark 或 pandas DataFrame 上做出預測。

成品面板程式碼片段

範例

如需記錄模型的範例,請參閱追蹤機器學習訓練回合範例中的範例。 如需載入記錄模型以進行推斷的範例,請參閱模型推斷範例

在模型登錄中註冊模型

你可以在 MLflow 模型登錄中註冊模型,這是一個集中式模型存放區,可提供 UI 和一組 API 來管理 MLflow 模型的完整生命週期。 如需如何使用模型登錄來管理 Databricks Unity 目錄中模型的指示,請參閱在 Unity 目錄中管理模型生命週期。 如果要使用工作區模型登錄,請參閱使用工作區模型登錄管理模型生命週期(舊版)。

要使用 API 註冊模型,請使用 mlflow.register_model("runs:/{run_id}/{model-path}", "{registered-model-name}")

將模型儲存至 DBFS

如果要在本機儲存模型,請使用 mlflow.<model-type>.save_model(model, modelpath)modelpath 必須是 DBFS 路徑。 例如,如果你使用 DBFS 位置 dbfs:/my_project_models 來儲存專案工作,則必須使用模型路徑 /dbfs/my_project_models

modelpath = "/dbfs/my_project_models/model-%f-%f" % (alpha, l1_ratio)
mlflow.sklearn.save_model(lr, modelpath)

針對 MLlib 模型,請使用 ML 管線

下載模型成品。

你可以使用各種 API 下載已註冊模型的記錄模型成品(例如模型檔案、繪圖和計量)。

Python API 範例:

from mlflow.store.artifact.models_artifact_repo import ModelsArtifactRepository

model_uri = MlflowClient.get_model_version_download_uri(model_name, model_version)
ModelsArtifactRepository(model_uri).download_artifacts(artifact_path="")

Java API 範例:

MlflowClient mlflowClient = new MlflowClient();
// Get the model URI for a registered model version.
String modelURI = mlflowClient.getModelVersionDownloadUri(modelName, modelVersion);

// Or download the model artifacts directly.
File modelFile = mlflowClient.downloadModelVersion(modelName, modelVersion);

CLI 命令範例:

mlflow artifacts download --artifact-uri models:/<name>/<version|stage>

部署線上服務的模型

你可以使用模型服務,將模型登錄中的機器學習模型裝載為 REST 端點。 這些端點會根據模型版本及其階段的可用性自動更新。

你也可以使用 MLflow 的內建部署工具,將模型部署到第三方服務架構。 請參閱下列範例。