バッチ エンドポイントのジョブと入力データを作成する

バッチ エンドポイントを使用すると、大量のデータに対して長いバッチ操作を実行できます。 このようなデータは、さまざまな場所に配置できます。 一部の種類のバッチ エンドポイントでは、リテラル パラメーターを入力として受け取ることもできます。 このチュートリアルでは、これらの入力を指定する方法と、サポートされているさまざまな種類や場所について説明します。

エンドポイントを呼び出す前に

適切にバッチ エンドポイントを呼び出してジョブを作成するには、以下がそろっていることを確認します。

  • バッチ エンドポイント デプロイを実行するためのアクセス許可を持っています。 AzureML データ サイエンティスト共同作成者所有者 の各ロールを使用して、デプロイを実行できます。 カスタム ロールの定義については、「バッチ エンドポイントでの認可」を参照して、必要な特定のアクセス許可を確認してください。

  • エンドポイントを呼び出すためのセキュリティ プリンシパルを表す有効な Microsoft Entra ID トークンを持っています。 このプリンシパルには、ユーザー プリンシパルまたはサービス プリンシパルを指定できます。 いずれの場合も、エンドポイントが呼び出されると、トークンに関連付けられている ID の下にバッチ デプロイ ジョブが作成されます。 テスト目的の場合は、以下に示すように、呼び出しに独自の資格情報を使用できます。

    Azure CLI を使用して、対話型認証またはデバイス コード認証を使ってサインインします。

    az login
    

    複数の資格情報を使って認証する方法については、「バッチ エンドポイントでの認可」を参照してください。

  • エンドポイントがデプロイされているコンピューティング クラスターは、入力データを読み取るアクセス権を持っています。

    ヒント

    資格情報のないデータ ストアまたは外部の Azure Storage アカウントをデータ入力として使う場合は、必ずデータ アクセス用にコンピューティング クラスターを構成してくださいコンピューティング クラスターのマネージド ID は、ストレージ アカウントをマウントするために使われます。 ジョブの ID (呼び出し元) は、基になるデータを読み取るために引き続き使用されるので、きめ細かいアクセス制御を実現できます。

ジョブの基本を作成する

バッチ エンドポイントからジョブを作成するには、呼び出す必要があります。 呼び出しは、Azure CLI、Azure Machine Learning SDK for Python、または REST API 呼び出しを使用して実行できます。 次の例は、処理用の単一の入力データ フォルダーを受け取るバッチ エンドポイントの呼び出しの基本を示しています。 さまざまな入力と出力の例については、「入力と出力の理解」を参照してください。

バッチ エンドポイントで invoke 操作を使用します。

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data

特定のデプロイを呼び出す

バッチ エンドポイントは、同じエンドポイントで複数のデプロイをホストできます。 ユーザーが特に指定しない限り、既定のエンドポイントが使われます。 次のように、使われるデプロイを変更できます。

引数 --deployment-name または -d を使ってデプロイの名前を指定します。

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --deployment-name $DEPLOYMENT_NAME \
                            --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data

ジョブのプロパティを構成する

作成されたジョブでは、呼び出し時にいくつかのプロパティを構成できます。

Note

ジョブのプロパティの構成は、現時点では、パイプライン コンポーネントのデプロイを使用するバッチ エンドポイントでのみ使用できます。

実験名を構成する

引数 --experiment-name を使って実験の名前を指定します。

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
                            --experiment-name "my-batch-job-experiment" \
                            --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data

入力と出力の理解

バッチ エンドポイントは、コンシューマーがバッチ ジョブの作成に使用できる永続的な API を提供します。 同じインターフェイスを使用して、デプロイで想定される入力と出力を指定できます。 入力を使用して、ジョブを実行するためにエンドポイントに必要な情報を渡します。

バッチ エンドポイントで入力と出力がどのように使用されるかを示す図。

バッチ エンドポイントは次の 2 種類の入力をサポートします。

  • データ入力。特定の保存場所または Azure Machine Learning 資産へのポインターです。
  • リテラル入力。ジョブに渡すリテラル値 (数値や文字列など) です。

入力と出力の数と種類は、バッチ デプロイの種類によって異なります。 モデル デプロイは、常に 1 つのデータ入力を必要とし、1 つのデータ出力を生成します。 リテラル入力はサポートされていません。 ただし、パイプライン コンポーネント デプロイを使用すると、エンドポイントを構築するためのより一般的なコンストラクトが提供され、任意の数の入力 (データとリテラル) と出力を指定できます。

次の表は、バッチ デプロイの入力と出力をまとめたものです。

デプロイの種類 入力の数 サポートされている入力の種類 出力の数 サポートされている出力の種類
モデル デプロイ 1 データ入力 1 データ出力
パイプライン コンポーネント デプロイ [0..N] データ入力リテラル入力 [0..N] データ出力

ヒント

入力と出力は常に名前付きです。 これらの名前は、呼び出し中にそれらを識別し、実際の値を渡すためのキーとして機能します。 モデル デプロイでは、常に 1 つの入力と出力が必要であるため、呼び出し中に名前は無視されます。 "sales_estimation" のように、ユース ケースを最もよく表す名前を割り当てることができます。

データ入力

データ入力とは、データが配置されている場所を指す入力のことです。 バッチ エンドポイントは通常、大量のデータを消費するため、呼び出し要求の一部として入力データを渡すことはできません。 代わりに、バッチ エンドポイントがデータを検索する場所を指定します。 パフォーマンスを向上させるために、入力データはターゲット コンピューティングにマウントされ、ストリーミングされます。

バッチ エンドポイントでは、次のストレージ オプションに配置されているファイルの読み取りがサポートされています。

  • Azure Machine Learning データ資産。フォルダー (uri_folder)、ファイル (uri_file) などです。
  • Azure Machine Learning データ ストア。Azure Blob Storage、Azure Data Lake Storage Gen1、Azure Data Lake Storage Gen2 などです。
  • Azure Storage アカウント。Azure Data Lake Storage Gen1、Azure Data Lake Storage Gen2、Azure Blob Storage などです。
  • ローカル データ フォルダーまたはファイル (Azure Machine Learning CLI または Azure Machine Learning SDK for Python)。 ただし、その操作により、作業中のワークスペースの既定の Azure Machine Learning データ ストアにローカル データがアップロードされます。

重要

非推奨の通知: 型 FileDataset (V1) のデータセットは非推奨となり、今後廃止される予定です。 この機能に依存する既存のバッチ エンドポイントは引き続き動作しますが、GA CLIv2 (2.4.0 以降) または GA REST API (2022-05-01 以降) で作成されたバッチ エンドポイントでは、V1 データセットはサポートされなくなります。

リテラル入力

リテラル入力とは文字列、数値、ブール値など、呼び出し時に表現および解決できる入力のことです。 通常は、リテラル入力を使用して、パイプライン コンポーネント デプロイの一部としてエンドポイントにパラメーターを渡します。 バッチ エンドポイントでは、次のリテラル型がサポートされています。

  • string
  • boolean
  • float
  • integer

リテラル入力は、パイプライン コンポーネントのデプロイでのみサポートされます。 それらを指定する方法については、「リテラル入力を使ってジョブを作成する」を参照してください。

データ出力

データ出力とは、バッチ ジョブの結果が配置される場所のことです。 出力は名前で識別され、Azure Machine Learning によって、名前付き出力のそれぞれに一意のパスが自動的に割り当てられます。 ただし、必要に応じて別のパスを指定することもできます。

重要

バッチ エンドポイントでは、Azure Blob Storage データストアでの出力の書き込みのみがサポートされます。 階層型名前空間が有効なストレージ アカウント (Azure Datalake Gen2 または ADLS Gen2 とも呼ばれます) に書き込む必要がある場合、サービスは完全に互換性があるため、そのようなストレージ サービスを Azure Blob Storage データストアとして登録できることに注意してください。 このように、バッチ エンドポイントからの出力を ADLS Gen2 に書き込むことができます。

データ入力を使ってジョブを作成する

次の例は、データ資産データ ストアAzure Storage アカウントからデータ入力を取得してジョブを作成する方法を示しています。

データ資産からデータを入力する

Azure Machine Learning のデータ資産 (以前のデータセット) は、ジョブへの入力としてサポートされています。 Azure Machine Learning の登録済みデータ資産に格納されているデータを使用してバッチ エンドポイント ジョブを実行するには、次の手順に従います。

警告

型 Table (MLTable) のデータ資産は、現在サポートされていません。

  1. 最初にデータ資産を作成します。 このデータ資産は、バッチ エンドポイントを使って並列処理する複数の CSV ファイルを含む、1 つのフォルダーで構成されています。 データが既にデータ資産として登録されている場合は、この手順をスキップできます。

    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: heart-classifier-mlflow/data
    

    次にデータ資産を作成します。

    az ml data create -f heart-dataset-unlabeled.yml
    
  2. 入力または要求を作成します。

    DATASET_ID=$(az ml data show -n heart-dataset-unlabeled --label latest | jq -r .id)
    

    Note

    データ資産の ID は /subscriptions/<subscription>/resourcegroups/<resource-group>/providers/Microsoft.MachineLearningServices/workspaces/<workspace>/data/<data-asset>/versions/<version> のようになります。 入力を指定する方法として azureml:/<datasset_name>@latest を使用することもできます。

  3. エンドポイントを実行します。

    --set 引数を使用して入力を指定します。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_dataset.type="uri_folder" inputs.heart_dataset.path=$DATASET_ID
    

    モデル デプロイにサービスを提供するエンドポイントの場合、--input 引数を使用してデータ入力を指定できます。これは、モデルのデプロイで必要なデータ入力が常に 1 つだけであるためです。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $DATASET_ID
    

    複数の入力が指定されている場合、引数 --set は長いコマンドを生成する傾向があります。 そのような場合は、YAML ファイルに入力を配置し、--file を使用して、エンドポイント呼び出しに必要な入力を指定します。

    inputs.yml

    inputs:
      heart_dataset: azureml:/<datasset_name>@latest
    
    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml
    

データ ストアからデータを入力する

Azure Machine Learning の登録されたデータ ストアからのデータは、バッチ デプロイ ジョブで直接参照できます。 この例では、まず Azure Machine Learning ワークスペース内の既定のデータ ストアにある程度のデータをアップロードした後、それに対してバッチ デプロイを実行します。 データ ストアの格納データを使用してバッチ エンドポイント ジョブを実行するには、次の手順に従います。

  1. Azure Machine Learning ワークスペースの既定のデータ ストアにアクセスします。 データが別のストアにある場合は、代わりにそのストアを使用できます。 既定のデータ ストアを使用しなくてもかまいません。

    DATASTORE_ID=$(az ml datastore show -n workspaceblobstore | jq -r '.id')
    

    注意

    データ ストア ID は /subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.MachineLearningServices/workspaces/<workspace>/datastores/<data-store> のようになります。

    ヒント

    ワークスペース内の既定の BLOB データ ストアは workspaceblobstore と呼ばれます。 ワークスペース内の既定のデータ ストアのリソース ID が既にわかっている場合は、この手順をスキップできます。

  2. サンプル データをデータ ストアにアップロードする必要があります。 この例では、リポジトリに含まれるサンプル データを、BLOB ストレージ アカウントのフォルダー heart-disease-uci-unlabeled にあるフォルダー sdk/python/endpoints/batch/deploy-models/heart-classifier-mlflow/data に既にアップロード済みであることを前提としています。 先に進む前に、それが完了していることを確認してください。

  3. 入力または要求を作成します。

    ファイル パスを次の変数に配置します。

    DATA_PATH="heart-disease-uci-unlabeled"
    INPUT_PATH="$DATASTORE_ID/paths/$DATA_PATH"
    

    注意

    パス paths がデータ ストアのリソース ID に追加され、後に続く文字がその内部のパスであることを示していることを確認してください。

    ヒント

    入力を指定する方法として azureml://datastores/<data-store>/paths/<data-path> を使用することもできます。

  4. エンドポイントを実行します。

    --set 引数を使用して入力を指定します。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_dataset.type="uri_folder" inputs.heart_dataset.path=$INPUT_PATH
    

    モデル デプロイにサービスを提供するエンドポイントの場合、--input 引数を使用してデータ入力を指定できます。これは、モデルのデプロイで必要なデータ入力が常に 1 つだけであるためです。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $INPUT_PATH --input-type uri_folder
    

    複数の入力が指定されている場合、引数 --set は長いコマンドを生成する傾向があります。 そのような場合は、YAML ファイルに入力を配置し、--file を使用して、エンドポイント呼び出しに必要な入力を指定します。

    inputs.yml

    inputs:
      heart_dataset:
        type: uri_folder
        path: azureml://datastores/<data-store>/paths/<data-path>
    
    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml
    

    データがファイルの場合は、種類として代わりに uri_file を使用します。

Azure Storage からデータを入力する

Azure Machine Learning バッチ エンドポイントでは、Azure Storage アカウント内のクラウドの場所 (パブリックとプライベートの両方) からデータを読み取ることができます。 ストレージ アカウントに格納されているデータを使用してバッチ エンドポイント ジョブを実行するには、次の手順に従います。

Note

ストレージ アカウントからデータを適切に読み取るために必要な追加の構成については、「データ アクセス用にコンピューティング クラスターを構成する」セクションを参照してください。

  1. 入力または要求を作成します。

    INPUT_DATA = "https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data"
    

    データがファイルの場合:

    INPUT_DATA = "https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data/heart.csv"
    
  2. エンドポイントを実行します。

    --set 引数を使用して入力を指定します。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_dataset.type="uri_folder" inputs.heart_dataset.path=$INPUT_DATA
    

    モデル デプロイにサービスを提供するエンドポイントの場合、--input 引数を使用してデータ入力を指定できます。これは、モデルのデプロイで必要なデータ入力が常に 1 つだけであるためです。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME --input $INPUT_DATA --input-type uri_folder
    

    複数の入力が指定されている場合、引数 --set は長いコマンドを生成する傾向があります。 そのような場合は、YAML ファイルに入力を配置し、--file を使用して、エンドポイント呼び出しに必要な入力を指定します。

    inputs.yml

    inputs:
      heart_dataset:
        type: uri_folder
        path: https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data
    
    az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml
    

    データがファイルの場合は、種類として代わりに uri_file を使用します。

リテラル入力を使ってジョブを作成する

パイプライン コンポーネントのデプロイでは、リテラル入力を受け取ることができます。 次の例は、名前が score_mode、型が string、値が append の入力を指定する方法を示します。

YAML ファイルに入力を配置し、--file を使用して、エンドポイント呼び出しに必要な入力を指定します。

inputs.yml

inputs:
  score_mode:
    type: string
    default: append
az ml batch-endpoint invoke --name $ENDPOINT_NAME --file inputs.yml

引数 --set を使用して値を指定することもできます。 ただし、複数の入力が指定されている場合、長いコマンドを生成する傾向があります。

az ml batch-endpoint invoke --name $ENDPOINT_NAME \
    --set inputs.score_mode.type="string" inputs.score_mode.default="append"

データ出力を使ってジョブを作成する

次の例は、score という名前の出力が配置される場所を変更する方法を示しています。 完全にするために、これらの例では heart_dataset という名前の入力も構成します。

  1. 出力の保存には、Azure Machine Learning ワークスペース内の既定のデータ ストアを使用します。 BLOB ストレージ アカウントであれば、ワークスペース内の他の任意のデータ ストアを使用できます。

    DATASTORE_ID=$(az ml datastore show -n workspaceblobstore | jq -r '.id')
    

    注意

    データ ストア ID は /subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.MachineLearningServices/workspaces/<workspace>/datastores/<data-store> のようになります。

  2. データ出力を作成します。

    DATA_PATH="batch-jobs/my-unique-path"
    OUTPUT_PATH="$DATASTORE_ID/paths/$DATA_PATH"
    

    完全にするために、データ入力も作成します。

    INPUT_PATH="https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data"
    

    注意

    パス paths がデータ ストアのリソース ID に追加され、後に続く文字がその内部のパスであることを示していることを確認してください。

  3. デプロイを実行します。

    引数 --set を使用して入力を指定します。

    az ml batch-endpoint invoke --name $ENDPOINT_NAME \
        --set inputs.heart_dataset.path=$INPUT_PATH \
        --set outputs.score.path=$OUTPUT_PATH
    

次のステップ