バッチ エンドポイントを使用してトレーニング パイプラインを運用化する方法

適用対象: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 ワークスペース。 準備できていない場合は、Microsoft Azure Machine Learning ワークスペースの管理に関する記事の手順を使用して作成します。

  • ワークスペースに次のアクセス許可があることを確認します。

    • バッチ エンドポイントとバッチ デプロイを作成または管理する: 所有者または共同作成者のロール、あるいは Microsoft.MachineLearningServices/workspaces/batchEndpoints/* を許可するカスタム ロールを使用します。

    • ワークスペース リソース グループに ARM デプロイを作成する: 所有者または共同作成者のロール、あるいはワークスペースがデプロイされているリソース グループで Microsoft.Resources/deployments/write を許可するカスタム ロールを使用します。

  • Azure Machine Learning を使用するには、次のソフトウェアをインストールする必要があります。

    Azure CLImlAzure Machine Learning 用の 拡張機能

    az extension add -n ml
    

    注意

    Batch エンドポイントのパイプライン コンポーネント デプロイは、Azure CLI 用 ml 拡張機能のバージョン 2.7 で導入されました。 az extension update --name ml を使用して、最新バージョンを取得します。

ワークスペースに接続する

ワークスペースは、Azure Machine Learning の最上位のリソースで、Azure 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

次のように環境を作成します。

  1. 環境を定義します。

    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.
    
  2. 環境を作成します。

    az ml environment create -f environment/xgboost-sklearn-py38.yml
    

コンピューティング クラスターを作成する

バッチ エンドポイントとバッチ デプロイは、コンピューティング クラスター上で実行されます。 これらは、ワークスペースに既に存在する任意の 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

バッチ エンドポイントを作成する

  1. エンドポイントの名前を指定します。 バッチ エンドポイントの名前は、呼び出し URI の構成に使用されるため、各リージョンで一意である必要があります。 一意性を確保するために、次のコードで指定する名前に末尾文字を追加します。

    ENDPOINT_NAME="uci-classifier-train"
    
  2. エンドポイントを構成します。

    endpoint.yml ファイルには、エンドポイントの構成が含まれます。

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-train
    description: An endpoint to perform training of the Heart Disease Data Set prediction task.
    auth_mode: aad_token
    
  3. エンドポイントを作成します。

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. エンドポイント URI にクエリを実行します。

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

パイプライン コンポーネントをデプロイする

パイプライン コンポーネントをデプロイするには、バッチ デプロイを作成する必要があります。 デプロイは、実際の作業を行うアセットをホスティングするために必要なリソースのセットです。

  1. デプロイを構成します。

    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
    
  2. デプロイを作成します。

    次のコードを実行して、バッチ エンドポイントの下にバッチ デプロイを作成し、それを既定のデプロイとして設定します。

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-ordinal/deployment.yml --set-default
    

    ヒント

    この新しいデプロイが既定になったことを示すために --set-default フラグが使用されていることに注目してください。

  3. デプロイを使用する準備が整いました。

展開をテスト

デプロイが作成されると、ジョブを受け取る準備が整います。 次の手順に従ってテストします。

  1. デプロイでは、1 つのデータ入力を指定する必要があります。

    inputs.yml ファイルには、入力データ アセットの定義が含まれます。

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: azureml:heart-classifier-train@latest
    

    ヒント

    入力を指定する方法の詳細については、「バッチ エンドポイントのジョブと入力データを作成する」を参照してください。

  2. 次のように、既定のデプロイを呼び出すことができます。

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. 次を使用して、ログの表示およびストリーミングの進行状況を監視できます。

    az ml job stream -n $JOB_NAME
    

特筆すべきは、パイプラインの入力のみがバッチ エンドポイントの入力として公開されるということです。 たとえば、categorical_encoding はパイプラインのあるステップの入力ですが、パイプライン自体の入力ではありません。 このファクトを使用して、クライアントに公開する入力と非表示にする入力を制御します。

ジョブ出力にアクセスする

ジョブが完了すると、その出力の一部にアクセスできます。 このパイプラインでは、そのコンポーネントに対して次の出力が生成されます。

  • preprocess job: 出力は transformations_output です
  • train job: 出力は modelevaluation_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 入力をパイプライン ジョブ自体への入力としてクライアントに公開することも可能でした。 しかし、デプロイ内部でパラメーターを非表示にして制御し、同じエンドポイントで複数のデプロイを持つ機会を利用できるようにするために、前処理ステップでパラメーター値を変更することを選択しました。

  1. パイプラインを変更します。 次のようになります。

    パイプライン構成は、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}}
    
  2. デプロイを構成します。

    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
    
  3. デプロイを作成します。

    次のコードを実行して、バッチ エンドポイントの下にバッチ デプロイを作成し、それを既定のデプロイとして設定します。

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-onehot/deployment.yml
    

    デプロイを使用する準備が整いました。

  4. デプロイを使用する準備が整いました。

既定以外のデプロイをテストする

デプロイが作成されると、ジョブを受け取る準備が整います。 以前と同じ方法でテストできますが、今回は特定のデプロイを呼び出します。

  1. 次のように、特定のデプロイ uci-classifier-train-onehot をトリガーするようにデプロイ パラメーターを指定して、デプロイを呼び出します。

    DEPLOYMENT_NAME="uci-classifier-train-onehot"
    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME -d $DEPLOYMENT_NAME --f inputs.yml --query name -o tsv)
    
  2. 次を使用して、ログの表示およびストリーミングの進行状況を監視できます。

    az ml job stream -n $JOB_NAME
    

新しいデプロイを既定として構成する

新しいデプロイのパフォーマンスに問題がなければ、この新しいデプロイを既定として設定できます。

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

(オプション) 後のデプロイでコンピューティング クラスターを再利用する予定がない場合は、コンピューティングを削除します。

az ml compute delete -n batch-cluster

次のステップ