部署 MLflow 模型的指導方針

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

在本文中,了解如何將 MLflow 模型部署至 Azure Machine Learning 以用於即時和批次推斷。 另請深入了解可用於管理部署的不同工具。

部署 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 套件。

Python 套件和相依性

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

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

conda.yaml

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 相依性中釘選套件版本。 不過,此自動封裝偵測不一定能反映您的意圖或需求。 在這種情況下,請考慮使用自訂 conda 相依性定義記錄模型

使用帶有簽章模型的影響

MLflow 模型可能包含簽章,指出預期輸入及其類型。 當此類模型部署至線上或批次端點時,Azure Machine Learning 會強制資料輸入的數目和類型符合簽章。 如果輸入資料無法如預期剖析,模型呼叫將會失敗。

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

下列檔案顯示與 MLflow 模型相關聯的 MLmodel 檔案。

MLmodel

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 模型中的簽章為選用項目,但強烈建議使用,因為可讓您更方便地及早偵測資料相容性問題。 如需如何使用簽章記錄模型的詳細資訊,請參閱使用自訂簽章、環境或範例記錄模型

部署在 Azure Machine Learning 中的模型與部署在 MLflow 內建伺服器中的模型

MLflow 包含內建部署工具,可讓開發人員用於本機測試模型。 例如,您可以使用 mlflow models serve -m my_model 或使用 MLflow CLI mlflow models predict,執行在 MLflow 伺服器登錄中註冊的模型本機執行個體。

使用批次與線上端點推斷

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

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

另一方面,批次端點能夠在長時間執行的推斷流程中執行異步推斷,而此流程可調整因應大量資料。 MLflow 伺服器目前不支援此功能,不過只要使用 Spark 作業即可實現類似功能。 若要深入了解批次端點和 MLflow 模型,請參閱在批次部署中使用 MLflow 模型

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

輸入格式

Input type MLflow 內建伺服器 Azure Machine Learning 線上端點
分割方向中的 JSON 序列化 pandas DataFrames
記錄方向中的 JSON 序列化 pandas DataFrames 已取代
CSV 序列化的 pandas DataFrames 使用批次 1
張量輸入格式為 JSON 序列化清單 (張量) 和清單的字典 (具名張量)
在 TF 服務的 API 中格式化為張量輸入

1 考慮使用批次推斷處理檔案。 如需詳細資訊,請參閱將 MLflow 模型部署至批次端點

輸入結構

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

重要

MLflow 2.0 諮詢:請注意,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 模型部署至 Azure Machine Learning 時,應由模型組建者 (組建模型的人) 決定如何執行推斷,而非由 DevOps 工程師 (嘗試部署模型的人) 決定。 每個模型架構可能會自動套用特定的推斷常式。

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

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

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

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

然而,在某些情況下,建議您在執行模型之前和之後執行一些前置處理或後續處理。 在其他情況下,建議您變更傳回的內容 (例如機率與類別)。 其中一個解決方案是實作機器學習管線,以從輸入直接移至輸出。 例如,sklearn.pipeline.Pipelinepyspark.ml.Pipeline 是實作管線的熱門方式,有時出於效能考量而建議使用。 另一個替代方法則是使用自訂模型變體來自訂模型的推斷方式

使用評分指令碼自訂推斷

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

重要

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

部署工具

Azure Machine Learning 提供將 MLflow 模型部署至線上和批次端點的各種方法。 您可以透過下列工具部署模型:

  • MLflow SDK
  • Azure Machine Learning CLI
  • 適用於 Python 的 Azure Machine Learning SDK
  • Azure Machine Learning Studio

每個工作流程都有不同的功能,特別是其可鎖定的計算類型。 下表顯示各項不同功能。

案例 MLflow SDK Azure Machine Learning CLI/SDK Azure Machine Learning Studio
部署至受控線上端點 請參閱範例1 請參閱範例1 請參閱範例1
部署至受控線上端點 (使用評分指令碼) 不支援3 請參閱範例 請參閱範例
部署至批次端點 不支援3 請參閱範例 請參閱範例
部署至批次端點 (使用評分指令碼) 不支援3 請參閱範例 請參閱範例
部署至 Web 服務 (ACI/AKS) 舊版支援2 不支援2 不支援2
部署至 Web 服務 (ACI/AKS - 使用評分指令碼) 不支援3 舊版支援2 舊版支援2

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

2 建議您改為切換至受控線上端點

3 MLflow (OSS) 沒有評分指令碼的概念,目前不支援批次執行。

使用哪個部署工具?

  • 如果符合下列兩者條件,請使用 MLflow SDK:

    • 您相當熟悉 MLflow,或是已經在使用原生支援 MLflow 的平台 (例如 Azure Databricks)。
    • 您希望繼續使用 MLflow 中的相同方法。
  • 如果符合下列任何條件,請使用 Azure Machine Learning CLI v2

    • 您更熟悉 Azure Machine Learning CLI v2
    • 您想要使用自動化管線將部署自動化。
    • 您想要將部署設定保留在 Git 存放庫中。
  • 若您想要快速部署和測試使用 MLflow 定型的模型,可以使用 Azure Machine Learning 工作室 UI 部署。