AIGC やビデオ処理などの複雑なモデル推論シナリオでは、処理時間が長くなると、接続タイムアウトやインスタンス負荷の不均衡などの問題が発生する可能性があります。これらのワークロードは、同期推論には適していません。これらの課題に対処するために、Platform for AI (PAI) は、ポーリングまたはサブスクリプションモデルを通じて推論結果を取得できる非同期推論サービスを提供します。このドキュメントでは、非同期推論サービスの使用方法について説明します。
背景情報
機能の説明
非同期推論
低レイテンシーを必要とするオンライン推論シナリオでは、通常、クライアントがリクエストを送信し、同じ接続で応答を待つ同期推論が使用されます。
しかし、処理時間が長い、または予測不可能なシナリオでは、同期応答を待つと、HTTP 接続の切断やクライアント側のタイムアウトなどの問題が発生します。非同期推論はこれらの問題を解決します。クライアントはサーバーにリクエストを送信し、待機する代わりに、定期的に結果を確認したり、タスクが完了したときに送信される通知をサブスクライブしたりできます。
キューサービス
ショートビデオ、ビデオストリーム、または計算量の多い画像の処理など、ほぼリアルタイムの推論シナリオでは、結果は即座に必要ではありませんが、指定された時間内に利用可能でなければなりません。これらのシナリオには、いくつかの課題があります。
ラウンドロビンアルゴリズムのような単純な負荷分散方法では不十分です。リクエストは、各インスタンスの実際の負荷に基づいて分散する必要があります。
インスタンス障害が発生した場合、障害が発生したインスタンスによって処理されていたタスクは、正常なインスタンスに再割り当てする必要があります。
PAI は、これらのリクエスト分散の課題を解決するための専用のキューサービスフレームワークを提供します。
仕組み
非同期推論サービスを作成すると、その中に 2 つのサブサービスが統合されます。推論サブサービスとキューサブサービスです。キューサブサービスには、入力キューとシンクキューという 2 つの組み込みメッセージキューが含まれています。サービスリクエストは、まずキューサブサービスの入力キューに送信されます。推論サブサービスインスタンス内の EAS フレームワークは、キューに自動的にサブスクライブしてストリーミング方式でリクエストデータをフェッチし、推論インターフェイスを呼び出してデータを処理し、応答をシンクキューに書き込みます。
シンクキューがいっぱいで新しいデータを受け入れられない場合、サービスフレームワークは入力キューからのデータ消費を停止します。このバックプレッシャーメカニズムにより、結果を保存できない場合にデータが処理されるのを防ぎます。
結果を Object Storage Service (OSS) や独自のメッセージミドルウェアに直接書き込む場合など、シンクキューが不要な場合は、同期 HTTP 推論インターフェイスから空の応答を返すことができます。この場合、シンクキューは無視されます。
高可用性のキューサブサービスが作成され、クライアントリクエストを受信します。推論サブサービスのインスタンスは、同時処理能力に基づいて特定数のリクエストをサブスクライブします。キューサブサービスは、各推論サブサービスインスタンスのアクティブなリクエスト数がサブスクリプションウィンドウサイズを超えないようにすることで、インスタンスの過負荷を防ぎます。最終的な結果は、サブスクリプションまたはポーリングを通じてクライアントに返されます。
説明たとえば、各推論サブサービスインスタンスが同時に 5 つのオーディオストリームしか処理できない場合、キューサブサービスをサブスクライブするときのウィンドウサイズを 5 に設定します。インスタンスが 1 つのストリームの処理を完了して結果をコミットすると、キューサブサービスは新しいストリームをプッシュします。これにより、インスタンスは常に最大 5 つのストリームを処理することが保証されます。
キューサブサービスは、推論サブサービスインスタンスの接続状態を監視することでヘルスチェックを実行します。インスタンスの障害により接続が失われた場合、キューサブサービスはそのインスタンスを異常とマークします。そのインスタンスにすでにディスパッチされていたリクエストは自動的に再キューイングされ、他の正常なインスタンスに送信されるため、障害発生時にデータが失われることはありません。
非同期推論サービスを作成する
非同期推論サービスを作成すると、同じ名前のサービスグループが自動的に作成されます。キューサブサービスも自動的に作成され、非同期推論サービスに統合されます。デフォルトでは、キューサブサービスは 1 つのインスタンスで開始し、推論サブサービスインスタンスの数に応じて動的にスケーリングし、最大 2 つのインスタンスまで拡張します。各キューサブサービスインスタンスは、デフォルトで 1 コアと 4 GB のメモリで構成されています。デフォルトの構成がニーズを満たさない場合は、このトピックの「キューサブサービスのパラメーター構成」セクションをご参照ください。
EAS の非同期推論サービスは、同期推論ロジックを非同期パターンに変換し、2 つのデプロイメント方法をサポートします。
コンソールを使用してサービスをデプロイする
カスタムデプロイページに移動し、次の主要なパラメーターを構成します。他のパラメーター設定の詳細については、「カスタムデプロイ」をご参照ください。
デプロイメント方法: イメージベースのデプロイまたはプロセッサーベースのデプロイを選択します。
非同期サービス: 非同期サービスをオンにします。

パラメーターを構成したら、[デプロイ] をクリックします。
EASCMD クライアントを使用してサービスをデプロイする
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 } }次のパラメーターに注意してください。他のパラメーター設定の詳細については、「JSON デプロイメント」をご参照ください。
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 に設定して、非同期推論サービスを作成します。
instances: 推論サブサービスのインスタンス数。これにはキューサブサービスのインスタンスは含まれません。
rpc.worker_threads: 非同期推論サービスの EAS サービスフレームワーク内のワーカースレッド数。このパラメーターは、キューからデータをサブスクライブするためのウィンドウサイズに対応します。
4に設定すると、一度に最大 4 つのメッセージをキューからサブスクライブできることを意味します。キューサブサービスは、これら 4 つのメッセージが処理されるまで、新しいデータを推論サブサービスにプッシュしません。たとえば、単一の推論サブサービスインスタンスが一度に 2 つのストリームしか処理できないビデオストリーム処理サービスを考えてみましょう。このパラメーターを
2に設定します。キューサブサービスは、最大 2 つのビデオストリーム URL を推論サブサービスにプッシュします。インスタンスがストリームの 1 つの結果を返すまで、新しい URL はプッシュされません。ストリームが処理されて結果が返されると、キューサブサービスは新しいストリーム URL をプッシュし、単一のインスタンスが同時に 2 つ以上のストリームを処理しないようにします。
非同期推論サービスを作成します。
eascmd クライアントにログインした後、
createコマンドを実行して非同期推論サービスを作成します。EASCMD クライアントへのログイン方法の詳細については、「クライアントのダウンロードと認証」をご参照ください。以下に例を示します。eascmd create service.json
非同期推論サービスにアクセスする
前述のように、非同期推論サービスと同じ名前のサービスグループがデフォルトで作成されます。このグループ内のキューサブサービスはトラフィックの入口として機能するため、次のパスを使用してキューサブサービスに直接アクセスします。詳細については、「キューサービスへのアクセス」をご参照ください。
エンドポイントタイプ | アドレス形式 | 例 |
入力キューアドレス |
|
|
出力キューアドレス |
|
|
非同期推論サービスを管理する
非同期推論サービスは、通常のサービスと同様に管理できます。そのサブサービスはシステムによって自動的に管理されます。たとえば、非同期推論サービスを削除すると、キューサブサービスと推論サブサービスの両方が削除されます。推論サブサービスを更新しても、キューサブサービスは変更されず、最大限の可用性が確保されます。
サブサービスのアーキテクチャのため、非同期推論サービスに 1 つのインスタンスを構成した場合でも、インスタンスリストにはキューサブサービスの追加インスタンスが表示されます。

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

2 つのサブサービス間のインスタンス比率は、次のルールに従います。
非同期推論サービスが停止すると、キューサブサービスと推論サブサービスの両方のインスタンス数が 0 にスケールダウンします。インスタンスリストは空になります。
推論サブサービスに 1 つのインスタンスがある場合、キューサブサービスにも 1 つのインスタンスがあります。ただし、キューサブサービスのパラメーターをカスタマイズした場合を除きます。
推論サブサービスのインスタンス数が 2 を超える場合、キューサブサービスのインスタンス数は 2 のままです。ただし、そのパラメーターをカスタマイズした場合を除きます。
非同期推論サービスの自動スケーリングを最小インスタンス数 0 で構成した場合、推論サブサービスが 0 にスケールダウンしても、キューサブサービスの 1 つのインスタンスはアクティブなままです。
キューサブサービスのパラメーターと説明
ほとんどの場合、キューサブサービスのデフォルト構成で十分です。特定の要件がある場合は、JSON ファイルの最上位にある queue ブロックを使用してキューインスタンスを構成できます。次のコードに例を示します。
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true,
}
}次のセクションでは、構成オプションについて詳しく説明します。
キューサブサービスのリソースを構成する
デフォルトでは、キューサブサービスのリソースは metadata セクションのフィールドに基づいて構成されます。ただし、一部のユースケースでは、このセクションで説明するように、リソースを個別に構成する必要がある場合があります。
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 を超える場合は、2 つ以上の CPU コアを構成します。
本番環境では、キューサブサービスのメモリ割り当てを減らさないでください。
queue.min_replicaを使用して、キューサブサービスインスタンスの最小数を構成します。{ "queue": { "min_replica": 3 # デフォルト値: 1。 } }非同期推論サービスを使用する場合、キューサブサービスインスタンスの数は、推論サブサービスインスタンスのランタイム数に基づいて自動的に調整されます。デフォルトの調整範囲は
[1, min(2, 推論サブサービスインスタンスの数)]です。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 増加します。デフォルト値は 0 で、最大処理時間制限がないことを意味します。 } }例の時間の値は 1 分です。
h(時間)、m(分)、s(秒) など、複数の時間単位がサポートされています。メッセージの処理時間が構成された期間を超えると、次の 2 つのいずれかが発生します。配信カウントが
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 # 出力キューの最大長を 8000 エントリに設定します。 }, "source": { "max_length": 2000 # 入力キューの最大長を 2000 エントリに設定します。 } } }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] エリアで [自動スケーリングを有効にする] をクリックします。
[自動スケーリング設定] ダイアログボックスで、パラメーターを構成します。
基本構成:
パラメーター
注
値の例
最小インスタンス数
サービスがスケールインできるインスタンスの最小数。最小値は 0 です。
0
最大インスタンス数
サービスがスケールアウトできるインスタンスの最大数。最大値は 1000 です。
10
標準スケーリングメトリック
スケーリングをトリガーするために使用される組み込みのパフォーマンスメトリック。
非同期キュー長は、キュー内のインスタンスあたりの平均タスク数を表します。
非同期キュー長を選択し、しきい値を 10 に設定します。
高度な構成:
パラメーター
注
値の例
スケールアウト期間
スケールアウト決定の観測ウィンドウ。スケールアウトがトリガーされた後、システムはこの期間中にメトリックを観測します。メトリック値がしきい値を下回った場合、スケールアウトはキャンセルされます。単位は秒です。
デフォルト値は
0秒です。値 0 は、スケールアウトを直ちに実行します。0
スケールイン有効時間
スケールイン決定の観測ウィンドウ。これは、サービスのジッターを防ぐための重要なパラメーターです。スケールインは、メトリックがこの期間全体でしきい値を下回ったままである場合にのみ発生します。単位は秒です。
デフォルトは
300秒です。これは、トラフィックの変動による頻繁なスケールインイベントに対する中心的な保護策です。サービスが不安定になる可能性があるため、この値を低く設定しすぎないでください。300
0 へのスケールインの有効期間
最小インスタンス数が
0の場合、このパラメーターはインスタンス数が0に減少するまでの待機時間を定義します。600
ゼロからスケールアウトしたインスタンス数
サービスが
0インスタンスからスケールアウトするときに追加するインスタンスの数。1
パラメーターの説明と eascmd クライアントの使用方法の詳細については、「水平自動スケーリング」をご参照ください。