部署 MLflow 模型的指導方針

適用於:Azure CLI ml 延伸模組 v2 (目前)

在此文章中,了解如何將 MLflow (英文) 模型部署至 Azure Machine Learning 以用於即時和批次推斷,以及您可用來管理部署的各種工具。

無程式碼部署

當您將 MLflow 模型部署至 Azure Machine Learning 時,與自訂模型部署不同,您不需提供評分指令碼或環境。 Azure Machine Learning 會自動為您產生評分指令碼和環境。 這項功能稱為無程式碼部署

針對無程式碼部署,Azure Machine Learning:

  • 確保符合 MLflow 模型中指出的所有套件相依性。
  • 提供包含下列項目的 MLflow 基礎映像或策展環境:
    • Azure Machine Learning 執行推斷所需套件,包括 mlflow-skinny
    • 用於執行推斷的評分指令碼。

提示

沒有公用網路存取的工作區:您必須先封裝模型 (預覽版),才能將 MLflow 模型部署至沒有輸出連線能力的線上端點。 透過模型封裝,可避免網際網路連線需求,否則 Azure Machine Learning 需要網際網路連線來動態安裝 MLflow 模型所需的 Python 套件。

套件和相依性

Azure Machine Learning 會自動產生環境,以在 MLflow 模型上執行推斷。 為了組建環境,Azure Machine Learning 會讀取 MLflow 模型中指定的 conda 相依性,並新增執行推斷伺服器所需的任何套件。 這些額外套件會根據部署類型而有所不同。

下列範例 conda.yaml 檔案顯示 MLflow 模型中指定的 conda 相依性。

channels:
- conda-forge
dependencies:
- python=3.10.11
- pip<=23.1.2
- pip:
  - mlflow==2.7.1
  - cloudpickle==1.6.0
  - dataclasses==0.6
  - lz4==4.0.0
  - numpy==1.23.5
  - packaging==23.0
  - psutil==5.9.0
  - pyyaml==6.0
  - scikit-learn==1.1.2
  - scipy==1.10.1
  - uuid==1.30
name: mlflow-env

重要

MLflow 會在記錄模型時自動偵測套件,並在模型的 conda 相依性中釘選套件版本。 此自動套件偵測可能不會反映您的意圖或需求。 您也可以記錄具有自訂簽章、環境或範例的模型

具有簽章的模型

MLflow 模型可能包含簽章,指出預期輸入及其類型。 將這類模型部署至線上或批次端點時,Azure Machine Learning 會確保資料輸入的數目和類型與簽章相符。 如果輸入資料無法如預期般剖析,模型叫用就會失敗。

您可以開啟 MLmodel 檔案來檢查 MLflow 模型簽章。 如需簽章如何在 MLflow 中運作的詳細資訊,請參閱 MLflow 中的簽章

下列範例 MLmodel 檔案會重點說明 signature

artifact_path: model
flavors:
  python_function:
    env:
      conda: conda.yaml
      virtualenv: python_env.yaml
    loader_module: mlflow.sklearn
    model_path: model.pkl
    predict_fn: predict
    python_version: 3.10.11
  sklearn:
    code: null
    pickled_model: model.pkl
    serialization_format: cloudpickle
    sklearn_version: 1.1.2
mlflow_version: 2.7.1
model_uuid: 3f725f3264314c02808dd99d5e5b2781
run_id: 70f15bab-cf98-48f1-a2ea-9ad2108c28cd
signature:
  inputs: '[{"name": "age", "type": "double"}, {"name": "sex", "type": "double"},
    {"name": "bmi", "type": "double"}, {"name": "bp", "type": "double"}, {"name":
    "s1", "type": "double"}, {"name": "s2", "type": "double"}, {"name": "s3", "type":
    "double"}, {"name": "s4", "type": "double"}, {"name": "s5", "type": "double"},
    {"name": "s6", "type": "double"}]'
  outputs: '[{"type": "double"}]'

提示

建議使用 MLflow 模型中的簽章,因為其可讓您更方便地偵測資料相容性問題。 如需如何使用簽章記錄模型的詳細資訊,請參閱使用自訂簽章、環境或範例記錄模型

MLflow 內建伺服器中的部署與 Azure Machine Learning 推斷伺服器中的部署

模型開發人員可以使用 MLflow 內建部署工具,在本機測試模型。 例如,您可以使用 mlflow models serve 或 MLflow CLI mlflow models predict,執行在 MLflow 伺服器登錄中註冊的模型本機執行個體。 如需 MLflow 內建部署工具的詳細資訊,請參閱 MLflow 文件中的內建部署工具

Azure Machine Learning 也支援將模型部署至線上和批次端點。 這些端點執行支援不同功能的各種推斷技術。

  • Azure Machine Learning 線上端點類似於 MLflow 內建伺服器,提供可調整、同步、輕量型的方式來執行模型以進行推斷。

  • Azure Machine Learning 批次端點能夠在長時間執行的推斷流程中執行非同步推斷,而這類流程可調整來因應大量資料。 MLflow 伺服器缺乏此功能,但您可以使用 Spark 作業 (英文) 來實現類似功能。 若要深入了解批次端點和 MLflow 模型,請參閱在批次部署中使用 MLflow 模型

輸入格式

下表顯示 MLflow 內建伺服器與 Azure Machine Learning 線上端點所支援的輸入類型。

Input type MLflow 內建伺服器 Azure Machine Learning 線上端點
分割方向中的 JSON 序列化 pandas DataFrames
記錄方向中的 JSON 序列化 pandas DataFrames 已取代
CSV 序列化的 pandas DataFrames 使用批次推斷。 如需詳細資訊,請參閱將 MLflow 模型部署至批次端點
TensorFlow 輸入為 JSON 序列化清單 (張量) 和清單的字典 (具名張量)
使用 TensorFlow 服務 API 的 TensorFlow 輸入

下列各節將著重於部署至 Azure Machine Learning 線上端點的 MLflow 模型。

輸入結構

不論輸入類型為何,Azure Machine Learning 都要求您在字典索引鍵 input_data 中以 JSON 承載形式提供輸入。 當您使用命令 mlflow models serve 來提供模型時不需要此索引鍵,因此無法針對 Azure Machine Learning 線上端點和 MLflow 內建伺服器交替使用承載。

重要

MLflow 2.0 中的承載結構已變更。

下列承載範例說明部署在 MLflow 內建伺服器與 Azure Machine Learning 推斷伺服器之模型間的差異。

分割方向中的 JSON 序列化 Pandas DataFrame

{
    "input_data": {
        "columns": [
            "age", "sex", "trestbps", "chol", "fbs", "restecg", "thalach", "exang", "oldpeak", "slope", "ca", "thal"
        ],
        "index": [1],
        "data": [
            [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
        ]
    }
}

張量輸入

{
    "input_data": [
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
          [1, 1, 0, 233, 1, 2, 150, 0, 2.3, 3, 0, 2],
          [1, 1, 145, 233, 1, 2, 150, 0, 2.3, 3, 0, 2]
    ]
}

具名張量輸入

{
    "input_data": {
        "tokens": [
          [0, 655, 85, 5, 23, 84, 23, 52, 856, 5, 23, 1]
        ],
        "mask": [
          [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0]
        ]
    }
}

針對 MLflow 模型進行推斷自訂

評分指令碼會自訂如何針對自訂模型執行推斷。 但是,對於 MLflow 模型部署,模型產生器會決定推斷執行方法,而不是由部署工程師決定。 每個模型架構都會自動套用特定的推斷常式。

若您需要變更 MLflow 模型的推斷執行方式,可執行下列兩項動作之一:

  • 變更模型在定型常式中的記錄方式。
  • 在部署階段使用評分指令碼自訂推斷。

變更模型在定型期間的記錄方式

當您使用 mlflow.autologmlflow.<flavor>.log_model 記錄模型時,針對模型使用的變體會決定推斷執行方法,以及傳回的結果。 MLflow 不會依 predict() 函數產生結果的方式強制執行任何特定行為。

在某些情況下,可以在執行模型之前和之後進行一些前置處理或後續處理。 或者,您可以變更傳回的內容;例如,機率 (而非類別)。 其中一個解決方案是實作機器學習管線,以從輸入直接移至輸出。

例如,sklearn.pipeline.Pipelinepyspark.ml.Pipeline 是實作管線的熱門方式,有時出於效能因素而建議使用。 您也可以記錄自訂模型來自訂模型推斷方式。

使用評分指令碼自訂推斷

儘管 MLflow 模型不需要評分指令碼,您仍可在必要時加以提供,以針對 MLflow 模型自訂推斷執行。 如需如何自訂推斷的詳細資訊,請參閱自訂 MLflow 模型部署 (英文) (適用於線上端點) 或使用評分指令碼自訂 MLflow 模型部署 (英文) (適用於批次端點)。

重要

若您選擇指定 MLflow 模型部署的評分指令碼,也須提供部署的環境。

部署工具

Azure Machine Learning 提供下列工具來將 MLflow 模型部署至線上和批次端點:

每個工具都有不同的功能,特別是其可鎖定的計算類型。 下表顯示對不同 MLflow 部署案例的支援。

案例 MLflow SDK Azure Machine Learning CLI/SDK 或工作室
部署至受控線上端點1 支援。 請參閱 MLflow 模型漸進式推出至線上端點 (英文) 支援。 請參閱將 MLflow 模型部署至線上端點 (英文)
使用評分指令碼部署至受控線上端點 不支援3 支援。 請參閱自訂 MLflow 模型部署 (英文)
部署至批次端點 不支援3 支援。 請參閱在批次部署中使用 MLflow 模型 (英文)
使用評分指令碼部署至批次端點 不支援3 支援。 請參閱使用評分指令碼自訂模型部署 (英文)
部署至 Azure 容器執行個體或 Azure Kubernetes Service (AKS) 等 Web 服務 舊版支援2 不支援2
使用評分指令碼部署至容器執行個體或 AKS 等 Web 服務 不支援3 舊版支援2

1 部署至已啟用私人連結的工作區中線上端點時,您必須在部署 (預覽) 之前封裝模型

2 視需要切換至受控線上端點 (英文)。

3 開放原始碼 MLflow 沒有評分指令碼的概念,且目前不支援批次執行。

選擇部署工具

若符合下列情況,請使用 MLflow SDK:

  • 您已熟悉 MLflow,且想要繼續使用相同的方法,且
  • 您正在使用原生支援 MLflow 的平台 (例如 Azure Databricks)。

若符合下列情況,請使用適用於 Python 的 Azure Machine Learning CLI v2 或 SDK:

  • 您很熟悉它們,或
  • 您想要使用管線來將部署自動化,或
  • 您想要將部署設定保留在 Git 存放庫中。

若您想要快速部署並測試使用 MLflow 訓練的模型,請使用 Azure Machine Learning 工作室 UI。