共用方式為


在 Azure Machine Learning 中的批次部署中部署 MLflow 模型

適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)

本文說明如何使用批次端點,將 MLflow 模型部署到 Azure Machine Learning 以進行批次推斷。 當您將 MLflow 模型部署至批次端點時,Azure Machine Learning 會完成下列工作:

  • 提供 MLflow 基底映像或策展環境,其中包含執行 Machine Learning 批次工作所需的相依性。
  • 使用評分指令碼為您建立批次工作管線,以使用平行處理來處理資料。

如需所支援輸入檔類型的詳細資訊,以及 MLflow 模型如何運作方式的詳細資料,請參閱部署至批次推斷時的考量

必要條件

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。 試用免費或付費版本的 Azure Machine Learning

  • Azure Machine Learning 工作區。 若要建立工作區,請參閱 管理 Azure Machine Learning 工作區

  • 請確定您在 Machine Learning 工作區中具有下列權限:

    • 建立或管理批次端點和部署:使用允許 Microsoft.MachineLearningServices/workspaces/batchEndpoints/* 的擁有者、參與者或自訂角色。
    • 在工作區資源群組中建立 Azure Resource Manager 部署:在部署工作區的資源群組中,使用允許 Microsoft.Resources/deployments/write 的擁有者、參與者或自訂角色。
  • 安裝下列軟體以使用 Machine Learning:

    執行下列命令來安裝 Azure CLImlAzure Machine Learning 的擴充功能

    az extension add -n ml
    

    在 Azure CLI 的 ml 延伸模組 2.7 版中引進批次端點的管線元件部署。 使用 az extension update --name ml 命令來取得最新版本。


連線到您的工作區

工作區是 Machine Learning 的最上層資源。 它提供集中的位置,讓您在使用 Machine Learning 時使用您所建立的所有成品。 在本節中,您會連線到要執行部署工作的工作區。

在下列命令中,輸入訂用帳戶識別碼、工作區、位置和資源群組的值:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

探索範例

本文中的範例示範如何將 MLflow 模型部署到批次端點,以執行批次預測。 MLflow 模型是以 UCI 心臟疾病資料集為基礎。 資料庫包含 76 個屬性,但此範例只會使用 14 的子集。 模型會嘗試預測患者心臟病的存在,其整數值從 0 (不存在) 到 1 (存在)。

模型是使用 XGBBoost 分類器來定型。 所有必要的前置處理都會封裝為 scikit-learn 管線,讓模型成為從未經處理資料到預測的端對端管線。

本文中的範例是以 azureml-examples (英文) 存放庫內含的程式碼範例為基礎。 若要在本機執行命令,而不需要複製/貼上 YAML 和其他檔案,請複製存放庫,然後將目錄變更為該資料夾:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

這個範例的檔案位於下列資料夾中:

cd endpoints/batch/deploy-models/heart-classifier-mlflow

在 Jupyter Notebook 中跟著做

您可以使用公用 Jupyter Notebook 來關注此範例。 在複製的存放庫中,開啟 mlflow-for-batch-tabular.ipynb 筆記本。

部署 MLflow 模型

在本節中,您會將 MLflow 模型部署到批次端點,以便您可以對新資料執行批次推斷。 在繼續進行部署之前,您必須確定模型已註冊,且工作區上有可用的計算叢集。

註冊模型

批次端點只能部署已註冊的模型。 在本文中,您會在存放庫中使用模型的本機複本。 因此,您只需要將模型發佈至工作區中的登錄。

注意

如果您部署的模型已註冊,您可以繼續前往 [建立計算叢集] 區段。

若要註冊模型,請執行下列命令:

MODEL_NAME='heart-classifier-mlflow'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

建立計算叢集

您必須確保批次部署可以在某些可用的基礎結構上執行 (計算)。 批次部署可以在工作區中現有的任何 Machine Learning 計算上執行。 多個批次部署可以共用相同的計算基礎結構。

在本文中,您會在名為 cpu-cluster的 Machine Learning 計算叢集上工作。 下列範例會驗證工作區上有計算,或建立新的計算。

建立計算叢集:

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

建立批次端點

若要建立端點,您需要名稱和描述。 端點名稱會出現在與您的端點相關聯的 URI 中,因此它必須在 Azure 區域內是唯一的。 例如,在 WestUS2 區域中,只能有一個名稱為 mybatchendpoint 的批次端點。

  1. 將端點的名稱放在變數中,以供稍後輕鬆參考:

    執行以下命令:

    ENDPOINT_NAME="heart-classifier"
    
  2. 建立端點:

    1. 若要建立新的端點,請建立如以下程式碼的 YAML 設定:

      endpoint.yml

      $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
      name: heart-classifier-batch
      description: A heart condition classifier for batch inference
      auth_mode: aad_token
      
    2. 使用下列命令建立端點:

      az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
      

建立批次部署

當您建立部署時,MLflow 模型不需要指出環境或評分指令碼。 系統會自動為您建立環境或評分指令碼。 不過,如果您想要自訂部署的推斷方式,您可以指定環境或評分指令碼。

  1. 若要在已建立的端點下建立新部署,請建立 YAML 設定,如下列程式代碼所示。 您可以檢查完整的批次端點 YAML 結構描述,以取得額外的屬性。

    deployment-simple/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-mlflow
    description: A heart condition classifier based on XGBoost
    type: model
    model: azureml:heart-classifier-mlflow@latest
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    
  2. 使用下列命令建立部署:

    az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    

重要

根據模型在單一批次上執行推斷所花費的時間長度,在您的部署中設定 timeout 值。 批次大小越大,timeout 值越長。 請記住,mini_batch_size 值會指出批次中的檔案數目,而不是範例數目。 當您使用表格式資料時,每個檔案可以包含多個資料列,這會增加批次端點處理每個檔案所需的時間。 在這種情況下,請使用高 timeout 值來避免逾時錯誤。

叫用端點

雖然您可以在端點內叫用特定部署,但是通常會想要叫用端點本身,讓端點決定要使用的部署。 這種類型部署名為「預設」部署。 此方法可變更預設部署,讓您變更提供部署的模型,但不需變更與叫用端點使用者之間的合約。

使用下列指示來更新預設部署:

DEPLOYMENT_NAME="classifier-xgboost-mlflow"
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

批次端點現在已可供使用。

測試部署

為了測試您的端點,您可以使用此存放庫中且可與模型搭配使用的未標記資料作為範例。 批次端點只能處理位於雲端且可從 Machine Learning 工作區存取的資料。 在此範例中,您會將範例上傳至 Machine Learning資料存放區。 您可以建立可用於叫用端點以進行評分的資料資產。 請記住,批次端點可接受可放置在各種位置類型的資料。

  1. 首先,建立資料資產。 資料資產包含一個具有多個 CSV 檔案的資料夾,我們想要使用批次端點進行平行處理。 如果您的資料已註冊為資料資產,或您想要使用不同的輸入類型,您可以略過此步驟。

    1. 在 YAML 中建立資料資產定義:

      heart-dataset-unlabeled.yml

      $schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
      name: heart-dataset-unlabeled
      description: An unlabeled dataset for heart classification.
      type: uri_folder
      path: data
      
    2. 建立資料資產:

      az ml data create -f heart-dataset-unlabeled.yml
      
  2. 上傳資料之後,請叫用端點。

    提示

    在下列命令中,請注意部署名稱不會在 invoke 作業中指出。 端點會自動將作業路由傳送至預設部署,因為端點只有一個部署。 您可以指示引數/參數 deployment_name,以特定部署為目標。

    執行下列命令:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
    

    注意

    公用程式 jq 可能不會在每次安裝時進行安裝。 如需安裝指示,請參閱 Download jq

  3. 命令傳回時,就會立即啟動批次工作。 您可以監視工作的狀態,直到工作完成為止:

    執行以下命令:

    az ml job show -n $JOB_NAME --web
    

分析輸出

輸出預測會在 predictions.csv 檔案中產生,如部署設定中所述。 作業會產生名為分數的輸出,其中會放置此檔案。 每個批次作業只會產生一個檔案。

該檔案的結構如下:

  • 每個傳送至模型的資料點各一個資料列。 對於表格式資料,檔案 predictions.csv 針對每個已處理檔案中的每個資料列各包含一個資料列。 對於其他數據類型 (影像、音訊、文字),每個處理過的檔案各有一個資料列。

  • 下列資料列位於 檔案中 (依指定的順序):

    • row (選擇性):輸入資料檔案中的對應資料列索引。 只有當輸入資料是表格式時,才會套用此資料行。 預測會以出現在輸入檔案中的相同順序傳回。 您可以依賴資料列編號來比對對應的預測。

    • prediction:與輸入資料相關聯的預測。 此值會以「現況」傳回,因為模型 predict(). 函式所提供的值。

    • file_name:讀取資料的檔案名稱。 在表格式資料中,使用此欄位來判斷哪些預測屬於每筆輸入資料。

您可以使用工作名稱來下載工作的結果。

若要下載預測,請使用下列命令:

az ml job download --name $JOB_NAME --output-name score --download-path ./

下載檔案之後,您可以使用慣用的編輯工具開啟檔案。 下列範例會使用 Pandas 資料框架載入預測。

import pandas as pd

score = pd.read_csv(
    "named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)

輸出會顯示資料表:

資料列 預測 檔案
0 0 heart-unlabeled-0.csv
1 1 heart-unlabeled-0.csv
2 0 heart-unlabeled-0.csv
... ... ...
307 0 heart-unlabeled-3.csv

提示

請注意,在此範例中,輸入資料包含 CSV 格式的表格式資料。 有四個不同的輸入檔:heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csvheart-unlabeled-3.csv

檢閱批次推斷的考慮事項

Machine Learning 支援將 MLflow 模型部署至批次端點,而不會指出評分指令碼。 此方法是部署需要處理大量資料的模型,類似於批次處理的便利方式。 Machine Learning 會使用 MLflow 模型規格中的資訊來協調推斷程序。

探索背景工作分佈

批次端點會針對結構化和非結構化資料,在檔案層級散發工作。 因此,僅 URI 檔案URI 資料夾支援使用此功能。 每個背景工作角色都會逐一處理 Mini batch size 檔案的批次。 針對表格式資料,批次端點不會在散發工作時考慮每個檔案內的資料列數目。

警告

推斷期間不會探索巢狀資料夾結構。 如果您使用資料夾分割資料,請務必在繼續之前將結構壓平合併。

批次部署會針對每個檔案呼叫 MLflow 模型的 predict 函式一次。 對於具有多個資料列的 CSV 檔案,此動作可能會對基礎計算施加記憶體壓力。 此行為可以增加模型為單一檔案評分所需的時間,特別是針對大型語言模型等昂貴模型。 如果您遇到數個記憶體不足的例外狀況或記錄中的逾時項目,請考慮將資料分割成資料列較少的較小檔案,或在模型評分指令碼內的資料列層級實作批次處理。

檢閱檔案類型的支援

部署不含環境或評分指令碼的 MLflow 模型時,批次推斷支援下列資料類型。 若要處理不同的檔案類型,或以不同的方式執行推斷,您可以藉由使用評分指令碼自訂 MLflow 模型部署來建立部署。

副檔名 以模型輸入傳回的類型 簽章需求
.csv.parquet.pqt pd.DataFrame ColSpec. 如果未提供,則不會強制執行資料類型。
.png.jpg.jpeg.tiff.bmp.gif np.ndarray TensorSpec. 如果可用,輸入會重新調整以符合張量圖形。 如果沒有可用的簽章,則會推斷類型 np.uint8 的張量。 如需詳細資訊,請參閱 MLflow 模型處理影像的考量

警告

任何可能存在於輸入資料中不支援的檔案都會導致作業失敗。 在這種情況下,您會看到類似 ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro' 的錯誤。不支援檔案類型 'avro'

瞭解 MLflow 模型的簽章強制

批次部署作業會使用可用的 MLflow 模型簽章,在讀取資料時強制執行輸入的資料類型。 因此,您的資料輸入符合模型簽章中所指出的類型。 如果無法如預期般剖析數據,作業會失敗,並出現類似 ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv' 的錯誤。例外狀況:具有基底 10 的 int() 無效的常值: 'value'

提示

MLflow 模型中的簽章是選擇性的,但強烈建議使用簽章。 它們為早期偵測資料相容性問題提供了方便的方式。 如需如何使用簽章記錄模型的詳細資訊,請參閱使用自訂簽章、環境或範例記錄模型

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

檢查類別支援

批次部署僅支援使用 pyfunc 類別部署 MLflow 模型。 若要部署不同的類別,請參閱使用評分指令碼自訂模型部署

使用評分指令碼自訂模型部署

無須在部署定義中指出評分指令碼,也可將 MLflow 模型部署到批次端點。 不過,您可以加入來指出此檔案 (通常稱為 批次驅動程式),以自訂推斷執行。

您通常會針對下列案例選取此工作流程:

  • 處理 MLflow 部署批次部署不支援的檔案類型。
  • 自訂模型的執行方式,例如使用特定類別以 mlflow.<flavor>.load() 函式載入模型。
  • 當模型本身未完成時,請在評分常式中完成前置或後置處理。
  • 調整表格式資料無法很好地呈現的模型呈現方式,例如代表影像的張量圖。
  • 允許模型以區塊讀取資料,因為受到記憶體限制而無法一次處理每個檔案。

重要

若要指出 MLflow 模型部署的評分指令碼,您必須指定部署執行所在的環境。

使用評分指令碼

使用下列步驟部署具有自訂評分指令碼的 MLflow 模型:

  1. 識別放置 MLflow 模型的資料夾。

    1. Azure Machine Learning 入口網站中,瀏覽至 Models

    2. 選取要部署的模型,然後選取 [成品] 索引標籤。

    3. 記下顯示的資料夾。 註冊模型時會指出此資料夾。

      顯示模型成品所在資料夾的螢幕擷取畫面。

  2. 建立評分指令碼。 請注意上一個資料夾名稱 model 如何包含在 init() 函式中。

    deployment-custom/code/batch_driver.py

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license.
    
    import os
    import glob
    import mlflow
    import pandas as pd
    import logging
    
    
    def init():
        global model
        global model_input_types
        global model_output_names
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        # Please provide your model's folder name if there's one
        model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0]
    
        # Load the model, it's input types and output names
        model = mlflow.pyfunc.load(model_path)
        if model.metadata and model.metadata.signature:
            if model.metadata.signature.inputs:
                model_input_types = dict(
                    zip(
                        model.metadata.signature.inputs.input_names(),
                        model.metadata.signature.inputs.pandas_types(),
                    )
                )
            if model.metadata.signature.outputs:
                if model.metadata.signature.outputs.has_input_names():
                    model_output_names = model.metadata.signature.outputs.input_names()
                elif len(model.metadata.signature.outputs.input_names()) == 1:
                    model_output_names = ["prediction"]
        else:
            logging.warning(
                "Model doesn't contain a signature. Input data types won't be enforced."
            )
    
    
    def run(mini_batch):
        print(f"run method start: {__file__}, run({len(mini_batch)} files)")
    
        data = pd.concat(
            map(
                lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch
            )
        )
    
        if model_input_types:
            data = data.astype(model_input_types)
    
        # Predict over the input data, minus the column filename which is not part of the model.
        pred = model.predict(data.drop("filename", axis=1))
    
        if pred is not pd.DataFrame:
            if not model_output_names:
                model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])]
            pred = pd.DataFrame(pred, columns=model_output_names)
    
        return pd.concat([data, pred], axis=1)
    
  3. 建立可執行評分指令碼的環境。 由於此範例中的模型是 MLflow,因此也會在模型套件中指定 Conda 需求。 如需 MLflow 模型和內含檔案的詳細資訊,請參閱 MLmodel 格式

    在此步驟中,您會使用檔案中的 Conda 相依性來建置環境。 您也需要包含批次部署所需的 azureml-core 套件。

    提示

    如果您的模型已在模型登錄中註冊,您可以下載並複製與模型相關聯的 conda.yml 檔案。 檔案可在 Azure Machine Learning Studio 的 [Models]>[Select your model from the list]>[Artifacts] 中找到。 在根資料夾中,選取 conda.yml 檔案,然後選取 [下載] 或複製其內容。

    重要

    此範例使用 /heart-classifier-mlflow/environment/conda.yaml 上指定的 conda 環境。 此檔案是藉由合併原始的 MLflow conda 相依性檔案和新增 azureml-core 套件來建立。 您無法直接從模型使用 conda.yml 檔案。

    環境定義會以匿名環境的形式包含在部署定義本身。 您會在部署中看到下列幾行:

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  4. 設定部署:

    若要在已建立的端點下建立新部署,請建立 YAML 設定,如下列程式碼片段所示。 您可以檢查完整的批次端點 YAML 結構描述,以取得額外的屬性。

    deployment-custom/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-custom
    description: A heart condition classifier based on XGBoost
    type: model
    model: azureml:heart-classifier-mlflow@latest
    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    
  5. 建立部署:

    執行下列程式碼:

    az ml batch-deployment create --file deployment-custom/deployment.yml --endpoint-name $ENDPOINT_NAME
    

批次端點現在已可供使用。

清除資源

完成練習之後,請刪除不再需要的資源。

執行下列程式碼,以刪除 Batch 端點和所有基礎部署:

az ml batch-endpoint delete --name $ENDPOINT_NAME --yes

此命令不會刪除批次評分作業。