AIGC、ビデオ処理、およびその他の長時間実行される推論ワークロードの場合、同期推論は接続タイムアウトやレプリカの負荷の不均衡を引き起こす可能性があります。Platform for AI (PAI) の非同期推論を使用すると、サブスクリプションやポーリングによってリクエストを送信し、結果を取得できます。
背景情報
特徴
-
非同期推論
低レイテンシのオンライン推論では、通常、同期推論が使用されます。クライアントはリクエストを送信し、同じ接続で結果を待機します。
推論時間が長い、または予測不可能である場合、同期方式で待機すると HTTP 接続の切断やクライアントのタイムアウトを引き起こす可能性があります。非同期推論では、クライアントはリクエストを送信し、後でポーリングを行ったり通知をサブスクライブしたりして結果を取得します。
-
キューサービス
ショートビデオ処理、オーディオ/ビデオストリーム分析、または高負荷な画像処理などのほぼリアルタイムのシナリオでは、特定時間枠内に結果を返す必要があります。これらのシナリオには、次のような課題があります:
-
ラウンドロビン負荷分散アルゴリズムは適していません。リクエストは、各レプリカの実際の負荷に基づいて分散する必要があります。
-
レプリカに障害が発生した場合、その未完了のタスクは、処理のために他の正常なレプリカに再割り当てする必要があります。
PAI は、これらのリクエスト分散の課題を解決するためのキューサービスフレームワークを提供します。
-
仕組み
-
非同期推論サービスには、推論サブサービスとキューサブサービスの 2 つのサブサービスが含まれます。キューサブサービスには、入力キューとシンクキューの 2 つの組み込みキューがあります。リクエストはまず入力キューに送られます。各推論サブサービスのレプリカは入力キューをサブスクライブし、リクエストを処理して、レスポンスをシンクキューに書き込みます。
-
シンクキューがいっぱいになると、サービスフレームワークは結果が配信不能になるのを防ぐため、入力キューからのメッセージ取得を停止します。
推論結果を OSS または独自のメッセージミドルウェアに直接書き込む場合は、HTTP 推論インターフェイスから空のレスポンスを返します。これにより、シンクキューは無視されます。
-
キューサブサービスはクライアントリクエストを受信し、同時実行キャパシティに基づいて推論レプリカに分散します。各レプリカはリクエストのウィンドウをサブスクライブすることで、過負荷を防ぎ、すべてのデータが最終的にクライアントに返されることを保証します。
説明たとえば、各レプリカが 5 つのオーディオストリームを処理できる場合、ウィンドウサイズを 5 に設定します。レプリカが 1 つのストリームを完了して結果をコミットすると、キューサブサービスは新しいストリームをプッシュします。これにより、各レプリカは 5 つの同時ストリームに制限されます。
-
キューサブサービスはレプリカの接続を監視します。レプリカに障害が発生した場合、未処理のリクエストは正常なレプリカに再配布され、データが失われるのを防ぎます。
非同期推論サービスの作成
非同期推論サービスを作成すると、キューサブサービスを持つ同名のサービスグループが自動的に作成されます。キューサブサービスは、デフォルトで 1 つのレプリカ (1 コア、4 GB メモリ) で構成され、推論サブサービスとともに最大 2 つのレプリカまでスケールアップします。カスタマイズするには、キューサブサービスのパラメーターを調整します。
EAS は、非同期推論のための 2 つのデプロイ方法をサポートしています。
コンソール経由でのデプロイ
-
[Custom Deployment] ページに移動し、次の主要なパラメーターを設定します。その他のパラメーターについては、「カスタムデプロイ」をご参照ください。
-
Deployment Method:Image-based Deployment または Processor-based Deployment を選択し、Asynchronous Queue チェックボックスをオンにします。
-
-
パラメーターを設定した後、Deploy をクリックします。
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 } ] }主要なパラメーターは以下のとおりです。その他のパラメーターについては、「JSONベースのデプロイ」をご参照ください。
-
type:このパラメーターを
Asyncに設定して、非同期推論サービスを作成します。 -
instance:推論サブサービスのレプリカ数を指定します。これには、キューサブサービスのレプリカは含まれません。
-
rpc.worker_threads:EAS サービスフレームワークのスレッド数。この値はサブスクリプションのウィンドウサイズと等しくなります。キューサブサービスは、最大でこの数のメッセージを同時にプッシュし、結果を待ってから次のメッセージを送信します。
たとえば、各レプリカが一度に 2 つのストリームを処理するビデオストリームサービスの場合、これを 2 に設定します。キューサブサービスは最大で 2 つのビデオストリーム URL をプッシュし、結果を受信した後にのみ新しい URL を送信します。
-
-
-
サービスの作成
EASCMD クライアントにログオンした後 (「クライアントのダウンロードと認証」をご参照ください)、create コマンドを実行します:
eascmd create service.json
非同期推論サービスへのアクセス
システムは同名のサービスグループを作成します。キューサブサービスが着信トラフィックを処理するため、次のエンドポイントを介して直接アクセスしてください。「キューサービスへのアクセス」をご参照ください。
|
エンドポイントタイプ |
形式 |
例 |
|
入力キューエンドポイント |
|
|
|
シンクキューエンドポイント |
|
|
非同期推論サービスの管理
非同期推論サービスは、通常のサービスと同様に管理できます。システムはサブサービスを自動的に管理します。サービスを削除すると両方のサブサービスが削除され、推論サブサービスを更新してもキューサブサービスは変更されません。
レプリカを 1 つ設定した場合でも、インスタンスリストには追加のキューサブサービスインスタンスが表示されます。
レプリカ数は、推論サブサービスのレプリカを指します。キューサブサービスのレプリカは自動的にスケーリングされます。たとえば、推論レプリカを 3 にスケーリングすると、キューレプリカは 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 で、最大処理時間がないことを意味します。 } }サポートされている時間単位:
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を増やします。その逆の場合は減らします。
水平オートスケーリング
仕組み
システムは、キューの状態に基づいて推論レプリカを動的にスケーリングします。これには、キューが空の場合のゼロへのスケーリングも含まれます。次の図は、その仕組みを示しています。
操作手順
-
サービスリストで対象のサービス名をクリックします。
-
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 の使用方法については、「水平オートスケーリング」をご参照ください。
-