複雑なモデル推論を伴うAIコンテンツ生成シナリオや動画処理シナリオで、時間のかかる推論サービスの推論結果を待つと、接続タイムアウトによりリクエストが失敗したり、サービスインスタンス間で負荷が不均衡になったりすることがあります。 上記の問題を回避するために、Platform for AI (PAI) は非同期推論機能を提供しており、リクエストのサブスクライブやポーリングによって推論結果を取得できます。 このトピックでは、非同期推論サービスの使用方法について説明します。
背景情報
説明
非同期推論
オンライン推論にはリアルタイムの対話が必要なため、ほとんどの場合、同期推論がオンライン推論サービスに使用されます。 同期推論を使用すると、クライアントは応答を待ち、要求を送信した後もアイドル状態のままになります。
非同期推論は、クライアントが応答を待っているときに次の問題を回避するために、時間のかかる推論サービスに一般的に使用されます。 非同期推論を使用すると、クライアントはサーバーにリクエストを送信した後、応答を待機しなくなります。 クライアントは、推論結果を定期的に照会するか、要求をサブスクライブします。これにより、サーバーは推論結果をクライアントに自動的にプッシュできます。
キューサービス
ショートビデオ、ビデオストリーム、オーディオストリーム、および他の複雑なグラフィック処理サービスなどの準リアルタイム推論サービスは、推論結果をリアルタイムで返す必要はありません。 ただし、これらのサービスは特定の期間内に推論結果を返す必要があります。 この場合、次の問題が発生する可能性があります。
負荷分散アルゴリズムとしてラウンドロビンを使用することはできません。 各インスタンスの実際の負荷に基づいてリクエストを分散する必要があります。
インスタンスに障害が発生した場合、障害が発生したインスタンスの未完了のタスクを他のインスタンスが引き継ぐ必要があります。
PAIは、前述のリクエスト配信の問題の解決に役立つキューサービスフレームワークを提供します。
非同期推論サービスとキューサービスの仕組み
非同期推論サービスを作成すると、そのサービスは推論サブサービスおよびキューサブサービスと統合されます。 デフォルトでは、各キューサブサービスは、入力キューと出力キュー (シンクキュー) の2つのキューを作成します。 サービスがリクエストを受信すると、リクエストは入力キューに送信されます。 推論サブサービスのEASサービスフレームワークは、自動的にキューにサブスクライブし、ストリーミング方式で要求データを取得し、要求データを処理するための操作を呼び出し、推論結果を出力キューに書き込みます。
出力キューがいっぱいになると、サービスフレームワークは出力キューにデータを書き込むことができなくなります。 この場合、サービスフレームワークは、入力キューからのデータの受信を停止します。
出力キューを無視して、Object Storage Service (OSS) やメッセージミドルウェアなどの他のサービスに推論結果を配信する場合は、空の文字列を返すようにAPIリクエストを設定できます。 このように、出力キューは自動的に無視されます。
クライアント要求を受信する可用性の高いキューサブサービスを作成します。 クライアントは、クライアントの同時実行上限内で要求をサブスクライブします。 キューサブサービスは、各インスタンスで処理されるリクエストの数がクライアントのサブスクリプションウィンドウサイズを超えないようにします。 これにより、推論サブサービスのインスタンスがオーバーロードされず、推論結果を期待どおりにクライアントに返すことができます。
説明たとえば、各インスタンスが最大5つのオーディオストリームを処理できる場合、サブスクリプションウィンドウのサイズを5に設定します。 インスタンスがオーディオストリームの処理を終了し、結果をコミットすると、キューサブサービスは別のオーディオストリームをインスタンスにプッシュします。 これにより、インスタンスが同時に5つ以下のオーディオストリームを処理することが保証されます。
キューサブサービスは、推論サブサービスインスタンスとクライアント間の接続のステータスをチェックして、インスタンスのヘルスステータスを評価します。 クライアントがインスタンスから予期せず切断された場合、キューサブサービスはインスタンスが異常であると見なし、未完了のリクエストを他の正常なインスタンスに配信します。 これにより、すべての要求が期待どおりに処理されます。
非同期推論サービスの作成
非同期推論サービスを作成すると、使用を容易にするために、非同期推論サービスと同じ名前のサービスグループが自動的に作成されます。 システムはまた、キュー・サブサービスを自動的に作成し、キュー・サブサービスを非同期推論サービスに統合する。 既定では、キューサブサービスは1つのインスタンスを開始し、推論サブサービスのインスタンス数に基づいて自動的にスケーリングします。 キューサブサービスは、最大2つのインスタンスを起動できます。 デフォルトでは、各インスタンスには1 vCPUと4 GBのメモリが装備されています。 キューサブサービスのインスタンスのデフォルト数がビジネス要件を満たさない場合、インスタンスの関連パラメーターを設定できます。 詳細については、このトピックの「キューサブサービスのパラメーター設定」をご参照ください。
次のいずれかの方法を使用して、非同期推論サービスを作成できます。
PAIコンソールの使用
[カスタムデプロイ] ページに移動し、次のパラメーターを設定します。 その他のパラメーターについては、「PAIコンソールでのモデルサービスのデプロイ」をご参照ください。
[デプロイ方法]: [イメージベースのデプロイ] または [プロセッサベースのデプロイ] を選択します。
非同期サービス: 非同期サービスをオンにします。
パラメーターを設定したら、[デプロイ] をクリックします。
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 } }
次のパラメータに注意してください。 その他のパラメーターについては、「モデルサービスのすべてのパラメーター」をご参照ください。
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つのデータエントリを同時にサブスクライブできることを示します。 キューサブサービスは、4つのデータエントリが処理されるまで、新しいデータを推論サブサービスにプッシュしません。
たとえば、ビデオストリーム処理サービスの1つの推論サブサービスインスタンスが同時に2つのビデオストリームしか処理できない場合、このパラメーターを2に設定できます。 このようにして、キューサブサービスは最大2つのビデオストリームのエンドポイントを推論サブサービスにプッシュし、推論サブサービスが結果を返すまで新しいビデオストリームエンドポイントをプッシュしません。 推論サブサービスがビデオストリームの1つの処理を終了して結果を返すと、キューサブサービスは新しいビデオストリームエンドポイントを推論サブサービスインスタンスにプッシュします。 これにより、推論サブサービスインスタンスが同時に最大2つのビデオストリームを処理できるようになります。
非同期推論サービスを作成します。
EASCMDクライアントにログインし、createコマンドを実行して非同期推論サービスを作成します。 EASCMDクライアントにログオンする方法の詳細については、「EASCMDクライアントのダウンロードとユーザー認証の完了」をご参照ください。
eascmd create service.json
非同期推論サービスへのアクセス
デフォルトでは、非同期推論サービスと同じ名前のサービスグループが作成されます。 グループ内のキューサブサービスには、グループのデータ入力があります。 次の表のパスを使用して、キューサブサービスにアクセスできます。 詳細については、「キューサービスへのアクセス」をご参照ください。
Endpointタイプ | エンドポイント形式 | 例 |
入力キュー |
|
|
出力キュー |
|
|
非同期推論サービスの管理
非同期推論サービスは、他のサービスと同じ方法で管理できます。 非同期推論サービスのサブサービスは、システムによって管理される。 たとえば、非同期推論サービスを削除すると、キューサブサービスと推論サブサービスも削除されます。 推論サブサービスを更新しても、更新はキューサブサービスに影響しません。 これにより、サービスの可用性が確保されます。
推論サブサービス用に構成したインスタンスに加えて、サブサービスアーキテクチャでは、インスタンスリストにキューサブサービスが表示されます。
非同期推論サービスのインスタンス数は、推論サブサービスインスタンスの数によって異なります。 キューサブサービスインスタンスの数は、推論サブサービスインスタンスの数に基づいて自動的に変更されます。 たとえば、推論サブサービスインスタンスの数を3に増やすと、キューサブサービスインスタンスの数は2に増えます。
2つのサブサービス間で次のルールが有効になります。
非同期推論サービスを停止した場合, キューサブサービスおよび推論サブサービスのインスタンス数は0に減少します。 インスタンスリストは空です。
推論サブサービスのインスタンス数が1の場合、キューサブサービスのインスタンス数も1になります。 カスタム設定により、キューサブサービスのインスタンス数を変更できます。
推論サブサービスのインスタンス数が2を超える場合、キューサブサービスのインスタンス数は2のままです。 カスタム設定により、キューサブサービスのインスタンス数を変更できます。
非同期推論サービスの自動スケーリング機能を有効にして、最小インスタンス数を0に設定した場合、推論サブサービスのインスタンス数が0に減少したときにキューサブサービスは1インスタンスを保持します。
キューサブサービスのパラメーター設定
ほとんどの場合、キューサブサービスのデフォルト設定を使用できます。 特別な要件がある場合は、JSONファイルのキューフィールドを変更して、キューサブサービスを設定できます。 サンプルファイル:
{
"queue": {
"sink": {
"memory_ratio": 0.3
},
"source": {
"auto_evict": true,
}
}
以下のセクションでは、特定の設定項目について説明します。
キューサブサービスのリソースの設定
既定では、キューサブサービスのリソースはメタデータフィールドに基づいて設定されます。 リソースの設定を変更するには、次の手順を実行します。
queue.resourceパラメーターを使用して、サブサービスが使用するリソースグループを指定します。
{ "queue": { "resource": eas-r-slzkbq4tw0p6xd**** # By default, the resource group of the inference subservice is used. } }
デフォルトでは、キューサブサービスは推論サブサービスのリソースグループを使用します。
パブリックリソースグループを使用してキューサブサービスをデプロイする場合は、resourceパラメーターを空のままにしておくことができます。 この方法は、専用リソースグループのCPUおよびメモリリソースが不足している場合に使用できます。
説明キューサブサービスをデプロイするには、パブリックリソースグループを使用することを推奨します。
queue. CPUパラメーターとqueue.memoryパラメーターを使用して、各インスタンスのcpuコア数とメモリを指定します。
{ "queue": { "cpu": 2, # Default value: 1. "memory": 8000 # Default value: 4000. } }
デフォルトでは、キューサブサービス用に1 vCPUと4 GBのメモリを持つインスタンスが作成されます。 ほとんどの場合、この仕様はビジネス要件を満たすことができます。
重要推論サブサービスのインスタンス数など、サブスクライバー数が200を超える場合は、CPUコア数を2より大きい値に設定することを推奨します。
運用環境では、小さなメモリサイズを使用しないことを推奨します。
queue.min_replicaパラメーターを使用して、キューサブサービスインスタンスの最小数を指定します。
{ "queue": { "min_replica": 3 # Default value: 1. } }
非同期推論サービスを使用する場合、キューサブサービスインスタンスの数は、推論サブサービスのランタイムインスタンスの数に基づいて自動的に調整されます。 インスタンス数の有効値:
[1, min(2, number of inference subservice instances)]
インスタンス数を0にする非同期推論サービスの自動スケーリングルールを設定すると、システムは自動的にキューサブサービスのインスタンスを1つ保持します。 queue.min_replicaパラメーターを使用して、キューサービスインスタンスの最小数を指定します。説明キューサブサービスインスタンスの数を増やして、サービスの可用性を向上させることができます。 インスタンス数はサービスのパフォーマンスに影響しません。
キューサブサービス機能の設定
ここでは、キューサブサービスの機能設定について説明します。
queue.sink.auto_evictまたはqueue.source.auto_evictパラメーターを使用して、出力キューまたは入力キューの自動データ削除を設定します。
{ "queue": { "sink": { "auto_evict": true # Enable automatic eviction for the output queue. Default value: false. }, "source": { "auto_evict": true # Enable automatic eviction for the input queue. Default value: false. } } }
デフォルトでは、キューの自動データ削除は無効になっています。 キューがその容量の上限に達すると、データをキューに書き込むことができなくなります。 特定のシナリオでは、自動データ削除を有効にして、キューが最も古いデータを自動的に削除し、新しいデータを書き込むことができます。
queue.max_deliveryパラメーターを使用して、データ配信の最大数を設定します。
{ "queue": { "max_delivery": 10 # Set the maximum number of data deliveries to 10. Default value: 5. If you set the value to 0, data can be delivered for an unlimited number of times. } }
1つのデータエントリが配信された回数がこの値を超えると、そのデータは処理不能となり、無効メッセージとして処理されます。 詳細については、「デッドレターポリシー」をご参照ください。
queue.max_idleパラメーターを使用して、最大データ処理時間を指定します。
{ "queue": { "max_idle": "1m" # Set the maximum processing time of a single data entry to 1 minute. If the processing time exceeds 1 minute, the data entry is delivered to other subscribers. After the data is delivered, the delivery count increases by one. # The default value is 0, which specifies that the data processing time has no limit. } }
この例では、パラメーターは1分に設定されています。 時間のh、分のm、秒のsなど、他の単位を指定できます。 1つのデータエントリの処理時間がこのパラメーターの値を超えると、次のような状況が発生する可能性があります。
データエントリの配信時間がqueue.max_deliveryパラメータによって指定されたしきい値を超えない場合、データは他のサブスクライバに配信されます。
データエントリの配信時間がqueue.max_deliveryパラメーターで指定されたしきい値を超えると、システムはデータに無効文字ポリシーを適用します。
queue.de ad_message_policyパラメーターを使用して、無効文字ポリシーを設定します。
{ "queue": { "dead_message_policy": Valid values: Rear and Drop. The value Rear indicates that the data is placed in the tail queue. The value Drop indicates that the data is deleted. # Default value: Rear. } }
キューの最大長またはデータ量の設定
最大キュー長と最大データ量の関係を次の式に示します。
キューサブサービスインスタンスのメモリは固定されています。 キューの長さは、データエントリのサイズの増加に伴って減少します。
デフォルトのメモリは4 GB、最大データ量は8 KBです。 これは、入力および出力キューが230,399データエントリを格納できることを意味する。 キューサブサービスにさらにデータエントリを格納する場合は、前のセクションの手順を実行してメモリサイズを増やします。 システムは総メモリの10% を消費します。
同じキューの最大長と最大データ量の両方を同時に設定することはできません。
queue.sink.max_lengthまたはqueue.source.max_lengthパラメーターを使用して、出力キューまたは入力キューの最大長を指定します。
{ "queue": { "sink": { "max_length": 8000 # Set the maximum length of the output queue to 8000 entries. }, "source": { "max_length": 2000 # Set the maximum length of the input queue to 2000 entries. } } }
queue.sink.max_payload_size_kbまたはqueue.source.max_payload_size_kbパラメーターを使用して、出力キューまたは入力キュー内の1つのデータエントリの最大データ量を指定します。
{ "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. }, "source": { "max_payload_size_kb": 1024 # Set the maximum size of a single data entry in the input queue to 1024KB (1 MB). Default value: 8 KB. } } }
メモリ割り当ての設定
queue.sink.memory_ratioパラメーターを使用して、入力キューと出力キューが占有するメモリサイズを調整します。
{ "queue": { "sink": { "memory_ratio": 0.9 # Specify the memory ratio of the output queue. Default value: 0.5. } } }
説明デフォルトでは、キュー・サブサービス・インスタンスのメモリは、入力キューと出力キューの間で均等に分割されます。 サービスの入力がテキストで、出力が画像であり、出力キューにさらにデータを格納する場合は、queue.sink.memory_ratioパラメーターの値を増やすことができます。 サービスの入力が画像で出力がテキストの場合、queue.sink.memory_ratioパラメータの値を減らすことができます。
自動スケーリングの設定
非同期推論サービスの自動スケーリングの設定方法については、「自動スケーリング」をご参照ください。