CLI を使用したリアルタイム推論のためにフローをオンライン エンドポイントにデプロイする

この記事では、Azure Machine Learning v2 CLI を使用したリアルタイム推論で使用するために、 マネージド オンライン エンドポイントまたは Kubernetes オンライン エンドポイント にフローをデプロイする方法について説明します。

開始する前に、フローが適切にテストされ、本番環境にデプロイする準備ができていることを確認してください。 フローのテストの詳細については、フローのテストを参照してください。 フローのテスト後、マネージド オンライン エンドポイントとデプロイを作成する方法と、リアルタイム推論にエンドポイントを使用する方法について説明します。

  • この記事では、CLI エクスペリエンスの使用方法について説明します。
  • この記事では、Python SDK については取り上げません。 代わりに GitHub サンプル ノートブックを参照してください。 Python SDK を使用するには、Azure Machine Learning 用の Python SDK v2 が必要です。 詳細については、「Azure Machine Learning 用の Python SDK v2 のインストール」を参照してください。

重要

この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 プレビュー バージョンはサービス レベル アグリーメントなしで提供されています。運用環境のワークロードに使用することはお勧めできません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

前提条件

  • Azure CLI と Azure CLI に対する Azure Machine Learning の拡張機能。 詳しくは、CLI (v2) のインストール、設定、使用に関するページをご覧ください。
  • Azure Machine Learning ワークスペース。 所有していない場合は、クイック スタート: ワークスペース リソースの作成に関する記事の手順に従って作成してください。
  • Azure ロールベースのアクセス制御 (Azure RBAC) は、Azure Machine Learning の操作に対するアクセスを許可するために使用されます。 この記事の手順を実行するには、ユーザー アカウントに、Azure Machine Learning ワークスペースの所有者か共同作成者ロール、または "Microsoft.MachineLearningServices/workspaces/onlineEndpoints/" を許可するカスタム ロールを割り当てる必要があります。 スタジオを使ってオンライン エンドポイントやデプロイを作成または管理する場合は、リソース グループ所有者から追加のアクセス許可 "Microsoft.Resources/deployments/write" が必要です。 詳細については、「Azure Machine Learning ワークスペースへのアクセスの管理」を参照してください。

Note

マネージド オンライン エンドポイントがサポートするのは、マネージド仮想ネットワークだけです。 ワークスペースがカスタム vnet 内にある場合は、Kubernetes オンライン エンドポイントにデプロイするか、Docker などの他のプラットフォームにデプロイすることができます。

デプロイのための仮想マシン クォータの割り当て

マネージド オンライン エンドポイントの場合、Azure Machine Learning では、アップグレードを実行するためにコンピューティング リソースの 20% が予約されます。 そのため、デプロイで特定の数のインスタンスを要求する場合は、使用可能な ceil(1.2 * number of instances requested for deployment) * number of cores for the VM SKU のクォータを確保して、エラーが発生しないようにする必要があります。 たとえば、デプロイで Standard_DS3_v2 VM (4 コアを搭載) の 10 個のインスタンスを要求する場合は、使用可能な 48 コア (12 インスタンス 4 コア) のクォータが必要です。 使用状況を確認してクォータの増加を要求するには、「Azure portal で使用状況とクォータを表示する」を参照してください。

フローをデプロイする準備をする

各フローには、フローのコード/プロンプト、定義、およびその他の成果物を含むフォルダーがあります。 UI を使用してフローを開発した場合は、フローの詳細ページから フロー フォルダーをダウンロードできます。 CLI または SDK を使用してフローを開発した場合は、フロー フォルダーが既にあるはずです。

この記事では、Azure Machine Learning マネージド オンライン エンドポイントにデプロイする例として、 サンプル フロー "basic-chat" を使用します。

重要

フローで additional_includes を使用している場合は、最初に pf flow build --source <path-to-flow> --output <output-path> --format docker を使用して、解決済みのバージョンのフロー フォルダーを取得する必要があります。

既定のワークスペースを設定する

CLI の既定のワークスペースとリソース グループを設定するには、次のコマンドを使用します。

az account set --subscription <subscription ID>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>

フローをモデルとして登録する (省略可能)

オンライン デプロイでは、登録済みモデルを参照するか、インラインでモデル パス (モデル ファイルのアップロード元) を指定できます。 モデルを登録し、デプロイ定義でモデル名とバージョンを指定することを推奨します。 model:<model_name>:<version> の形式を使用します。

チャット フローのモデル定義の例を次に示します。

Note

フローがチャット フローでない場合は、これらの properties を追加する必要はありません。

$schema: https://azuremlschemas.azureedge.net/latest/model.schema.json
name: basic-chat-model
path: ../../../../examples/flows/chat/basic-chat
description: register basic chat flow folder as a custom model
properties:
  # In AuzreML studio UI, endpoint detail UI Test tab needs this property to know it's from prompt flow
  azureml.promptflow.source_flow_id: basic-chat
  
  # Following are properties only for chat flow 
  # endpoint detail UI Test tab needs this property to know it's a chat flow
  azureml.promptflow.mode: chat
  # endpoint detail UI Test tab needs this property to know which is the input column for chat flow
  azureml.promptflow.chat_input: question
  # endpoint detail UI Test tab needs this property to know which is the output column for chat flow
  azureml.promptflow.chat_output: answer

az ml model create --file model.yaml を使用してモデルをワークスペースに登録します。

エンドポイントを定義する

エンドポイントを定義するには、以下を指定する必要があります。

  • [エンドポイント名] : エンドポイントの名前。 Azure リージョンで一意である必要があります。 名前付け規則の詳細については、「エンドポイントの制限」を参照してください。
  • 認証モード: エンドポイントの認証方法。 キーベースの認証と Azure Machine Learning トークンベースの認証のどちらかを選択します。 キーには有効期限がありませんが、トークンには有効期限があります。 認証の詳細については、オンライン エンドポイントの認証に関する記事を参照してください。 必要に応じて、エンドポイントに説明やタグを追加できます。
  • 必要に応じて、エンドポイントに説明やタグを追加できます。
  • ワークスペースにアタッチされている Kubernetes クラスター (AKS または Arc 対応クラスター) にデプロイする場合は、Kubernetes オンライン エンドポイントとしてフローをデプロイできます。

既定でシステム割り当て ID を使用するエンドポイント定義の例を次に示します。

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: basic-chat-endpoint
auth_mode: key
properties:
# this property only works for system-assigned identity.
# if the deploy user has access to connection secrets, 
# the endpoint system-assigned identity will be auto-assigned connection secrets reader role as well
  enforce_access_to_default_secret_stores: enabled
Key 説明
$schema (省略可能) YAML スキーマ。 上記のコード スニペットをブラウザーで表示すると、YAML ファイルで使用可能なすべてのオプションを確認できます。
name エンドポイントの名前。
auth_mode キーベースの認証に key を使用します。 Azure Machine Learning のトークン ベースの認証に aml_token を使用します。 最新のトークンを取得するには、az ml online-endpoint get-credentials コマンドを使用します。
property: enforce_access_to_default_secret_stores (プレビュー) - 既定では、エンドポイントはシステム割り当て ID を使用します。 このプロパティは、システム割り当て ID に対してのみ機能します。
- このプロパティは、接続シークレット閲覧者アクセス許可がある場合、エンドポイント システム割り当て ID に、ワークスペースの Azure Machine Learning ワークスペース接続シークレット閲覧者ロールが自動的に割り当てられることを意味します。そのため、推論の実行時にエンドポイントが接続に正しくアクセスできます。
既定では、このプロパティは `無効` になっています。

Kubernetes オンライン エンドポイントを作成する場合は、次の追加属性を指定する必要があります。

Key 説明
compute エンドポイントをデプロイする Kubernetes コンピューティング ターゲット。

エンドポイントのその他の構成については、「マネージド オンライン エンドポイント スキーマ」を参照してください。

重要

フローで Microsoft Entra ID ベース認証の接続を使う場合は、システム割り当て ID を使うかユーザー割り当て ID を使うかに関わらず、常にマネージド ID に対して対応するリソースの適切なロールを付与して、マネージド ID がそのリソースに対する API 呼び出しを行えるようにする必要があります。 たとえば、Azure OpenAI 接続で Microsoft Entra ID ベースの認証を使う場合は、エンドポイント マネージド ID に対して、対応する Azure OpenAI リソースの Cognitive Services OpenAI ユーザーまたは Cognitive Services OpenAI 共同作成者ロールを付与する必要があります。

ユーザー割り当て ID を使う

既定では、オンライン エンドポイントを作成すると、システム割り当てマネージド ID が自動的に生成されます。 また、エンドポイントに既存のユーザー割り当てマネージド ID を指定することもできます。

ユーザー割り当ての ID を使う場合は、endpoint.yaml で次の追加属性を指定できます。

identity:
  type: user_assigned
  user_assigned_identities:
    - resource_id: user_identity_ARM_id_place_holder

さらに、次のように、deployment.yamlenvironment_variables の下でユーザー割り当て ID の Client ID を指定する必要もあります。 Client ID は、Azure portal のマネージド ID の Overview にあります。

environment_variables:
  AZURE_CLIENT_ID: <client_id_of_your_user_assigned_identity>

重要

Azure リソースにアクセスして推論を実行できるようにするには、エンドポイントを作成する前に、ユーザー割り当て ID に次のアクセス許可を付与する必要があります。 詳しくは、「エンドポイント ID にアクセス許可を付与する方法」をご覧ください。

Scope ロール 必要な理由
Azure Machine Learning ワークスペース Azure Machine Learning ワークスペース接続シークレット閲覧者ロールまたは "Microsoft.MachineLearningServices/workspaces/connections/listsecrets/action" を持つカスタマイズされたロール ワークスペース接続の取得
ワークスペース コンテナー レジストリ ACR のプル コンテナー イメージのプル
ワークスペースの既定のストレージ ストレージ BLOB データ閲覧者 ストレージからのモデルの読み込み
(省略可能) Azure Machine Learning ワークスペース ワークスペース メトリック ライター エンドポイントをデプロイした後、CPU、GPU、ディスク、メモリ使用率などのエンドポイント関連のメトリックを監視する場合は、このアクセス許可を ID に付与する必要があります。

デプロイを定義する

デプロイは、実際の推論を実行するモデルをホストするのに必要なリソースのセットです。

次に、model セクションが登録済みのフロー モデルを参照するデプロイ定義の例を示します。 フロー モデルのパスを行で指定することもできます。

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: basic-chat-endpoint
model: azureml:basic-chat-model:1
  # You can also specify model files path inline
  # path: examples/flows/chat/basic-chat
environment: 
  image: mcr.microsoft.com/azureml/promptflow/promptflow-runtime:latest
  # inference config is used to build a serving container for online deployments
  inference_config:
    liveness_route:
      path: /health
      port: 8080
    readiness_route:
      path: /health
      port: 8080
    scoring_route:
      path: /score
      port: 8080
instance_type: Standard_E16s_v3
instance_count: 1
environment_variables:
  # for pulling connections from workspace
  PRT_CONFIG_OVERRIDE: deployment.subscription_id=<subscription_id>,deployment.resource_group=<resource_group>,deployment.workspace_name=<workspace_name>,deployment.endpoint_name=<endpoint_name>,deployment.deployment_name=<deployment_name>

  # (Optional) When there are multiple fields in the response, using this env variable will filter the fields to expose in the response.
  # For example, if there are 2 flow outputs: "answer", "context", and I only want to have "answer" in the endpoint response, I can set this env variable to '["answer"]'.
  # If you don't set this environment, by default all flow outputs will be included in the endpoint response.
  # PROMPTFLOW_RESPONSE_INCLUDED_FIELDS: '["category", "evidence"]'
属性 内容
名前 デプロイの名前。
エンドポイント名 デプロイを作成するエンドポイントの名前。
モデル デプロイに使用するモデル。 この値は、ワークスペース内の既存のバージョン管理されたモデルへの参照またはインライン モデルの仕様のいずれかです。
環境 モデルとコードをホスティングする環境。 その構成要素を次に示します。
- image
- inference_config: は、liveness routereadiness_routescoring_route を含むオンライン デプロイ用のサービス コンテナーを構築するために使用されます。
インスタンスの種類 デプロイに使用する VM サイズ。 サポートされているサイズの一覧については、マネージド オンライン エンドポイント SKU の一覧に関するページを参照してください。
インスタンス数 デプロイに使用するインスタンスの数。 想定されるワークロードに基づく値を指定します。 高可用性を実現するために、この値を少なくとも 3 に設定することをお勧めします。 アップグレードを実行するために 20% 余分に予約されています。 詳細については、「オンライン エンドポイントの制限」を参照してください。
環境変数 フローからデプロイされるエンドポイントには、次の環境変数を設定する必要があります。
- (必須) PRT_CONFIG_OVERRIDE: ワークスペースから接続をプルする場合
- (省略可能) PROMPTFLOW_RESPONSE_INCLUDED_FIELDS:: 応答に複数のフィールドがある場合、この env 変数を使用すると、応答に公開するフィールドをフィルター処理できます。
たとえば、"answer"、"context" という 2 つのフロー出力があり、エンドポイントの応答に "answer" のみを含める場合は、この env 変数を '["answer"]' に設定します。

重要

フローの実行に必要な依存関係を含む requirements.txt ファイルがフロー フォルダー内にある場合は、カスタム環境を使ったデプロイの手順に従って、依存関係を含むカスタム環境を構築する必要があります。

Kubernetes オンライン デプロイを作成する場合は、次の追加属性を指定する必要があります。

属性 説明
Type デプロイの種類。 この値を kubernetes に設定します。
インスタンスの種類 デプロイに使用する kubernetes クラスターで作成したインスタンスの種類は、デプロイの要求/制限コンピューティング リソースを表します。 詳細については、「インスタンスの種類を作成し管理する」を参照してください。

オンライン エンドポイントを Azure にデプロイする

クラウドにエンドポイントを作成するには、次のコードを実行します。

az ml online-endpoint create --file endpoint.yml

エンドポイントの下に blue という名前のデプロイを作成するには、次のコードを実行します。

az ml online-deployment create --file blue-deployment.yml --all-traffic

Note

このデプロイには、15 分以上かかる場合があります。

ヒント

CLI コンソールをブロックしたくない場合は、コマンドに --no-wait フラグを追加してください。 ただし、この場合、デプロイ状態が対話的に表示されなくなります。

重要

上記の az ml online-deployment create--all-traffic フラグを指定すると、エンドポイント トラフィックの 100% が、新しく作成されたブルー デプロイに割り当てられます。 これは開発とテストのために役立ちますが、運用環境では、明示的なコマンドを使用して、新しいデプロイへのトラフィックを開くことができます。 たとえば、「 az ml online-endpoint update -n $ENDPOINT_NAME --traffic "blue=100" 」のように入力します。

エンドポイントとデプロイの状態を確認する

エンドポイントの状態を確認するには、次のコードを実行します。

az ml online-endpoint show -n basic-chat-endpoint

デプロイの状態を確認するには、次のコードを実行します。

az ml online-deployment get-logs --name blue --endpoint basic-chat-endpoint

エンドポイントを呼び出し、モデルを使用してデータをスコアリングする

次のように sample-request.json ファイルを作成できます。

{
  "question": "What is Azure Machine Learning?",
  "chat_history":  []
}
az ml online-endpoint invoke --name basic-chat-endpoint --request-file sample-request.json

これを curl などの HTTP クライアントで呼び出すこともできます。

ENDPOINT_KEY=<your-endpoint-key>
ENDPOINT_URI=<your-endpoint-uri>

curl --request POST "$ENDPOINT_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data '{"question": "What is Azure Machine Learning?", "chat_history":  []}'

エンドポイント キーとエンドポイント URI は、[エンドポイント]>[使用]>[基本消費量に関する情報] で Azure Machine Learning ワークスペースから取得できます。

詳細な構成

フロー開発とは異なる接続を使用してデプロイする

デプロイ中にフローの接続をオーバーライドできます。

たとえば、flow.dag.yaml ファイルで my_connection という名前の接続が使用されている場合は、次のようにデプロイ yaml の環境変数を追加することでオーバーライドできます。

オプション 1: 接続名をオーバーライドする

environment_variables:
  my_connection: <override_connection_name>

接続の特定のフィールドをオーバーライドしたい場合は、<connection_name>_<field_name> という名前付けパターンを使用して環境変数を追加することでオーバーライドを行えます。 たとえば、フローで my_connection という名前の接続と chat_deployment_name という構成キーを使用している場合、サービス バックエンドは既定で 'MY_CONNECTION_CHAT_DEPLOYMENT_NAME' という環境変数から chat_deployment_name を取得することを試みます。 この環境変数が設定されていない場合は、フロー定義の元の値が使用されます。

オプション 2: 資産を参照してオーバーライドする

environment_variables:
  my_connection: ${{azureml://connections/<override_connection_name>}}

Note

同じワークスペース内の接続のみを参照できます。

カスタム環境を使用してデプロイする

このセクションでは、Docker ビルドのコンテキストを使用してデプロイの環境を指定する方法について説明します。これは、DockerAzure Machine Learning 環境についての知識があることを前提としています。

  1. ローカル環境で、次のファイルを含む image_build_with_reqirements という名前のフォルダーを作成します。

    |--image_build_with_reqirements
    |  |--requirements.txt
    |  |--Dockerfile
    
    • requirements.txt をフロー フォルダーから継承する必要があります。これは、フローの依存関係を追跡するために使用されています。

    • Dockerfile コンテンツは次のとおりです。

      FROM mcr.microsoft.com/azureml/promptflow/promptflow-runtime:latest
      COPY ./requirements.txt .
      RUN pip install -r requirements.txt
      
  2. デプロイ定義 yaml ファイルの環境セクションを次の内容に置き換えます。

    environment: 
      build:
        path: image_build_with_reqirements
        dockerfile_path: Dockerfile
      # deploy prompt flow is BYOC, so we need to specify the inference config
      inference_config:
        liveness_route:
          path: /health
          port: 8080
        readiness_route:
          path: /health
          port: 8080
        scoring_route:
          path: /score
          port: 8080
    

FastAPI サービス エンジンを使う (プレビュー)

既定では、プロンプト フロー サービスは FLASK サービス エンジンを使います。 プロンプト フロー SDK バージョン 1.10.0 以降では、FastAPI ベースのサービス エンジンがサポートされています。 fastapi サービス エンジンを使うには、環境変数 PROMPTFLOW_SERVING_ENGINE を指定します。

environment_variables:
  PROMPTFLOW_SERVING_ENGINE=fastapi

デプロイのコンカレンシーを構成する

オンライン デプロイにフローをデプロイする場合、コンカレンシーのために構成する環境変数が 2 つあります。PROMPTFLOW_WORKER_NUMPROMPTFLOW_WORKER_THREADS です。 さらに、max_concurrent_requests_per_instance パラメーターも設定する必要があります。

deployment.yaml ファイルでの構成方法の例を次に示します。

request_settings:
  max_concurrent_requests_per_instance: 10
environment_variables:
  PROMPTFLOW_WORKER_NUM: 4
  PROMPTFLOW_WORKER_THREADS: 1
  • PROMPTFLOW_WORKER_NUM: このパラメーターを使うと、1 つのコンテナー内で開始されるワーカー (プロセス) 数を決定できます。 既定値は CPU コア数と等しく、最大値は CPU コア数の 2 倍です。

  • PROMPTFLOW_WORKER_THREADS: このパラメーターを使うと、1 つのワーカーで開始されるスレッド数を決定できます。 既定値は 1です。

    Note

    PROMPTFLOW_WORKER_THREADS を 1 より大きい値に設定する場合は、フロー コードがスレッドセーフであることを確認します。

  • max_concurrent_requests_per_instance: デプロイで許容するインスタンスごとの同時要求の最大数。 既定値は 10 です。

    max_concurrent_requests_per_instance の推奨値は要求時間によって変わります。

    • 要求時間が 200 ms を超える場合は、max_concurrent_requests_per_instancePROMPTFLOW_WORKER_NUM * PROMPTFLOW_WORKER_THREADS に設定します。
    • 要求時間が 200 ms 秒以下の場合は、max_concurrent_requests_per_instance(1.5-2) * PROMPTFLOW_WORKER_NUM * PROMPTFLOW_WORKER_THREADS に設定します。 こうすると、一部の要求をサーバー側でキューに格納できるので、総スループットが向上します。
    • リージョンをまたがる要求を送信している場合は、しきい値を 200 ms から 1 s に変更できます。

上記のパラメーターを調整するときは、最適なパフォーマンスと安定性を確保するために次のメトリックを監視する必要があります。

  • このデプロイのインスタンスの CPU/メモリ使用率
  • 200 以外の応答 (4xx、5xx)
    • 429 応答を受け取った場合、これは通常、上記のガイドに従ってコンカレンシー設定を再調整するか、デプロイをスケーリングする必要があることを意味します。
  • Azure OpenAI のスロットルの状態

エンドポイントを監視する

一般的なメトリックを収集する

オンライン デプロイの一般的なメトリック (要求数、要求の待機時間、ネットワーク バイト、CPU/GPU/ディスク/メモリ使用率など) を表示できます。

推論時にトレース データとシステム メトリックを収集する

また、デプロイ yaml ファイルにプロパティ app_insights_enabled: true を追加することで、ワークスペースにリンクされた Application Insights に対する推論時に、トレース データとプロンプト フロー デプロイ固有のメトリック (トークンの消費量、フローの待機時間など) を収集することもできます。 詳細については、トレースとプロンプト フロー デプロイのメトリックに関するセクションを参照してください。

プロンプト フロー固有のメトリックとトレースは、他の Application Insights (ワークスペースにリンクされたもの以外) に指定できます。 次のように、デプロイ yaml ファイルで環境変数を指定できます。 Application Insights の接続文字列は、Azure portal の [概要] ページで確認できます。

environment_variables:
  APPLICATIONINSIGHTS_CONNECTION_STRING: <connection_string>

Note

app_insights_enabled: true のみを設定したものの、リンクされた Application Insights がワークスペースにない場合、デプロイは失敗しませんが、データは収集されません。 app_insights_enabled: true と上記の環境変数の両方を同時に指定すると、ワークスペースにリンクされた Application Insights にトレース データとメトリックが送信されます。 そのため、別の Application Insights を指定する場合は、環境変数を保持するだけで済みます。

一般的なエラー

エンドポイントを使用するときのアップストリーム要求タイムアウトの問題

このようなエラーは通常、タイムアウトが原因で発生します。 既定では、request_timeout_ms は 5,000 です。 最大 5 分 (300,000 ミリ秒) を指定できます。 デプロイ yaml ファイルで要求タイムアウトを指定する方法を示す例を次に示します。 デプロイ スキーマの詳細については、こちらをご覧ください。

request_settings:
  request_timeout_ms: 300000

Note

300,000 ミリ秒のタイムアウトが機能するのは、プロンプト フローからのマネージド オンライン デプロイに対してだけです。 これがプロンプト フローからのデプロイであることを示すためには、以下のようにモデルのプロパティ (デプロイ yaml 内のインライン モデル仕様またはスタンドアロン モデル仕様 yaml) を追加したことを確認する必要があります。

properties:
  # indicate a deployment from prompt flow
  azureml.promptflow.source_flow_id: <value>

次のステップ