在 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 機器學習 工作區中的下列許可權:
- 若要建立或管理批次端點和部署:請使用已指派
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
許可權的擁有者、參與者或自定義角色。 - 若要在工作區資源群組中建立 Azure Resource Manager 部署:請使用已指派
Microsoft.Resources/deployments/write
工作區部署之資源群組中許可權的擁有者、參與者或自定義角色。
- 若要建立或管理批次端點和部署:請使用已指派
Azure 機器學習 CLI 或適用於 Python 的 Azure 機器學習 SDK:
執行下列命令來安裝 Azure CLI 和
ml
Azure Machine Learning 的擴充功能:az extension add -n ml
批次端點的管線元件部署是在 Azure CLI 的
ml
延伸模組 2.7 版中引進。 使用az extension update --name ml
命令來取得最新版本。
連線到您的工作區
工作區是 Azure Machine Learning 的最上層資源。 它提供集中的位置,讓您在使用 Azure 機器學習 時,使用您建立的所有成品。 在本節中,您會連線到要執行部署工作的工作區。
在下列命令中,輸入您的訂用帳戶識別碼、工作區名稱、資源組名和位置:
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
的批次端點。
將端點的名稱放在變數中,以供稍後輕鬆參考:
建立端點:
若要建立新的端點,請建立如以下程式碼的
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
使用下列命令建立端點:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
建立批次部署
當您建立部署時,MLflow 模型不需要指出環境或評分指令碼。 系統會自動為您建立環境或評分指令碼。 不過,如果您想要自訂部署的推斷方式,您可以指定環境或評分指令碼。
若要在已建立的端點下建立新部署,請建立
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
使用下列命令建立部署:
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資料存放區。 您可以建立可用於叫用端點以進行評分的資料資產。 請記住,批次端點可接受可放置在各種位置類型的資料。
首先,建立資料資產。 資料資產包含一個具有多個 CSV 檔案的資料夾,我們想要使用批次端點進行平行處理。 如果您的資料已註冊為資料資產,或您想要使用不同的輸入類型,您可以略過此步驟。
在 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
建立資料資產:
az ml data create -f heart-dataset-unlabeled.yml
上傳資料之後,請叫用端點。
提示
在下列命令中,請注意部署名稱不會在
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。命令傳回時,就會立即啟動批次工作。 您可以監視工作的狀態,直到工作完成為止:
分析輸出
輸出預測會在 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.csv 及 heart-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 模型:
識別放置 MLflow 模型的資料夾。
在 Azure Machine Learning 入口網站中,瀏覽至 Models。
選取要部署的模型,然後選取 [成品] 索引標籤。
記下顯示的資料夾。 註冊模型時會指出此資料夾。
建立評分指令碼。 請注意上一個資料夾名稱
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)
建立可執行評分指令碼的環境。 由於此範例中的模型是 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
檔案。設定部署:
若要在已建立的端點下建立新部署,請建立
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
建立部署:
批次端點現在已可供使用。
清除資源
完成練習之後,請刪除不再需要的資源。
執行下列程式碼,以刪除 Batch 端點和所有基礎部署:
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes
此命令不會刪除批次評分作業。