バッチ エンドポイントを使用してトレーニング パイプラインを運用化する方法
適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)
この記事では、バッチ エンドポイントでトレーニング パイプラインを運用化する方法について説明します。 パイプラインでは、モデル トレーニング、データ前処理、モデル評価を含む複数のコンポーネント (ステップ) が使用されます。
次のことを学習します。
- トレーニング パイプラインを作成してテストする
- パイプラインをバッチ エンドポイントにデプロイする
- パイプラインを変更し、同じエンドポイントに新しいデプロイを作成する
- 新しいデプロイをテストし、既定のデプロイとして設定する
この例の概要
この例では、入力トレーニング データ (ラベル付き) を受け取って、予測モデル、評価結果、および前処理中に適用された変換を生成する、トレーニング パイプラインをデプロイします。 パイプラインでは、UCI Heart Disease Data Set の表形式データを使用して、XGBoost モデルをトレーニングします。 データは、モデルの適合と評価を行うためにトレーニング コンポーネントに送信される前に、データ前処理コンポーネントを使用して前処理されます。
パイプラインの視覚化は次のとおりです。
この記事の例は、azureml-examples リポジトリに含まれているコード サンプルを基にしています。 YAML などのファイルをコピーして貼り付けることなくコマンドをローカルで実行するには、最初にリポジトリを複製してから、ディレクトリをそのフォルダーに変更します。
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
この例のファイルは、次の場所にあります。
cd endpoints/batch/deploy-pipelines/training-with-components
Jupyter ノートブックで作業を進める
この例の Python SDK バージョンに沿って作業を進めることができます。そのためには、複製されたリポジトリで sdk-deploy-and-test.ipynb ノートブックを開きます。
前提条件
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 CLI と
ml
という Azure Machine Learning 用の拡張機能をインストールします。az extension add -n ml
バッチ エンドポイントのパイプライン コンポーネント デプロイは、Azure CLI 用拡張機能
ml
のバージョン 2.7 で導入されました。az extension update --name ml
コマンドを使用して、最新バージョンを取得します。
ワークスペースに接続する
ワークスペースは、Machine Learning の最上位のリソースです。 これは Machine Learning を使用する際に作成するすべての成果物を操作するための一元的な場所を提供します。 このセクションでは、デプロイ タスクを実行するワークスペースに接続します。
次のコマンドで、サブスクリプション ID、ワークスペース、場所、リソース グループの値を入力します。
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
トレーニング パイプライン コンポーネントを作成する
このセクションでは、トレーニング パイプラインに必要なすべてのアセットを作成します。 まず、モデルをトレーニングするために必要なライブラリを含む環境を作成します。 次に、バッチ デプロイを実行するコンピューティング クラスターを作成し、最後に入力データをデータ アセットとして登録します。
環境の作成
この例のコンポーネントでは、XGBoost
および scikit-learn
ライブラリを含む環境を使用します。 environment/conda.yml
ファイルには、環境の構成が含まれます。
environment/conda.yml
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- azureml-mlflow
- datasets
- jobtools
- cloudpickle==1.6.0
- dask==2023.2.0
- scikit-learn==1.1.2
- xgboost==1.3.3
- pandas==1.4
name: mlflow-env
次のように環境を作成します。
環境を定義します。
environment/xgboost-sklearn-py38.yml
$schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json name: xgboost-sklearn-py38 image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: conda.yml description: An environment for models built with XGBoost and Scikit-learn.
環境を作成します。
コンピューティング クラスターを作成する
バッチ エンドポイントとバッチ デプロイは、コンピューティング クラスター上で実行されます。 これらは、ワークスペースに既に存在する任意の Azure Machine Learning コンピューティング クラスター上で実行できます。 したがって、複数のバッチ デプロイが同じコンピューティング インフラストラクチャを共有できます。 この例では、batch-cluster
という名前の Azure Machine Learning コンピューティング クラスター上で作業します。 ワークスペースにコンピューティングが存在することを確認し、存在しない場合は作成します。
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
トレーニング データをデータ アセットとして登録する
トレーニング データは CSV ファイルで表されます。 より運用レベルのワークロードを再現するために、トレーニング データをワークスペースのデータ アセットとして heart.csv
ファイルに登録します。 このデータ アセットは、後でエンドポイントへの入力として示されます。
az ml data create --name heart-classifier-train --type uri_folder --path data/train
パイプラインを作成する
運用化するパイプラインは、1 つの入力 (トレーニング データ) を受け取り、3 つの出力 (トレーニング済みのモデル、評価結果、前処理として適用されたデータ変換) を生成します。 パイプラインは、2 つのコンポーネントで構成されています。
preprocess_job
: このステップでは、入力データを読み取り、準備されたデータと適用された変換を返します。 このステップでは、3 つの入力を受け取ります。data
: 変換およびスコアリングする入力データを含むフォルダーtransformations
: (オプション) 適用される変換へのパス (使用可能な場合)。 パスが指定されない場合、変換は入力データから学習されます。transformations
入力はオプションであるため、トレーニングとスコアリング中にpreprocess_job
コンポーネントを使用できます。categorical_encoding
: カテゴリ特徴量 (ordinal
またはonehot
) のエンコード戦略。
train_job
: このステップでは、準備されたデータに基づいて XGBoost モデルをトレーニングし、評価結果とトレーニング済みモデルを返します。 このステップでは、3 つの入力を受け取ります。data
: 前処理されたデータ。target_column
: 予測する列。eval_size
: 評価に使用される入力データの割合を示します。
パイプライン構成は、deployment-ordinal/pipeline.yml
ファイルで定義されます。
deployment-ordinal/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline
name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
type: uri_folder
mode: upload
jobs:
preprocess_job:
type: command
component: ../components/prepare/prepare.yml
inputs:
data: ${{parent.inputs.input_data}}
categorical_encoding: ordinal
outputs:
prepared_data:
transformations_output: ${{parent.outputs.prepare_transformations}}
train_job:
type: command
component: ../components/train_xgb/train_xgb.yml
inputs:
data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
target_column: target
register_best_model: false
eval_size: 0.3
outputs:
model:
mode: upload
type: mlflow_model
path: ${{parent.outputs.model}}
evaluation_results:
mode: upload
type: uri_folder
path: ${{parent.outputs.evaluation_results}}
注意
pipeline.yml
ファイルで、preprocess_job
から transformations
入力が欠落しています。そのため、スクリプトは入力データから変換パラメーターを学習します。
パイプラインの視覚化は次のとおりです。
パイプラインをテストする
いくつかのサンプル データを使用してパイプラインをテストします。 これを行うために、パイプラインと、以前に作成した batch-cluster
コンピューティング クラスターを使用してジョブを作成します。
次の pipeline-job.yml
ファイルには、パイプライン ジョブの構成が含まれています。
deployment-ordinal/pipeline-job.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline
experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
compute: batch-cluster
component: pipeline.yml
inputs:
input_data:
type: uri_folder
outputs:
model:
type: mlflow_model
mode: upload
evaluation_results:
type: uri_folder
mode: upload
prepare_transformations:
mode: upload
テスト ジョブを作成します。
az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest
バッチ エンドポイントを作成する
エンドポイントの名前を指定します。 バッチ エンドポイントの名前は、呼び出し URI の構成に使用されるため、各リージョンで一意である必要があります。 一意性を確保するために、次のコードで指定する名前に末尾文字を追加します。
エンドポイントを構成します。
エンドポイントを作成します。
エンドポイント URI にクエリを実行します。
パイプライン コンポーネントをデプロイする
パイプライン コンポーネントをデプロイするには、バッチ デプロイを作成する必要があります。 デプロイは、実際の作業を行うアセットをホスティングするために必要なリソースのセットです。
デプロイを構成します。
deployment-ordinal/deployment.yml
ファイルには、デプロイの構成が含まれます。 追加のプロパティについては、完全なバッチ エンドポイント YAML スキーマを確認してください。deployment-ordinal/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-xgb description: A sample deployment that trains an XGBoost model for the UCI dataset. endpoint_name: uci-classifier-train type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
デプロイを作成します。
デプロイを使用する準備が整いました。
展開をテスト
デプロイが作成されると、ジョブを受け取る準備が整います。 次の手順に従ってテストします。
デプロイでは、1 つのデータ入力を指定する必要があります。
inputs.yml
ファイルには、入力データ アセットの定義が含まれます。inputs.yml
inputs: input_data: type: uri_folder path: azureml:heart-classifier-train@latest
ヒント
入力を指定する方法の詳細については、「バッチ エンドポイントのジョブと入力データを作成する」を参照してください。
次のように、既定のデプロイを呼び出すことができます。
次を使用して、ログの表示およびストリーミングの進行状況を監視できます。
特筆すべきは、パイプラインの入力のみがバッチ エンドポイントの入力として公開されるということです。 たとえば、categorical_encoding
はパイプラインのあるステップの入力ですが、パイプライン自体の入力ではありません。 このファクトを使用して、クライアントに公開する入力と非表示にする入力を制御します。
ジョブ出力にアクセスする
ジョブが完了すると、その出力の一部にアクセスできます。 このパイプラインでは、そのコンポーネントに対して次の出力が生成されます。
preprocess job
: 出力はtransformations_output
ですtrain job
: 出力はmodel
とevaluation_results
です
次を使用して、関連する結果をダウンロードできます。
az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results
エンドポイントで新しいデプロイを作成する
エンドポイントは、一度に複数のデプロイをホストできますが、規定として保持できるデプロイは 1 つのみです。 そのため、さまざまなモデルを反復処理し、さまざまなモデルをエンドポイントにデプロイしてテストし、最終的に規定のデプロイを最適なモデル デプロイに切り替えることができます。
パイプラインで前処理を行う方法を変更して、パフォーマンスが向上するモデルが得られるかどうかを確認します。
パイプラインの前処理コンポーネントのパラメーターを変更する
前処理コンポーネントには categorical_encoding
という名前の入力があり、その値は ordinal
または onehot
です。 これらの値は、カテゴリ特徴量をエンコードする 2 つの異なる方法に対応しています。
ordinal
:[1:n]
から得られた数値 (序数) で特徴量の値をエンコードします。ここでn
は、特徴量内のカテゴリの数です。 序数エンコードは、特徴量カテゴリの中に自然なランク順が存在することを意味します。onehot
: 自然なランク順の関係を示すものではありませんが、カテゴリの数が多いと次元の問題が発生します。
既定では、以前は ordinal
を使用していました。 次に、onehot
使用するようにカテゴリ エンコードを変更し、モデルがどの程度機能するかを確認します。
ヒント
あるいは、categorial_encoding
入力をパイプライン ジョブ自体への入力としてクライアントに公開することも可能でした。 しかし、デプロイ内部でパラメーターを非表示にして制御し、同じエンドポイントで複数のデプロイを持つ機会を利用できるようにするために、前処理ステップでパラメーター値を変更することを選択しました。
パイプラインを変更します。 次のようになります。
パイプライン構成は、
deployment-onehot/pipeline.yml
ファイルで定義されます。deployment-onehot/pipeline.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json type: pipeline name: uci-heart-train-pipeline display_name: uci-heart-train description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset. inputs: input_data: type: uri_folder outputs: model: type: mlflow_model mode: upload evaluation_results: type: uri_folder mode: upload prepare_transformations: type: uri_folder mode: upload jobs: preprocess_job: type: command component: ../components/prepare/prepare.yml inputs: data: ${{parent.inputs.input_data}} categorical_encoding: onehot outputs: prepared_data: transformations_output: ${{parent.outputs.prepare_transformations}} train_job: type: command component: ../components/train_xgb/train_xgb.yml inputs: data: ${{parent.jobs.preprocess_job.outputs.prepared_data}} target_column: target eval_size: 0.3 outputs: model: type: mlflow_model path: ${{parent.outputs.model}} evaluation_results: type: uri_folder path: ${{parent.outputs.evaluation_results}}
デプロイを構成します。
deployment-onehot/deployment.yml
ファイルには、デプロイの構成が含まれます。 追加のプロパティについては、完全なバッチ エンドポイント YAML スキーマを確認してください。deployment-onehot/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json name: uci-classifier-train-onehot description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables. endpoint_name: uci-classifier-train type: pipeline component: pipeline.yml settings: continue_on_step_failure: false default_compute: batch-cluster
デプロイを作成します。
デプロイを使用する準備が整いました。
既定以外のデプロイをテストする
デプロイが作成されると、ジョブを受け取る準備が整います。 以前と同じ方法でテストできますが、今回は特定のデプロイを呼び出します。
次のように、特定のデプロイ
uci-classifier-train-onehot
をトリガーするようにデプロイ パラメーターを指定して、デプロイを呼び出します。次を使用して、ログの表示およびストリーミングの進行状況を監視できます。
新しいデプロイを既定として構成する
新しいデプロイのパフォーマンスに問題がなければ、この新しいデプロイを既定として設定できます。
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
古いデプロイを削除する
完了したら、不要になった以前のデプロイを削除できます。
az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes
リソースをクリーンアップする
完了したら、関連付けられているリソースをワークスペースから削除します。
次のコードを実行して、バッチ エンドポイントとその基になっているデプロイを削除します。 --yes
は、削除を確認するために使用します。
az ml batch-endpoint delete -n $ENDPOINT_NAME --yes
(オプション) 後のデプロイでコンピューティング クラスターを再利用する予定がない場合は、コンピューティングを削除します。