PAI の非同期推論サービスは、リクエストの送信と結果の取得を分離することで、AIGC や動画処理などの長時間実行タスクにおけるタイムアウトを回避します。
背景情報
特徴
-
非同期推論
低レイテンシーが求められるシナリオでは、通常、同期推論が使用されます。この方法では、クライアントはリクエストを送信し、同じ接続で結果を待ちます。
推論時間が長い、または予測不可能な場合、同期的な待機は HTTP 接続の切断やクライアントのタイムアウトを引き起こす可能性があります。非同期推論では、送信と取得を分離します。クライアントはリクエストを送信し、後で結果をポーリングするか、通知をサブスクライブします。
-
キューサービス
短編動画処理、動画または音声ストリームの分析、計算負荷の高い画像処理など、ほぼリアルタイムの推論シナリオでは、即時の応答は必要ありませんが、特定時間枠内に結果を返す必要があります。これらのシナリオには、次の課題があります。
-
ラウンドロビンの負荷分散アルゴリズムは適していません。リクエストは、各インスタンスの実際の負荷に基づいて分散される必要があります。
-
インスタンスに障害が発生した場合、その未完了のタスクは他の正常なインスタンスに再割り当てされる必要があります。
PAI は、これらの課題を解決するためのキューサービスフレームワークを提供します。
-
仕組み
-
非同期推論サービスを作成すると、推論サブサービスとキューサブサービスという 2 つのサブサービスが統合されます。キューサブサービスには、入力キューとシンクキューという 2 つのメッセージキューが組み込まれています。各推論サブサービスインスタンスの EAS フレームワークは、自動的に入力キューをサブスクライブし、ストリーミング経由でリクエストデータをフェッチし、ローカルインターフェイスを呼び出してデータを処理し、結果をシンクキューに書き込みます。
-
シンクキューが一杯の場合、サービスフレームワークは入力キューからの消費を停止します。これにより、結果をシンクキューに書き込めないリクエストの処理を防ぎます。
推論結果を直接 OSS や独自のメッセージミドルウェアに書き込むなど、シンクキューが不要な場合は、同期 HTTP 推論インターフェイスから空の応答を返すことができます。この場合、シンクキューは無視されます。
-
高可用性のキューサブサービスがクライアントリクエストを受信します。推論サブサービスのインスタンスは、その同時実行能力に基づいてリクエストをサブスクライブします。キューサブサービスは、各インスタンスのアクティブなリクエストがそのサブスクリプションウィンドウを超えないように保証します。
説明たとえば、各推論サブサービスインスタンスが一度に 5 つの音声ストリームしか処理できない場合、ウィンドウサイズを 5 に設定します。インスタンスがストリームの処理を完了して結果をコミットすると、キューサブサービスは新しいストリームをそのインスタンスにプッシュします。これにより、どのインスタンスも一度に 5 つを超えるストリームを処理しないことが保証されます。
-
インスタンスに障害が発生した場合、キューサブサービスはそのインスタンスを異常としてマークし、そのアクティブなリクエストを再度キューに入れ、正常なインスタンスにディスパッチすることで、データが失われないようにします。
非同期推論サービスの作成
非同期推論サービスを作成すると、同名のサービスグループも作成されます。キューサブサービスは、このグループ内に自動的に作成されます。デフォルトでは、キューサブサービスは 1 つのインスタンスで開始し、推論サブサービスのインスタンス数に応じて最大 2 つのインスタンスまで動的にスケーリングします。各インスタンスは、デフォルトで 1 CPU コアと 4 GB のメモリを使用します。これらの設定をカスタマイズするには、「キューサブサービスのパラメーター」をご参照ください。
EAS の非同期推論サービスは、同期推論ロジックを非同期実行に適応させます。以下のデプロイメント方法がサポートされています。
コンソール
-
カスタムデプロイメントページに移動し、次の主要なパラメーターを設定します。その他のパラメーターについては、「カスタムデプロイメント」をご参照ください。
-
Deployment Method: Image-based Deployment または Processor-based Deployment を選択し、Asynchronous Queue チェックボックスを選択します。

-
-
パラメーターを設定した後、Deploy をクリックします。
CLI
-
サービス設定ファイル service.json を準備します。
-
プロセッサベースのデプロイメントの場合:
{ "processor": "pmml", "model_path": "http://example.oss-cn-shanghai.aliyuncs.com/models/lr.pmml", "metadata": { "name": "pmmlasync", "type": "Async", "cpu": 4, "instance": 1, "memory": 8000 } }主要なパラメーター:
-
type:非同期推論サービスを作成するには、Async に設定します。
-
model_path:値をモデルへのパスに置き換えます。
-
-
イメージベースのデプロイメントの場合:
{ "metadata": { "name": "image_async", "instance": 1, "rpc.worker_threads": 4, "type": "Async" }, "cloud": { "computing": { "instance_type": "ecs.gn6i-c16g1.4xlarge" } }, "queue": { "cpu": 1, "min_replica": 1, "memory": 4000, "resource": "" }, "containers": [ { "image": "eas-registry-vpc.cn-beijing.cr.aliyuncs.com/pai-eas/chat-llm-webui:3.0.1", "script": "python webui/webui_server.py --port=8000 --model-path=Qwen/Qwen-7B-Chat", "port": 8000 } ] }主要なパラメーター:
-
type:非同期推論サービスを作成するには、Async に設定します。
-
instance:キューサブサービスのインスタンスを除く、推論サブサービスのインスタンス数。
-
rpc.worker_threads:EAS フレームワークのワーカースレッド数。この値は、キューからのサブスクリプションウィンドウサイズを決定します。スレッド数が 4 に設定されている場合、一度に最大 4 つのデータエントリをキューからサブスクライブできます。キューサブサービスは、現在のメッセージのいずれかが処理されるまで、新しいメッセージをインスタンスにプッシュしません。
たとえば、単一の推論サブサービスインスタンスが一度に 2 つのビデオストリームしか処理できないビデオストリーム処理サービスの場合、このパラメーターを 2 に設定できます。キューサブサービスは、最大 2 つのビデオストリーム URL を推論サブサービスにプッシュします。インスタンスが前の URL の処理を完了するまで、新しい URL を送信しません。これにより、インスタンスが一度に 2 つ以上のストリームを処理しないことが保証されます。
-
-
-
サービスを作成します。
EASCMD クライアントにログインした後、create コマンドを実行してサービスを作成します。EASCMD クライアントへのログイン方法については、「クライアントのダウンロードと認証」をご参照ください。例:
eascmd create service.json
非同期推論サービスへのアクセス
デフォルトでは、非同期推論サービスと同じ名前のサービスグループが作成されます。キューサブサービスはトラフィックエントリポイントとして機能します。以下のパスを使用してアクセスします。詳細については、「キューサービスへのアクセス」をご参照ください。
|
エンドポイントタイプ |
フォーマット |
例 |
|
入力キューエンドポイント |
|
|
|
シンクキューエンドポイント |
|
|
非同期推論サービスの管理
システムがサブサービスを自動的に処理するため、非同期推論サービスの管理は通常のサービスの管理と同じです。たとえば、非同期推論サービスを削除すると、キューサブサービスと推論サブサービスの両方が削除されます。推論サブサービスを更新しても、最大限の可用性を確保するためにキューサブサービスは変更されません。
サブサービスのアーキテクチャのため、1 つのサービスインスタンスを設定すると、リストには推論サブサービス用とキューサブサービス用の 2 つのインスタンスが表示されます。

非同期推論サービスのインスタンス数は、推論サブサービスのインスタンス数を指します。キューサブサービスのインスタンス数は、推論サブサービスのインスタンス数に応じて自動的に変更されます。たとえば、推論サブサービスのインスタンス数を 3 にスケールアウトすると、キューサブサービスのインスタンス数は 2 にスケールアウトします。

2 つのサブサービス間のインスタンスの比率は、次のルールに従います。
-
非同期推論サービスが停止されると、キューサブサービスと推論サブサービスの両方のインスタンス数が 0 にスケールインします。インスタンスリストは空になります。
-
推論サブサービスのインスタンス数が 1 の場合、キューサブサービスのインスタンス数も 1 です。ただし、キューサブサービスの設定で別途指定されている場合を除きます。
-
推論インスタンスが 2 つ以上ある場合、キューインスタンスの数は 2 のままです。ただし、キューサブサービスの設定で別途指定されている場合を除きます。
-
最小インスタンス数を 0 にして Auto Scaling を設定した場合、推論サブサービスが 0 にスケーリングしても、キューサブサービスは 1 つのスタンバイインスタンスを維持します。
キューサブサービスのパラメーター
ほとんどの場合、キューサブサービスはデフォルト設定で正常に動作します。カスタマイズするには、JSON ファイルのトップレベルで queue フィールドを設定します。例:
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true
}
}
以下のセクションでは、設定項目について詳しく説明します。
キューサブサービスのリソース設定
デフォルトでは、キューサブサービスのリソースはメタデータ内のフィールドに従って設定されます。ただし、一部のユースケースでは、キューサブサービスのリソースを個別に設定する必要がある場合があります。
-
queue.resource を使用して、キューサブサービスのリソースグループを指定します。
{ "queue": { "resource": "eas-r-slzkbq4tw0p6xd****" # デフォルトでは、推論サブサービスのリソースグループに従います。 } }-
デフォルトでは、キューサブサービスは推論サブサービスと同じリソースグループを使用します。
-
キューサブサービスをパブリックリソースグループにデプロイするには、resource を空の文字列 ("") に設定します。これは、専用リソースグループの CPU とメモリが不足している場合に便利です。
説明キューサブサービスをパブリックリソースグループにデプロイすることを推奨します。
-
-
queue.cpu と queue.memory を使用して、各キューサブサービスインスタンスの CPU (コア単位) とメモリ (MB 単位) を指定します。
{ "queue": { "cpu": 2, # デフォルト: 1 "memory": 8000 # デフォルト: 4000 } }リソースを設定しない場合、各キューサブサービスインスタンスはデフォルトで 1 CPU コアと 4 GB のメモリを使用します。これは、ほとんどのシナリオのニーズを満たします。
重要-
サブスクライバー (たとえば、推論サブサービスインスタンス) が 200 を超える場合は、CPU コア数を 2 以上に設定することを推奨します。
-
本番環境でキューサブサービスのメモリ設定を減らすことは推奨しません。
-
-
queue.min_replica を使用して、キューサブサービスインスタンスの最小数を設定します。
{ "queue": { "min_replica": 3 # デフォルト: 1 } }非同期推論サービスを使用する場合、キューサブサービスインスタンスの数は、推論サブサービスインスタンスのランタイム数に基づいて自動的に調整されます。デフォルトの調整範囲は
[1, min(2, 推論サブサービスインスタンス数)]です。特別なケースとして、非同期推論サービスの Auto Scaling を設定し、インスタンス数を 0 にスケールインできるようにした場合、1 つのキューサブサービスインスタンスが自動的に保持されます。また、queue.min_replica を使用して、保持されるキューサブサービスインスタンスの最小数を調整することもできます。説明キューサブサービスインスタンスの数を増やすと可用性は向上しますが、パフォーマンスは向上しません。
キューサブサービスの機能設定
キューサブサービスには、いくつかの設定可能な機能があります。
-
queue.sink.auto_evict または queue.source.auto_evict を使用して、それぞれシンクキューまたは入力キューの自動データエビクションを有効にします。
{ "queue": { "sink": { "auto_evict": true # シンクキューのエビクションを有効にします。デフォルト: false }, "source": { "auto_evict": true # 入力キューのエビクションを有効にします。デフォルト: false } } }デフォルトでは、自動データエビクションは無効になっています。キューが一杯の場合、それ以上データを書き込むことはできません。データオーバーフローを許可する場合は、自動エビクションを有効にします。これにより、キューは新しいメッセージのためのスペースを確保するために最も古いメッセージをエビクションします。
-
queue.max_delivery を使用して、最大配信試行回数を設定します。
{ "queue": { "max_delivery": 10 # 最大配信試行回数: 10。デフォルト: 5。0 に設定すると、最大配信試行回数は無効になり、メッセージは無期限に配信できます。 } }メッセージの配信試行回数がこのしきい値を超えると、デッドレターとしてマークされます。詳細については、「デッドレターポリシー」をご参照ください。
-
queue.max_idle を使用して、メッセージの最大処理時間を設定します。
{ "queue": { "max_idle": "1m" # 1 つのメッセージの最大処理時間を 1 分に設定します。この時間を超えると、メッセージは他のサブスクライバーに配信されます。配信後、配信カウントが 1 増加します。デフォルト値は 0 で、最大処理時間がないことを意味します。 } }この例で設定されている時間は 1 分です。h (時間)、m (分)、s (秒) など、複数の時間単位がサポートされています。単一メッセージの処理時間が設定された時間を超えると、次のいずれかが発生します。
-
queue.max_delivery で設定されたしきい値を超えていない場合、メッセージは他のサブスクライバーに配信されます。
-
queue.max_delivery で設定されたしきい値を超えている場合、メッセージにデッドレターポリシーが適用されます。
-
-
queue.dead_message_policy を使用して、デッドレターポリシーを設定します。
{ "queue": { "dead_message_policy": "Rear" # 有効な値: Rear (デフォルト) または Drop。Rear はメッセージをキューの末尾に移動します。Drop はメッセージを削除します。 } }
キューの制限設定
キューの最大長と最大ペイロードサイズは反比例の関係にあります。これらは次の数式に従います。
キューサブサービスインスタンスのメモリは固定です。したがって、メッセージあたりの最大ペイロードサイズを増やすと、キューの最大長は減少します。
-
デフォルトの 4 GB メモリ設定では、デフォルトの最大ペイロードサイズが 8 KB の場合、入力キューとシンクキューはそれぞれ 230,399 件のメッセージを保存できます。キューサブサービスにより多くのメッセージを保存する必要がある場合は、上記のメモリ設定セクションで説明されているように、必要に応じてメモリサイズを増やしてください。システムは合計メモリの 10% を予約します。
-
同じキューに対して、最大長と最大ペイロードサイズの両方を設定することはできません。
-
queue.sink.max_length または queue.source.max_length を使用して、それぞれシンクキューまたは入力キューの最大長を設定します。
{ "queue": { "sink": { "max_length": 8000 # シンクキューの最大長を 8,000 メッセージに設定します。 }, "source": { "max_length": 2000 # 入力キューの最大長を 2,000 メッセージに設定します。 } } } -
queue.sink.max_payload_size_kb または queue.source.max_payload_size_kb を使用して、それぞれシンクキューまたは入力キューのメッセージあたりの最大ペイロードサイズを設定します。
{ "queue": { "sink": { "max_payload_size_kb": 10 # シンクキューのメッセージあたりの最大ペイロードサイズを 10 KB に設定します。デフォルトは 8 KB です。 }, "source": { "max_payload_size_kb": 1024 # 入力キューのメッセージあたりの最大ペイロードサイズを 1024 KB (1 MB) に設定します。デフォルトは 8 KB です。 } } }
メモリ割り当て比率の設定
-
queue.sink.memory_ratio を使用して、入力キューとシンクキュー間のメモリ割り当てを調整します。
{ "queue": { "sink": { "memory_ratio": 0.9 # シンクキューのメモリ比率を設定します。デフォルト値は 0.5 です。 } } }説明デフォルトでは、入力キューとシンクキューはキューサブサービスインスタンスのメモリを均等に共有します。出力データ (例:画像) が入力データ (例:テキスト) よりも大きい場合は、queue.sink.memory_ratio を増やしてシンクキューにより多くのメモリを割り当てることができます。逆に、サービスが画像を入力として受け取り、テキストを出力する場合は、queue.sink.memory_ratio を減らすことができます。
水平 Auto Scaling
仕組み
システムはキューの長さに応じて推論インスタンスを動的にスケーリングします。これには、キューが空のときにゼロにスケーリングしてコストを削減することも含まれます。次の図は、非同期推論サービスの Auto Scaling を示しています。
操作手順
-
サービスリストで、対象のサービス名をクリックしてサービス詳細ページに移動します。
-
Auto Scaling タブに切り替えます。Auto Scaling セクションで、Enable Auto Scaling をクリックします。
-
Auto Scaling Settings ダイアログボックスで、パラメーターを設定します。
-
基本設定:
パラメーター
説明
例
Minimum Replicas
スケールイン操作の最小レプリカ数。最小値:0。
0
Maximum Replicas
スケールアウト操作の最大レプリカ数。最大値:1000。
10
General Scaling Metrics
スケーリングをトリガーするために使用される組み込みのパフォーマンスメトリック。
Asynchronous Queue Length は、インスタンスあたりのキューに入れられたタスクの平均数を表します。
Asynchronous Queue Length を選択し、しきい値を 10 に設定します。
-
詳細設定:
パラメーター
説明
例
Scale-out Starts in
スケールアウト決定のための観察期間。スケールアウトがトリガーされた後、システムはこの期間中にメトリックを観察します。メトリック値がしきい値を下回った場合、スケールアウトはキャンセルされます。単位:秒。
デフォルト値は
0秒で、スケールアウトが即時に実行されることを意味します。0
Scale-in Starts in
スケールイン決定のための観察期間 — サービスのジッターを防ぐための重要なパラメーター。スケールインは、この期間全体にわたってメトリックがしきい値を下回り続けた後にのみ発生します。単位:秒。
デフォルト:
300秒。これにより、トラフィックの変動による頻繁なスケールインイベントから保護されます。サービスの安定性を維持するために、低すぎる値に設定しないでください。300
Scale-in to 0 Instance Starts in
Minimum Replicas が
0の場合、このパラメーターはレプリカ数が0に減少するまでの待機時間を定義します。600
Scale-from-Zero Replica Count
サービスが
0レプリカからスケールアウトするときに追加するレプリカ数。1
パラメーターと EASCMD クライアントの使用方法の詳細については、「水平 Auto Scaling」をご参照ください。
-