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

適用対象:Azure CLI ml extension v2 (現行)Python SDK azure-ai-ml v2 (現行)

バッチ エンドポイントは、大量のデータに対して推論を実行するモデルをデプロイするための便利な方法を提供します。 これらのエンドポイントを使用すると、バッチ スコアリングのモデルをホストするプロセスが単純化され、インフラストラクチャに気を取られることなく、機械学習に専念することができます。

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

  • 推論の実行に長い時間がかかるコストの高いモデルがある。
  • 複数のファイルに分散された大量のデータに対して推論を実行する必要がある。
  • 低遅延を必要としない
  • 並列処理の恩恵を受けることができる

この記事では、バッチ エンドポイントを使用して、従来の MNIST (Modified National Institute of Standards and Technology) の数字認識問題を解決する機械学習モデルをデプロイします。 その後、デプロイされたモデルは、大量のデータ (この場合はイメージ ファイル) に対してバッチ推論を実行します。 まず、Torch を使用して作成されたモデルのバッチ デプロイを作成します。 このデプロイが、エンドポイントにおける既定のデプロイとなります。 後で、TensorFlow (Keras) で作成されたモードの 2 つ目のデプロイを作成し、2 つ目のデプロイをテストしてから、エンドポイントの既定のデプロイとして設定します。

この記事のコマンドをローカルで実行するために必要なコード サンプルとファイルについては、「サンプル リポジトリを複製する」セクションを参照してください。 コード サンプルとファイルは、azureml-examples リポジトリに含まれています。

前提条件

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

  • 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 リージョン内で一意である必要があります。 たとえば、westus2 に存在できる mybatchendpoint という名前のバッチ エンドポイントは 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 スキーマ」を参照してください。

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

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

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

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

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

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

    ヒント

    モデルは、エンドポイントではなくデプロイに関連付けられます。 つまり、エンドポイントが異なるデプロイにデプロイされている限り、同じエンドポイントの下、1 つのエンドポイントを異なるモデル (またはモデル バージョン) で使用することができるということです。

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

    注意

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

    警告

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

    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. [新しい展開の定義を作成する]

    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 スキーマ」を参照してください。

    Key 説明
    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 を使用して環境をインラインで定義しています。 image 上に conda_file の依存関係がインストールされます。 環境は、自動生成された名前とバージョンで自動的に登録されます。 その他のオプションについては、環境スキーマに関する記事を参照してください。 運用シナリオのベスト プラクティスとして、環境を別途作成し、ここで参照することをお勧めします。 既存の環境を参照するには、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 という名前の 1 つのファイルにマージされます。 summary_only を使用すると、出力結果はマージされず、error_threshold の計算だけが行われます。
    settings.output_file_name [省略可能] append_rowoutput_action のバッチ スコアリング出力ファイルの名前。
    settings.retry_settings.max_retries [省略可能] scoring_scriptrun() が失敗した場合の最大再試行回数。
    settings.retry_settings.timeout [省略可能] ミニ バッチをスコアリングするための scoring_scriptrun() に適用するタイムアウト (秒単位)。
    settings.error_threshold [省略可能] 無視する必要がある入力ファイルのスコアリング エラーの数。 入力全体でのエラーの数がこの値を超えると、ジョブは終了します。 この例では -1 を使用しています。これは、バッチ スコアリング ジョブを終了することなく、任意の数のエラーが許容されることを示します。
    settings.logging_level [省略可能] ログの詳細度。 値は詳細度が低い順に WARNING、INFO、DEBUG です。
    settings.environment_variables [省略可能] バッチ スコアリング ジョブごとに設定される環境変数の名前と値のペアの辞書。
  5. デプロイを作成します。

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

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

    ヒント

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

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

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

    DEPLOYMENT_NAME="mnist-torch-dpl"
    az ml batch-deployment show --name $DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME
    

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

バッチ エンドポイントを呼び出すと、バッチ スコアリング ジョブがトリガーされます。 ジョブ name は呼び出しの応答から返され、バッチ スコアリングの進行状況を追跡するために使用できます。 バッチ エンドポイントでスコアリングのためにモデルを実行する場合は、入力データへのパスを指定する必要があります。これにより、エンドポイントがスコアリング対象のデータを見つけることができます。 次の例は、Azure Storage アカウントに格納されている MNIST データセットのサンプル データに対して新しいジョブを開始する方法を示しています。

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

Note

並列処理のしくみ

バッチ デプロイでは、作業はファイル レベルで分散されます。つまり、10 ファイルのミニバッチを持つ 100 ファイルを含むフォルダーからは、それぞれ 10 ファイルの 10 バッチが生成されます。 これは、対象となるファイルのサイズに関係なく行われることに注意してください。 ファイルが大きすぎて大きなミニバッチで処理できない場合は、ファイルをより小さなファイルに分割して並列処理の数を増やすか、ミニバッチあたりのファイル数を減らすことをお勧めします。 現時点では、バッチ デプロイでファイルのサイズ配分のばらつきを考慮することはできません。

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --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 https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --output-path $OUTPUT_PATH --set output_file_name=$OUTPUT_FILE_NAME --query name -o tsv)

警告

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

重要

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

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

バッチ エンドポイントを呼び出すときに、コンピューティング リソースを最大限に活用し、パフォーマンスを向上させるために、一部の設定を上書きすることができます。 次の設定は、ジョブごとに構成できます。

  • インスタンス数: この設定を使用して、コンピューティング クラスターから要求するインスタンスの数を上書きします。 たとえば、データ入力の量が多い場合は、より多くのインスタンスを使用して、エンド ツー エンドのバッチ スコアリングを高速化することができます。
  • ミニバッチ サイズ: この設定を使用して、各ミニバッチに含めるファイルの数を上書きします。 ミニ バッチの数は、入力ファイルの合計数とミニバッチ サイズによって決まります。 ミニバッチ サイズが小さいと、生成されるミニ バッチが多くなります。 ミニ バッチは並列で実行できますが、追加のスケジューリングと呼び出しのオーバーヘッドが発生する可能性があります。
  • 最大再試行回数タイムアウトエラーしきい値など、その他の設定を上書きすることができます。 これらの設定は、さまざまなワークロードを対象にしたエンド ツー エンドのバッチ スコアリング時間に影響を及ぼす可能性があります。
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
    

    使用した 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]
    
  2. モデルのスコアリング スクリプトを作成します。

    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)
    
  3. [新しい展開の定義を作成する]

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

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

    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 https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --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