本文書では、EdgeOne 边缘推理でセッションアフィニティ(Session Affinity)を有効化して使用する方法について説明します。同一セッションの複数リクエストを優先的に同じGPUインスタンスにスケジューリングし、インスタンス上にキャッシュされたコンテキストプレフィックスを再利用することで、複数ターン対話や長いコンテキストのシナリオにおける初回トークン遅延(TTFT)を低減します。
概要
デフォルトのステートレスルーティングでは、同一セッションの複数リクエストが異なるGPUインスタンスに分散される可能性があり、各リクエストで完全なコンテキストプレフィックスを再計算する必要があります。長いコンテキストのシナリオでは、初回トークン遅延の増加と再計算コストの増大を招きます。
セッションアフィニティを有効化すると、クライアントはリクエストHeaderにセッション識別子(sessionId)を付与し、プラットフォームは同じsessionIdのリクエストを優先的に同じGPUインスタンスにスケジューリングします。これにより、そのインスタンス上にキャッシュされたプレフィックス計算結果を再利用します。
説明:
セッションアフィニティは優先スケジューリング戦略を採用しており、強制的なバインディングではありません。単一インスタンスには同時実行数の上限があり、ターゲットインスタンスの同時実行数が上限に達した場合、リクエストは他のインスタンスにスケジューリングされる可能性があります。この場合、元のインスタンスにキャッシュされたプレフィックスを再利用することはできません。
適用シーン
多轮对话:Chatbot、智能カスタマーサービスなど、各リクエストに完全な会話履歴を含むシナリオです。
長いコンテキストでの追問:同一の長いドキュメントに基づいて複数回質問するシナリオです。例えば、ドキュメントQ&Aやコード分析などがあります。
リアルタイムインタラクション:音声対話、リアルタイム翻訳など、初回トークン遅延に敏感なシナリオです。
リクエストが互いに独立しており、履歴コンテキストを含まない場合、セッションアフィニティを有効化してもメリットはありません。
利用制限
現在サポートされているセッション識別子のソースはHTTP Headerです。Headerフィールド名はサービス設定時に指定できます。
Headerフィールド名は、英字、数字、ハイフンのみをサポートし、長さは1~64文字です。
セッションアフィニティは優先スケジューリング戦略であり、単一インスタンスの同時実行数の上限の影響を受けます。同一セッションのすべてのリクエストが同一インスタンスにスケジューリングされることは保証されません。
セッション識別子を含まないリクエストは正常に呼び出せます。プラットフォームはデフォルトのポリシーに従って処理します。
操作手順
ステップ1:サービスの作成
1. EdgeOneコンソールにログインすると、ページは自動的にエッジ推論に移動します。プロジェクトの作成をクリックするか、特定のプロジェクト名をクリックしてください。 2. サービスリストページでサービス作成をクリックし、ページの指示に従って基本設定、イメージ設定、リソース設定を完了してください。
ステップ2:セッションアフィニティの設定
1. ページを下にスクロールして、詳細設定ブロックまで移動します。
2. セッションアフィニティスイッチをオンにします。スイッチの下にHeaderフィールド入力ボックスが展開されます。
3. Headerフィールドを入力します。これは、クライアントリクエストでsessionIdを運ぶためのカスタムHTTP Headerフィールド名です。デフォルト値はEO-Infer-Session-Idで、必要に応じて変更できます。
4. 作成をクリックします。
ステップ3:デプロイ完了を待つ
作成後、サービスはデプロイ中ステータスになります。進捗はデプロイ履歴タブで確認できます。サービスステータスが実行中になると設定が有効になります。サービスを追加で再起動する必要はありません。スケールインによる排出、フェイルオーバーなどのシナリオはプラットフォームが自動的に処理します。
呼び出し方法
セッションアフィニティを有効化すると、クライアントは毎回のリクエストのHeaderに、手順2で設定したHeaderフィールドを付与します。値は今回のセッションの一意の識別子(sessionId)です。同一セッションのすべてのリクエストは同じ値を使用し、異なるセッションでは異なる値を使用します。
リクエストパラメータ
|
EO-Infer-Session-Id
| Header | string | いいえ | セッション識別子は、クライアントによって生成され、同一セッション内で一貫性が保たれます。フィールド名は、サービス設定内のHeaderフィールドに準じます。 |
curl例:
curl https://YOUR_SERVICE_URL/v1/chat/completions \\
-H "Authorization: Bearer YOUR_API_TOKEN" \\
-H "Content-Type: application/json" \\
-H "EO-Infer-Session-Id: your-session-001" \\
-d '{
"model": "your-model",
"messages": [
{"role": "user", "content": "こんにちは"}
],
"max_tokens": 256
}'
curl https://YOUR_SERVICE_URL/v1/chat/completions \\
-H "Authorization: Bearer YOUR_API_TOKEN" \\
-H "Content-Type: application/json" \\
-H "EO-Infer-Session-Id: your-session-001" \\
-d '{
"model": "your-model",
"messages": [
{"role": "user", "content": "こんにちは"},
{"role": "assistant", "content": "(前回の返却内容)"},
{"role": "user", "content": "続けて追及する内容"}
],
"max_tokens": 256
}'
例の中のYOUR_SERVICE_URL、YOUR_API_TOKENを、サービス詳細ページの基本情報で取得したアクセスアドレスとAPI Tokenに置き換えてください。
よくある質問
|
有効にした後、毎回のリクエストにHeaderを含める必要がありますか。 | 必須ではありません。このHeaderを含まないリクエストも正常に呼び出すことができ、プラットフォームはデフォルトポリシーに従って処理します。 |
同じsessionIdのリクエストは必ず同じインスタンスにスケジュールされますか。 | 必ずしもそうではありません。セッションアフィニティは優先スケジューリングポリシーであり、ターゲットインスタンスの同時実行数が上限に達した場合、リクエストは他のインスタンスにスケジュールされます。 |
Headerフィールド名にはどのような制限がありますか。 | 半角英字、数字、ハイフンのみをサポートし、長さは1~64文字です。それ以外の場合は保存時の検証に失敗します。 |
sessionIdは自分で定義できますか。 | 可能です。クライアント側で生成し、同一セッション内で一貫性を保てば問題ありません。 |
セッションアフィニティ設定を変更する場合、サービスの再起動は必要ですか。 | 不要です。保存後、今回のデプロイに伴って有効になります。サービスステータスが実行中になれば完了です。 |