AI コンテンツ生成や動画処理などの複雑なモデル推論を伴うシナリオで、時間のかかる推論サービスの推論結果を待機すると、接続タイムアウトによってリクエストが失敗したり、サービスインスタンス間で負荷の不均衡が発生したりする可能性があります。これらの問題を回避するために、Platform for AI (PAI) は、リクエストのサブスクライブまたはポーリングによって推論結果を取得できる非同期推論機能を提供します。このトピックでは、非同期推論サービスの使用方法について説明します。
仕組み
非同期推論サービスを作成すると、サービスは [推論サブサービス] と [キューサブサービス] に統合されます。デフォルトでは、各キューサブサービスは、入力キューと出力キュー (シンクキュー) の 2 つのキューを作成します。サービスがリクエストを受信すると、リクエストは入力キューに送信されます。推論サブサービスの EAS サービスフレームワークは、自動的にキューをサブスクライブし、ストリーミング方式でリクエストデータを取得し、操作を呼び出してリクエストデータを処理し、推論結果を出力キューに書き込みます。
出力キューがいっぱいになると、サービスフレームワークは出力キューにデータを書き込めなくなります。この場合、サービスフレームワークは入力キューからのデータの受信を停止します。
出力キューを無視して、Object Storage Service (OSS) やメッセージミドルウェアなどの他のサービスに推論結果を配信する場合は、API リクエストを構成して空の文字列を返すことができます。このようにして、出力キューは自動的に無視されます。
クライアントリクエストを受信するための高可用性キューサブサービスを作成します。クライアントは、クライアントの上限同時実行数内でリクエストをサブスクライブします。キューサブサービスは、各インスタンスで処理されるリクエストの数が、クライアントのサブスクリプションウィンドウサイズを超えないようにします。これにより、推論サブサービスのインスタンスが過負荷にならず、想定どおりにクライアントに推論結果を返すことができます。
説明たとえば、各インスタンスが最大 5 つのオーディオストリームを処理できる場合は、サブスクリプションウィンドウサイズを 5 に設定します。インスタンスがオーディオストリームの処理を完了して結果をコミットすると、キューサブサービスは別のオーディオストリームをインスタンスにプッシュします。これにより、インスタンスが同時に処理するオーディオストリームが 5 つ以下になります。
キューサブサービスは、推論サブサービスインスタンスとクライアント間の接続の状態をチェックして、インスタンスのヘルス状態を評価します。クライアントがインスタンスから予期せず切断された場合、キューサブサービスはインスタンスを異常とみなし、未完了のリクエストを他の正常なインスタンスに配信します。これにより、すべてのリクエストが想定どおりに処理されます。
非同期推論サービスの作成
非同期推論サービスを作成すると、システムは使用を容易にするために、非同期推論サービスと同じ名前のサービスグループを自動的に作成します。また、システムは自動的にキューサブサービスを作成し、それを非同期推論サービスに統合します。デフォルトでは、キューサブサービスは 1 つのインスタンスを起動し、推論サブサービスのインスタンス数に基づいて自動的にスケーリングします。キューサブサービスは最大 2 つのインスタンスを起動できます。デフォルトでは、各インスタンスには 1 vCPU と 4 GB のメモリが搭載されています。キューサブサービスのデフォルトのインスタンス数ではビジネス要件を満たせない場合は、インスタンスの関連パラメーターを構成できます。詳細については、このトピックの「キューサブサービスのパラメーター構成」セクションをご参照ください。
次のいずれかの方法を使用して、非同期推論サービスを作成できます。
[PAI コンソール] の使用
[カスタムデプロイメント] ページに移動し、次のパラメーターを構成します。その他のパラメーターについては、「コンソールでのカスタムデプロイメントのパラメーター」をご参照ください。
デプロイ方法: [イメージベースのデプロイメント] または [プロセッサベースのデプロイメント] を選択します。
非同期サービス: [非同期サービス] をオンにします。

パラメーターを構成した後、[デプロイ] をクリックします。
[EASCMD クライアント] の使用
service.json という名前のサービス構成ファイルを作成します。
デプロイ方法: モデルとプロセッサを使用してサービスをデプロイする。
{ "processor": "pmml", "model_path": "http://example.oss-cn-shanghai.aliyuncs.com/models/lr.pmml", "metadata": { "name": "pmmlasync", "type": "Async", // 非同期サービスを作成するには、値を Async に設定します。 "cpu": 4, "instance": 1, "memory": 8000 } }次のパラメーターに注意してください。その他のパラメーターについては、「モデルサービスのすべてのパラメーター」をご参照ください。
type: 非同期推論サービスを作成するには、値を Async に設定します。
model_path: 値をモデルのエンドポイントに置き換えます。
デプロイ方法: イメージを使用してサービスをデプロイする を選択します。
{ "metadata": { "name": "image_async", "instance": 1, // 推論サブサービスのインスタンス数。 "rpc.worker_threads": 4, // 非同期推論サービスの EAS サービスフレームワークのスレッド数を指定します。この値は、入力キューでサブスクライブされたデータのウィンドウサイズと同じです。上記のサンプルコードでは、値 4 は、キューから最大 4 つのデータエントリを同時にサブスクライブできることを示しています。キューサブサービスは、4 つのデータエントリが処理されるまで、新しいデータを推論サブサービスにプッシュしません。 "type": "Async" // 非同期推論サービスを作成するには、値を 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 つのデータエントリを同時にサブスクライブできることを示しています。キューサブサービスは、4 つのデータエントリが処理されるまで、新しいデータを推論サブサービスにプッシュしません。
たとえば、ビデオストリーム処理サービスの単一の推論サブサービスインスタンスが同時に処理できるビデオストリームが 2 つだけの場合、このパラメーターを 2 に設定できます。このようにして、キューサブサービスは最大 2 つのビデオストリームのエンドポイントを推論サブサービスにプッシュし、推論サブサービスが結果を返すまで新しいビデオストリームエンドポイントをプッシュしません。推論サブサービスがビデオストリームのいずれかの処理を完了して結果を返すと、キューサブサービスは新しいビデオストリームエンドポイントを推論サブサービスインスタンスにプッシュします。これにより、推論サブサービスインスタンスは同時に最大 2 つのビデオストリームを処理できます。
非同期推論サービスを作成します。
[EASCMD クライアント] にログインし、create コマンドを実行して非同期推論サービスを作成します。[EASCMD クライアント] へのログイン方法の詳細については、「EASCMD クライアントをダウンロードしてユーザー認証を完了する」をご参照ください。
eascmd create service.json
非同期推論サービスへのアクセス
デフォルトでは、システムは非同期推論サービスと同じ名前のサービスグループを作成します。グループ内のキューサブサービスは、グループのデータ入力ポイントを持ちます。次の表のパスを使用して、キューサブサービスにアクセスできます。詳細については、「キューサービスへのアクセス」をご参照ください。
エンドポイントタイプ | エンドポイント形式 | 例 |
入力キュー |
|
|
出力キュー |
|
|
非同期推論サービスの管理
非同期推論サービスは、他のサービスと同じ方法で管理できます。非同期推論サービスのサブサービスは、システムによって管理されます。たとえば、非同期推論サービスを削除すると、キューサブサービスと推論サブサービスも削除されます。推論サブサービスを更新しても、更新はキューサブサービスに影響しません。これにより、サービスの可用性が確保されます。
推論サブサービス用に構成したインスタンスに加えて、サブサービスアーキテクチャはインスタンスリストにキューサブサービスを表示します。

非同期推論サービスのインスタンス数は、推論サブサービスインスタンスの数によって異なります。キューサブサービスインスタンスの数は、推論サブサービスインスタンスの数に基づいて自動的に変更されます。たとえば、推論サブサービスインスタンスの数を 3 に増やすと、キューサブサービスインスタンスの数は 2 に増えます。

2 つのサブサービス間では、次のルールが有効です。
非同期推論サービスが停止すると、キューサブサービスと推論サブサービスのインスタンス数は 0 に減ります。インスタンスリストは空になります。
推論サブサービスのインスタンス数が 1 の場合、キューサブサービスのインスタンス数も 1 です。カスタム構成によって、キューサブサービスのインスタンス数を変更できます。
推論サブサービスのインスタンス数が 2 を超える場合、キューサブサービスのインスタンス数は 2 のままです。カスタム構成によって、キューサブサービスのインスタンス数を変更できます。
非同期推論サービスの自動スケーリング機能を有効にして、最小インスタンス数を 0 に設定すると、推論サブサービスのインスタンス数が 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 コア数とメモリーを指定します。
{ "queue": { "cpu": 2, // デフォルト値:1。 "memory": 8000 // デフォルト値:4000。 } }デフォルトでは、システムはキューサブサービス用に 1 vCPU と 4 GB のメモリーを持つインスタンスを作成します。 ほとんどの場合、この仕様はビジネス要件を満たすことができます。
重要推論サブサービスのインスタンス数など、サブスクライバーの数が 200 を超える場合は、CPU コア数を 2 より大きい値に設定することをお勧めします。
本番環境では、小さいメモリーサイズを使用しないことをお勧めします。
queue.min_replica パラメーターを使用して、キューサブサービスインスタンスの最小数を指定します。
{ "queue": { "min_replica": 3 // デフォルト値:1。 } }非同期推論サービスを使用する場合、キューサブサービスインスタンスの数は、推論サブサービスのruntime インスタンスの数に基づいて自動的に調整されます。 インスタンス数の有効な値:
[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 分を超えると、データエントリは他のサブスクライバーに配信されます。データが配信されると、配信カウントが 1 ずつ増加します。 // デフォルト値は 0 で、データ処理時間に制限がないことを指定します。 } }この例では、パラメーターは 1 分に設定されています。時間の場合は h、分の場合は m、秒の場合は s など、他の単位を指定できます。単一データエントリの処理時間がこのパラメーターの値を超えると、次の状況が発生する可能性があります。
データエントリの配信時間が queue.max_delivery パラメーターで指定されたしきい値を超えない場合、データは他のサブスクライバーに配信されます。
データエントリの配信時間が queue.max_delivery パラメーターで指定されたしきい値を超える場合、システムはデータにデッドレターポリシーを適用します。
queue.dead_message_policy パラメーターを使用して、デッドレターポリシーを設定します。
{ "queue": { "dead_message_policy": 有効な値:Rear と Drop。Rear 値は、データがテールキューに配置されることを示します。Drop 値は、データが削除されることを示します。 // デフォルト値:Rear。 } }
最大キュー長またはデータ量を設定する
次の数式は、最大キュー長と最大データ ボリュームの関係を示しています。
キュー サブサービス インスタンスのメモリは固定です。キューの長さは、データ エントリのサイズの増加に伴って減少します。
デフォルトのメモリは 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": Set the maximum size of a single data entry in the output queue to 10 KB. Default value: 8 KB. // 出力キューの単一データエントリの最大サイズを 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 パラメーターの値を小さくします。
自動スケーリングの構成
非同期推論サービスの自動スケーリングを構成する方法については、「自動スケーリング」をご参照ください。