次の方法で共有


バッチ エンドポイントにスコアリング用のモデルをデプロイする

適用対象:Azure CLI ml 拡張機能 v2 (現行)Python SDK azure-ai-ml v2 (現行)

バッチ エンドポイントを使用すると、大量のデータに対して推論を実行するモデルをデプロイできます。 これらのエンドポイントを使用すると、バッチ スコアリング用のホスティング モデルが簡略化されるため、インフラストラクチャではなく機械学習に集中できます。

バッチ エンドポイントを使用して、次の場合にモデルをデプロイします。

  • 推論の実行に時間がかかるコストの高いモデルを使用します。
  • 複数のファイルに分散された大量のデータに対して推論を実行します。
  • 待機時間を短くする必要はありません。
  • 並列化を利用します。

この記事では、バッチ エンドポイントを使用して、従来の MNIST (米国標準技術研究所) の数字認識の問題を解決する機械学習モデルをデプロイする方法について説明します。 デプロイされたモデルは、画像ファイルなどの大量のデータに対してバッチ推論を実行します。 プロセスは、Torch を使用して構築されたモデルのバッチ デプロイの作成から始まります。 このデプロイは、エンドポイントの既定値になります。 その後、TensorFlow (Keras) で構築されたモデルの 2 つ目のデプロイを作成 し、2 つ目のデプロイをテストし、エンドポイントの既定のデプロイとして設定します。

前提条件

この記事の手順を実行する前に、次の前提条件が満たされていることをご確認ください。

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning をお試しください。

  • Azure Machine Learning ワークスペース。 準備できていない場合は、ワークスペースの管理方法に関する記事の手順を使用して作成します。

  • 次のタスクを実行するには、ワークスペースで次のアクセス許可を持っている必要があります。

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

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

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

    適用対象: Azure CLI ml 拡張機能 v2 (現行)

    Azure CLImlAzure Machine Learning 用の 拡張機能

    az extension add -n ml
    

examples リポジトリをクローンします

この記事の例は、azureml-examples リポジトリに含まれているコード サンプルを基にしています。 YAML などのファイルをコピーして貼り付けることなくコマンドをローカルで実行するには、最初にリポジトリを複製してから、ディレクトリをそのフォルダーに変更します。

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/mnist-classifier

システムを準備する

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

まず、作業している Azure Machine Learning ワークスペースに接続します。

まだ Azure CLI の既定値を設定していない場合は、既定の設定を保存する必要があります。 サブスクリプション、ワークスペース、リソース グループ、場所の値を複数回入力しないようにするには、次のコードを実行します。

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

コンピューティングを作成する

バッチ エンドポイントはコンピューティング クラスターで実行され、Azure Machine Learning コンピューティング クラスター (AmlCompute)Kubernetes クラスターの両方をサポートします。 クラスターは共有リソースであるため、1 つのクラスターで 1 つまたは多数のバッチ デプロイ (必要に応じてほかのワークロードと一緒に) をホストすることができます。

次のコードに示されているように、batch-cluster という名前のコンピューティングを作成します。 必要に応じて調整し、azureml:<your-compute-name>を使用して計算を参照してください。

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

Note

バッチ エンドポイントが呼び出され、バッチ スコアリング ジョブが送信されるまでクラスターは 0 ノードのままであるため、この時点ではコンピューティングに対して課金されません。 コンピューティング コストの詳細については、AmlCompute のコストの管理と最適化に関する記事を参照してください。

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

バッチ エンドポイントは、クライアントが呼び出してバッチ スコアリング ジョブをトリガーする HTTPS エンドポイントです。 バッチ スコアリング ジョブは、複数の入力をスコア付けします。 バッチ デプロイは、バッチ スコアリング (またはバッチ推論) を実行するモデルをホストする一連のコンピューティング リソースです。 1 つのバッチ エンドポイントに複数のバッチ デプロイを割り当てることができます。 バッチ エンドポイントの詳細については、「バッチ エンドポイントとは を参照してください。

ヒント

バッチ デプロイのうちの 1 つが、エンドポイントの既定のデプロイとして機能します。 エンドポイントが呼び出されると、既定のデプロイでバッチ スコアリングが実行されます。 バッチ エンドポイントとデプロイの詳細については、 バッチ エンドポイントとバッチデプロイに関する説明を参照してください

  1. エンドポイントに名前を付けます。 エンドポイントの名前はエンドポイントの URI に含まれているため、Azure リージョン内で一意である必要があります。 たとえば、mybatchendpoint に存在できる westus2 という名前のバッチ エンドポイントは 1 つだけです。

    後で簡単に参照できるように、エンドポイントの名前を変数に配置します。

    ENDPOINT_NAME="mnist-batch"
    
  2. バッチ エンドポイントを構成する

    次の YAML ファイルは、バッチ エンドポイントを定義します。 このファイルは、 バッチ エンドポイントの作成に CLI コマンドと共に使用します。

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: mnist-batch
    description: A batch endpoint for scoring images from the MNIST dataset.
    tags:
      type: deep-learning
    

    次の表では、エンドポイントの主要なプロパティについて説明します。 完全なバッチ エンドポイント YAML スキーマについては、 CLI (v2) バッチ エンドポイント YAML スキーマを参照してください。

    説明
    name バッチ エンドポイントの名前。 Azure リージョン レベルで一意である必要があります。
    description バッチ エンドポイントの説明。 このプロパティは省略可能です。
    tags エンドポイントに含めるタグ。 このプロパティは省略可能です。
  3. エンドポイントを作成します。

    このコードを実行して、バッチ エンドポイントを作成します。

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

バッチ デプロイを作成する

モデル デプロイは、実際の推論を実行するモデルをホストするのに必要なリソースのセットです。 バッチ モデル デプロイを作成するには、次の項目が必要です。

  • ワークスペースに登録済みのモデル
  • モデルをスコアリングするコード
  • モデルの依存関係がインストールされている環境
  • 事前に作成されたコンピューティングとリソースの設定
  1. まず、デプロイするモデルを登録します。これは、一般的な数字認識問題 (MNIST) 用の Torch モデルです。 バッチ デプロイでは、ワークスペースに登録されているモデルのみをデプロイできます。 デプロイするモデルが既に登録されている場合は、この手順をスキップできます。

    ヒント

    モデルは、エンドポイントではなくデプロイに関連付けられます。 つまり、異なるモデル (またはモデル バージョン) がデプロイごとに展開されている限り、同じ単一のエンドポイントで、異なるモデル (またはモデル バージョン) にサービスを提供できます。

    MODEL_NAME='mnist-classifier-torch'
    az ml model create --name $MODEL_NAME --type "custom_model" --path "deployment-torch/model"
    
  2. 次に、スコアリング スクリプトを作成します。 バッチ デプロイには、指定のモデルの実行方法と入力データの処理方法を示すスコアリング スクリプトが必要です。 バッチ エンドポイントでは、Python で作成されたスクリプトがサポートされます。 今回は、数字が表示された画像ファイルを読み込んで、対応する数字を出力するモデルをデプロイします。 スコアリング スクリプトは次のようになります。

    Note

    MLflow モデルの場合、このスコアリング スクリプトは Azure Machine Learning によって自動的に生成されるため、必要ありません。 モデルが MLflow モデルの場合は、この手順をスキップできます。 バッチ エンドポイントが MLflow モデルでどのように動作するかの詳細については、「バッチ デプロイで MLflow モデルを使用する」の記事を参照してください。

    警告

    自動機械学習 (AutoML) モデルをバッチ エンドポイントの下にデプロイする場合、AutoML が提供するスコアリング スクリプトはオンライン エンドポイントでのみ機能することと、バッチ実行用には設計されていないことに注意してください。 スコアリング スクリプトを作成する方法については、「バッチ デプロイ用のスコアリング スクリプトを作成する」を参照してください。

    deployment-torch/code/batch_driver.py

    import os
    import pandas as pd
    import torch
    import torchvision
    import glob
    from os.path import basename
    from mnist_classifier import MnistClassifier
    from typing import List
    
    
    def init():
        global model
        global device
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        model_path = os.environ["AZUREML_MODEL_DIR"]
        model_file = glob.glob(f"{model_path}/*/*.pt")[-1]
    
        model = MnistClassifier()
        model.load_state_dict(torch.load(model_file))
        model.eval()
    
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        with torch.no_grad():
            for image_path in mini_batch:
                image_data = torchvision.io.read_image(image_path).float()
                batch_data = image_data.expand(1, -1, -1, -1)
                input = batch_data.to(device)
    
                # perform inference
                predict_logits = model(input)
    
                # Compute probabilities, classes and labels
                predictions = torch.nn.Softmax(dim=-1)(predict_logits)
                predicted_prob, predicted_class = torch.max(predictions, axis=-1)
    
                results.append(
                    {
                        "file": basename(image_path),
                        "class": predicted_class.numpy()[0],
                        "probability": predicted_prob.numpy()[0],
                    }
                )
    
        return pd.DataFrame(results)
    
  3. バッチ デプロイを実行する環境を作成します。 この環境では、バッチ エンドポイントで必要なパッケージ azureml-coreazureml-dataset-runtime[fuse]、およびコードの実行に必要な依存関係を含める必要があります。 この場合、依存関係は conda.yaml ファイルにキャプチャされています。

    deployment-torch/environment/conda.yaml

    name: mnist-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip<22.0
      - pip:
        - torch==1.13.0
        - torchvision==0.14.0
        - pytorch-lightning
        - pandas
        - azureml-core
        - azureml-dataset-runtime[fuse]
    

    重要

    パッケージ azureml-coreazureml-dataset-runtime[fuse] はバッチ デプロイに必要であり、環境の依存関係に含める必要があります。

    次のように環境を指定します。

    環境定義は、匿名環境としてデプロイ定義自体に含まれます。 デプロイでは、次の行で確認できます。

    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  4. サイド メニューの [ 環境 ] タブに移動します。

  5. [ カスタム環境>作成] を選択します。

    1. 環境の名前 (この例では torch-batch-env) を入力します。

    2. [環境ソースの選択] で、[オプションの Conda ファイルとともに既存の Docker イメージを使用する] を選択します。

    3. [コンテナー レジストリ イメージ パス] に、「mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04」と入力します。

    4. [次へ] を選択し、[カスタマイズ] セクションに進みます。

    5. GitHub リポジトリからポータルに deployment-torch/environment/conda.yaml ファイルの内容をコピーします。

  6. [Review page]\(レビュー ページ\) に到達するまで [ 次へ ] を選択します。

  7. [ 作成] を選択し、環境の準備が整うのを待ちます。


    警告

    キュレーションされた環境は、バッチ デプロイではサポートされていません。 独自の環境を指定する必要があります。 プロセスを簡略化するために、キュレーションされた環境の基本イメージをいつでも自分のイメージとして使用できます。

  8. デプロイの定義を作成する

    deployment-torch/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-torch-dpl
    description: A deployment using Torch to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model:
      name: mnist-classifier-torch
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 30
      error_threshold: -1
      logging_level: info
    

    次の表では、バッチ デプロイの主要なプロパティについて説明します。 完全なバッチ デプロイの YAML スキーマについては、「CLI (v2) バッチ デプロイの YAML スキーマ」を参照してください。

    説明
    name デプロイの名前。
    endpoint_name デプロイを作成するエンドポイントの名前。
    model バッチ スコアリングに使用するモデル。 この例では、path を使用してインラインでモデルを定義しています。 この定義により、自動的にモデル ファイルをアップロードし、自動生成された名前とバージョンで登録できるようになります。 その他のオプションについては、モデル スキーマに関する記事を参照してください。 運用シナリオのベスト プラクティスとして、モデルを個別に作成し、ここで参照します。 既存のモデルを参照するには、azureml:<model-name>:<model-version> 構文を使用します。
    code_configuration.code モデルをスコアリングするためのすべての Python ソース コードを格納するローカル ディレクトリ。
    code_configuration.scoring_script code_configuration.code ディレクトリ内の Python ファイル。 このファイルには、init() 関数と run() 関数が記述されている必要があります。 init() 関数は、コストのかかる、または一般的な準備を行うときに使用します (たとえば、メモリにモデルを読み込むなど)。 init() は、プロセスの開始時に 1 回だけ呼び出されます。 各エントリをスコアリングするには、run(mini_batch) を使用します。mini_batch の値は、ファイル パスのリストです。 run() 関数からは、Pandas の DataFrame または配列が返されます。 返された要素はそれぞれ、mini_batch 内で成功した入力要素の 1 回の実行を示します。 スコアリング スクリプトを作成する方法の詳細については、「スコアリング スクリプトについて」を参照してください。
    environment モデルをスコアリングする環境。 この例では、conda_fileimage を使用して環境をインラインで定義しています。 conda_file の依存関係は、image の上部にインストールされます。 環境は自動生成された名前とバージョンを使用し、自動的に登録されます。 その他のオプションについては、環境スキーマに関する記事を参照してください。 運用シナリオのベスト プラクティスとして、環境を別途作成し、ここで参照することをお勧めします。 既存の環境を参照するには、azureml:<environment-name>:<environment-version> 構文を使用します。
    compute バッチ スコアリングを実行するコンピューティング。 この例では、最初に作成した batch-cluster を使用し、azureml:<compute-name> 構文を使用してそれを参照します。
    resources.instance_count 各バッチ スコアリング ジョブに使用されるインスタンスの数。
    settings.max_concurrency_per_instance インスタンスあたりの scoring_script の並列実行の最大数。
    settings.mini_batch_size scoring_script が 1 回の run() 呼び出しで処理できるファイルの数。
    settings.output_action 出力ファイルで出力を整理する方法。 append_row は、run() が返す出力結果を、すべて output_file_name という名前の単一のファイルにマージします。 summary_only を使用すると、出力結果はマージされず、error_threshold の計算だけが行われます。
    settings.output_file_name append_row output_action のバッチ スコアリング出力ファイルの名前。
    settings.retry_settings.max_retries scoring_script run() が失敗した場合の最大再試行回数。
    settings.retry_settings.timeout ミニ バッチをスコアリングするための scoring_scriptrun() のタイムアウト (秒単位)。
    settings.error_threshold 無視する必要がある入力ファイルのスコアリング エラーの数。 入力全体でのエラーの数がこの値を超えると、ジョブは終了します。 この例では -1 を使用しています。これは、バッチ スコアリング ジョブを終了することなく、任意の数のエラーが許容されることを示します。
    settings.logging_level ログの詳細。 値は詳細度が低い順に WARNING、INFO、DEBUG です。
    settings.environment_variables バッチ スコアリング ジョブごとに設定される環境変数の名前と値のペアの辞書。
  9. サイド メニューの [ エンドポイント ] タブに移動します。

    1. [バッチ エンドポイント]>[作成] の順に選択します。

    2. エンドポイントに名前を付けます (この例では mnist-batch)。 残りのフィールドは、構成してもよいですし、空白のままにすることもできます。

    3. [次へ] を選択して、[モデル] セクションに進みます。

    4. モデル mnist-classifier-torch を選択します。

    5. [次へ] を選択して、[デプロイ] ページに進みます。

    6. デプロイに名前を付けます。

  10. [出力] アクションで、[行の追加] が選択されていることを確認します。

    1. [出力ファイル名] で、バッチ スコアリング出力ファイルが必要なものであることを確認します。 既定値は predictions.csv です。

    2. [ミニ バッチ サイズ] で、各ミニバッチに含めるファイルのサイズを調整します。 このサイズは、スコアリング スクリプトがバッチごとに受け取るデータの量を制御します。

    3. [スコアリング タイムアウト (秒)] では、デプロイでファイルのバッチをスコアリングするのに十分な時間が確保されていることを確認してください。 ファイルの数を増やす場合は、通常、タイムアウト値も増やす必要があります。 コストのより高い (ディープ ラーニングに基づくもののような) モデルでは、このフィールドに高い値が必要になる場合があります。

    4. [インスタンスごとの最大コンカレンシー] で、デプロイで取得する各コンピューティング インスタンスごとに必要な Executor の数を構成します。 この数値を大きくすると、並列処理の度合いが高くなりますが、コンピューティング インスタンスのメモリ負荷も増加します。 この値は、[ミニ バッチ サイズ] と合わせて調整するようにします。

    5. 完了したら、[次へ] を選択して、[コード + 環境] ページに進みます。

    6. [Select a scoring script for inferencing]\(推論用のスコアリング スクリプトの選択\) で、deployment-torch/code/batch_driver.py スコアリング スクリプト ファイルを検索して選択します。

    7. [環境の選択] セクションで、以前に torch-batch-env を作成した環境を選択します。

    8. [次へ] を選択して、[コンピューティング] ページに進みます。

    9. 前の手順で作成したコンピューティング クラスターを選択します。

      警告

      Azure Kubernetes クラスターでは、バッチ デプロイがサポートされていますが、Azure Machine Learning CLI または Python SDK を使用して作成された場合にのみ有効です。

    10. [インスタンス数] に、デプロイに必要なコンピューティング インスタンスの数を入力します。 この場合は、2 を使用します。

    11. [次へ]を選択します。

  11. デプロイを作成します。

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

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

    ヒント

    --set-default は、新しく作成したデプロイをエンドポイントの既定のデプロイとして設定するパラメーターです。 これは、特に最初のデプロイを作成する場合に、エンドポイントの新しい既定のデプロイを作成する便利な方法です。 運用シナリオのベスト プラクティスとして、新しいデプロイを既定として設定せずに作成することをお勧めします。 デプロイが期待どおりに動作することを確認し、後で既定のデプロイを更新します。 このプロセスの実装の詳細については、「新しいモデルをデプロイする」セクションを参照してください。

  12. バッチ エンドポイントとデプロイの詳細を確認します。

    show を使用して、エンドポイントとデプロイの詳細を確認します。 バッチ デプロイを確認するには、次のコードを実行します。

    DEPLOYMENT_NAME="mnist-torch-dpl"
    az ml batch-deployment show --name $DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME
    
  13. [ Batch エンドポイント ] タブを選択します。

    1. 表示するバッチ エンドポイントを選択します。

    2. エンドポイントの [詳細] ページには、エンドポイントの詳細と、エンドポイントで使用可能なすべてのデプロイが表示されます。

      バッチ エンドポイントとデプロイの詳細を確認しているスクリーンショット

バッチ エンドポイントを実行して結果にアクセスする

データ フローを理解する

バッチ エンドポイントを実行する前に、データがシステムを通過する方法を理解してください。

入力: 処理するデータ (スコア付け)。 これには次のものが含まれます。

  • Azure Storage (BLOB ストレージ、データ レイク) に保存されているファイル
  • 複数のファイルを含むフォルダー
  • Azure Machine Learning に登録されたデータセット

処理: デプロイされたモデルは、入力データをバッチ (ミニバッチ) で処理し、予測を生成します。

出力: モデルからの結果。Azure Storage にファイルとして格納されます。 既定では、出力はワークスペースの既定の BLOB ストレージに保存されますが、別の場所を指定することもできます。

バッチ エンドポイントを呼び出す

バッチ エンドポイントを呼び出すと、バッチ スコアリング ジョブがトリガーされます。 ジョブ name は呼び出し応答で返され、バッチ スコアリングの進行状況を追跡します。 エンドポイントがスコア付けするデータを検索できるように、入力データ パスを指定します。 次の例は、Azure Storage アカウントに格納されている MNIST データセットのサンプル データに対して新しいジョブを開始する方法を示しています。

Azure CLI、Azure Machine Learning SDK、REST エンドポイントを使用して、バッチ エンドポイントを呼び出して実行することができます。 これらのオプションの詳細については、「バッチ エンドポイントのジョブと入力データの作成」を参照してください。

Note

並列処理のしくみ

バッチデプロイは、ファイル レベルで作業を分散します。 たとえば、100 個のファイルと 10 個のファイルのミニ バッチを含むフォルダーでは、それぞれ 10 個のファイルから 10 個のバッチが生成されます。 これは、ファイル サイズに関係なく発生します。 ミニバッチで処理するにはファイルが大きすぎる場合は、小さなファイルに分割して並列処理を増やすか、ミニバッチあたりのファイル数を減らします。 現在、バッチ デプロイでは、ファイル サイズの分散のずれは考慮されていません。

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $SAMPLE_INPUT_URI --input-type uri_folder --query name -o tsv)

バッチ エンドポイントでは、さまざまな場所にあるファイルやフォルダーの読み取りがサポートされています。 サポートされているタイプとその指定方法の詳細については、「バッチ エンドポイント ジョブからのデータへのアクセス」を参照してください。

バッチ ジョブ実行の進行状況を監視する

バッチ スコアリング ジョブでは、すべての入力の処理に時間がかかります。

次のコードは、ジョブの状態を確認し、詳細が記載された Azure Machine Learning スタジオへのリンクを出力します。

az ml job show -n $JOB_NAME --web

バッチ スコアリングの結果を確認する

ジョブの出力は、クラウド ストレージに格納されます。これはワークスペースの既定の BLOB ストレージか指定したストレージのいずれかです。 既定値を変更する方法については、「出力の場所を構成する」を参照してください。 次の手順を実行すると、ジョブが完了したときに Azure Storage Explorer でスコアリング結果を表示できます。

  1. 次のコードを実行して、Azure Machine Learning スタジオでバッチ スコアリング ジョブを開きます。 ジョブのスタジオ リンクは、invoke の応答にも interactionEndpoints.Studio.endpoint の値として含まれています。

    az ml job show -n $JOB_NAME --web
    
  2. ジョブのグラフで、batchscoring ステップを選択します。

  3. [出力 + ログ] タブを選択し、[Show data outputs]\(データ出力の表示\) を選択します。

  4. [Data outputs]\(データ出力\) で、Storage Explorer を開くアイコンを選択します。

    データ出力場所ビューを示すスタジオのスクリーンショット。

    Storage Explorer のスコアリング結果は、次のサンプル ページのようになります。

    スコアリング出力のスクリーンショット。

出力の場所を構成する

既定では、バッチ スコアリングの結果は、ワークスペースの既定の BLOB ストアに、ジョブ (システム生成 GUID) にちなんだフォルダーに格納されます。 バッチ エンドポイントを呼び出すときの出力場所を構成します。

Azure Machine Learning の登録済みデータストア内でフォルダーを構成するには、output-path を使用します。 --output-path の構文は、フォルダーを指定する場合は --input と同じです。つまり、azureml://datastores/<datastore-name>/paths/<path-on-datastore>/ となります。 新しい出力ファイル名を構成するには、--set output_file_name=<your-file-name> を使用します。

OUTPUT_FILE_NAME=predictions_`echo $RANDOM`.csv
OUTPUT_PATH="azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME"

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $SAMPLE_INPUT_URI --output-path $OUTPUT_PATH --set output_file_name=$OUTPUT_FILE_NAME --query name -o tsv)

警告

一意の出力場所を使用する必要があります。 出力ファイルが存在する場合、バッチ スコアリング ジョブは失敗します。

重要

入力とは異なり、出力は BLOB ストレージ アカウントで実行される Azure Machine Learning データ ストアにのみ格納できます。

各ジョブごとにデプロイ構成を上書きする

バッチ エンドポイントを呼び出すときに、一部の設定を上書きしてコンピューティング リソースを最大限に活用し、パフォーマンスを向上させることができます。 この機能は、デプロイを完全に変更せずに、ジョブごとに異なる設定が必要な場合に便利です。

オーバーライドできる設定はどれですか?

次の設定は、ジョブごとに構成することができます。

設定 いつ使用するか サンプル シナリオ
インスタンス数 さまざまなデータ ボリュームがある場合 大規模なデータセットには、より多くのインスタンスを使用します (100 万ファイルの場合は 10 インスタンス、100,000 ファイルの場合は 2 インスタンス)。
ミニ バッチ サイズ スループットとメモリ使用量のバランスを取る必要がある場合 大きな画像には小さなバッチ (10 ~ 50 ファイル) を、小さなテキスト ファイルには大きなバッチ (100 ~ 500 ファイル) を使用します。
最大再試行回数 データ品質が異なる場合 ノイズの多いデータに対しては再試行回数を多く (5 から 10)、クリーンなデータに対しては再試行回数を少なく (1 から 3)
タイムアウト データ型によって処理時間が異なる場合 複雑なモデルに対してはタイムアウトを長く (300 秒)、単純なモデルに対してはタイムアウトを短く (30 秒)
エラーのしきい値 異なる障害許容レベルが必要な場合 重大なジョブに対しては厳密なしきい値 (-1)、試験的ジョブに対しては寛容なしきい値 (10%)

設定をオーバーライドする方法

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --mini-batch-size 20 --instance-count 5 --query name -o tsv)

デプロイをエンドポイントに追加する

バッチ エンドポイントにデプロイを追加した後も、引き続きモデルを改良して、新しいデプロイを追加できます。 ユーザーが新しいモデルを開発して同じエンド ポイントの下にデプロイする間、バッチ エンドポイントは引き続き、既定のデプロイに対応し続けます。 デプロイが相互に影響することはありません。

この例では、同じ MNIST の問題を解決するために、Keras と TensorFlow で構築されたモデルを使用する 2 つ目のデプロイを追加します。

2 つめのデプロイを追加する

  1. バッチデプロイ用の環境を作成します。 コードで実行する必要がある依存関係を含めます。 バッチデプロイに必要なライブラリ azureml-coreを追加します。 次の環境定義には、TensorFlow でモデルを実行するために必要なライブラリが含まれています。

    環境定義は、匿名環境としてデプロイ定義自体に含まれます。

    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. GitHub リポジトリからポータルに deployment-keras/environment/conda.yaml ファイルの内容をコピーします。

    1. [概要] ページが表示されるまで [次へ] を選択します。

    2. [作成] を選択し、環境が使用できる状態になるまで待ちます。


    使用した conda ファイルは次のようになります。

    deployment-keras/environment/conda.yaml

    name: tensorflow-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip
      - pip:
        - pandas
        - tensorflow
        - pillow
        - azureml-core
        - azureml-dataset-runtime[fuse]
    
  3. モデルのスコアリング スクリプトを作成します。

    deployment-keras/code/batch_driver.py

    import os
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from typing import List
    from os.path import basename
    from PIL import Image
    from tensorflow.keras.models import load_model
    
    
    def init():
        global model
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    
        # load the model
        model = load_model(model_path)
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        for image_path in mini_batch:
            data = Image.open(image_path)
            data = np.array(data)
            data_batch = tf.expand_dims(data, axis=0)
    
            # perform inference
            pred = model.predict(data_batch)
    
            # Compute probabilities, classes and labels
            pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
            pred_class = tf.math.argmax(pred, axis=-1).numpy()
    
            results.append(
                {
                    "file": basename(image_path),
                    "class": pred_class[0],
                    "probability": pred_prob,
                }
            )
    
        return pd.DataFrame(results)
    
  4. デプロイの定義を作成する

    deployment-keras/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-keras-dpl
    description: A deployment using Keras with TensorFlow to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model: 
      name: mnist-classifier-keras
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
    
  5. [ 次へ ] を選択して、[コード + 環境] ページに進みます。

    1. [Select a scoring script for inferencing]\(推論用のスコアリング スクリプトの選択\) で、deployment-keras/code/batch_driver.py スコアリング スクリプト ファイルを検索して選択します。

    2. [環境の選択] で、前の手順で作成した環境を選択します。

    3. [次へ]を選択します。

    4. [コンピューティング] ページで、前の手順で作成したコンピューティング クラスターを選択します。

    5. [インスタンス数] に、デプロイに必要なコンピューティング インスタンスの数を入力します。 この場合は、2 を使用します。

    6. [次へ]を選択します。

  6. デプロイを作成します。

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

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

    ヒント

    この例には、--set-default パラメーターがありません。 運用シナリオのベスト プラクティスとして、新しいデプロイを既定として設定せずに作成します。 次に、それを確認し、後で既定のデプロイを更新します。

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

既定以外の新しいデプロイをテストするには、実行するデプロイの名前を把握している必要があります。

DEPLOYMENT_NAME="mnist-keras-dpl"
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --deployment-name $DEPLOYMENT_NAME --input $SAMPLE_INPUT_URI --input-type uri_folder --query name -o tsv)

--deployment-name を使用して実行するデプロイを指定していることに注意してください。 このパラメーターを使用すると、バッチ エンドポイントの既定のデプロイは更新せずに、既定以外のデプロイをinvokeことができます。

既定のバッチ デプロイを更新する

エンドポイント内で特定のデプロイを呼び出すこともできますが、通常はエンドポイント自体を呼び出し、使用するデプロイはエンドポイントで決定されるようにします。 エンドポイントを呼び出すユーザーとの契約を変更することなく、既定のデプロイを変更する (その結果として、デプロイを提供するモデルが変更される) ことができます。 既定のデプロイを更新するには、次のコードを使用します。

az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

バッチ エンドポイントとデプロイを削除する

古いバッチデプロイが不要な場合は、次のコードを実行して削除します。 --yes フラグによって削除が確認されます。

az ml batch-deployment delete --name mnist-torch-dpl --endpoint-name $ENDPOINT_NAME --yes

次のコードを実行して、バッチ エンドポイントとその基になるデプロイを削除します。 バッチ スコアリング ジョブは削除されません。

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