

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon SageMaker AI モデルを使用したステートフルセッション
<a name="stateful-sessions"></a>

Amazon SageMaker AI 推論エンドポイントにリクエストを送信するときは、*ステートフルセッション*にリクエストをルーティングすることを選択できます。ステートフルセッション中、同じ ML インスタンスに複数の推論リクエストを送信すると、インスタンスによりセッションが進められます。

通常、推論エンドポイントを呼び出すと、Amazon SageMaker AI はエンドポイントにホストされる複数のインスタンス内の任意の 1 つの ML インスタンスにリクエストをルーティングします。このルーティング動作は、推論トラフィックを均等に分散することでレイテンシーを最小限に抑えるのに役立ちます。ただし、ルーティング動作の 1 つの結果として、リクエストを処理するインスタンスを予測することができません。

この予測不能性は、*ステートフルモデル*にリクエストを送信する場合の制限事項です。ステートフルモデルには、推論リクエストから受信したコンテキストデータをキャッシュするコンテナがあります。データはキャッシュされるため、複数のリクエストを送信することでコンテナとインタラクションできます。リクエストごとにインタラクションの完全なコンテキストを含める必要はありません。代わりに、モデルはキャッシュされたコンテキストデータから引き出して予測を通知します。

ステートフルモデルは、次のようなインタラクションのコンテキストデータが非常に大きい場合に最適です。
+ 大きなテキストファイル
+ 長いチャット履歴 
+ マルチモーダルモデルのマルチメディアデータ (画像、動画、オーディオ)

このような場合、すべてのプロンプトで完全なコンテキストを渡すと、リクエストのネットワークレイテンシーが大きくなり、アプリケーションの応答性が低下します。

推論エンドポイントでステートフルセッションをサポートするには、ステートフルモデルをホストする必要があります。ステートフルモデルの実装は、ユーザーが所有します。Amazon SageMaker AI では、ステートフルセッションにリクエストをルーティングすることができますが、デプロイして使用できるステートフルモデルはありません。

ステートフルインタラクションの実装方法を示すノートブックとモデルコンテナの例については、「[実装例](#stateful-sessions-example-notebook)」を参照してください。

TorchServe でステートフルモデルを実装する方法については、TorchServe GitHub リポジトリの「[Stateful Inference](https://github.com/pytorch/serve/tree/master/examples/stateful/sequence_continuous_batching)」を参照してください。

## ステートフルセッションの仕組み
<a name="stateful-sessions-running"></a>

ステートフルセッション中、アプリケーションは次の方法でモデルコンテナとインタラクションします。

**ステートフルセッションを開始するには**

1. Amazon SageMaker AI がホストするステートフルモデルでセッションを開始するときは、クライアントが SageMaker API を使用して [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html) リクエストを送信します。`SessionID` リクエストパラメータの場合、クライアントは値 `NEW_SESSION` を指定して新しいセッションを開始するよう SageMaker AI に指示します。リクエストペイロードでは、クライアントはコンテナに新しいセッションを開始するようにも指示します。このステートメントの構文は、コンテナの実装によって異なります。これは、コンテナコードがリクエストペイロードを処理する方法によって異なります。

   次の例では、SDK for Python (Boto3) を使用して新しいセッションを開始します。

   ```
   import boto3
   import sagemaker
   import json
   
   payload = {
   "requestType":"NEW_SESSION"
   }
   payload = json.dumps(payload)
   
   smr = boto3.client(
       'sagemaker-runtime',
       region_name="region_name",
       endpoint_url="endoint_url")
   
   create_session_response = smr.invoke_endpoint(
       EndpointName="endpoint_name",
       Body=payload,
       ContentType="application/json",
       SessionId="NEW_SESSION")
   ```

1. モデルコンテナは、新しいセッションを開始することによりクライアントのリクエストを処理します。セッションでは、クライアントがリクエストペイロードに送信するデータをキャッシュします。また、セッション ID を作成し、有効期限 (TTL) タイムスタンプを設定します。このタイムスタンプは、セッションの有効期限を示しています。コンテナは、レスポンスで次の HTTP ヘッダーを設定することにより、セッション ID とタイムスタンプを Amazon SageMaker AI に提供する必要があります。

   ```
   X-Amzn-SageMaker-Session-Id: session_id; Expires=yyyy-mm-ddThh:mm:ssZ
   ```

1. `InvokeEndpoint` リクエストへのレスポンスで、Amazon SageMaker AI は `NewSessionID` レスポンスパラメータのセッション ID と TTL タイムスタンプを提供します。

   次の例では、`invoke_endpoint` レスポンスからセッション ID を抽出します。

   ```
   session_id = create_session_response['ResponseMetadata']['HTTPHeaders']['x-amzn-sagemaker-new-session-id'].split(';')[0]
   ```

**ステートフルセッションを続行するには**
+ 後続の推論リクエストに同じセッションを使用する場合、クライアントが別の `InvokeEndpoint` リクエストを送信します。`SessionID` リクエストパラメータには、セッションの ID を指定します。この ID では、SageMaker AI はセッションが開始されたのと同じ ML インスタンスにリクエストをルーティングします。コンテナは既に元のリクエストペイロードをキャッシュしているため、クライアントは元のリクエストと同じコンテキストデータを渡す必要はありません。

  次の例では、`SessionId` リクエストパラメータを指定してセッション ID を渡すことによりセッションを続行します。

  ```
  smr.invoke_endpoint(
      EndpointName="endpoint_name",
      Body=payload,
      ContentType="application/json",
      SessionId=session_id)
  ```

**ステートフルセッションを閉じるには**

1. セッションを閉じるときは、クライアントが最終 `InvokeEndpoint` リクエストを送信します。`SessionID` リクエストパラメータの場合、クライアントはセッションの ID を提供します。リクエスト本文のペイロードで、クライアントはコンテナがセッションを閉じる必要があると記述します。このステートメントの構文は、コンテナの実装によって異なります。

   次の例では、セッションを閉じます。

   ```
   payload = {
       "requestType":"CLOSE"
   }
   payload = json.dumps(payload)
   
   closeSessionResponse = smr.invoke_endpoint(
       EndpointName="endpoint_name",
       Body=payload,
       ContentType="application/json",
       SessionId=session_id)
   ```

1. セッションを閉じるとき、コンテナはレスポンスで次の HTTP ヘッダーを設定してセッション ID を SageMaker AI に返します。

   ```
   X-Amzn-SageMaker-Closed-Session-Id: session_id
   ```

1. クライアントからの `InvokeEndpoint` リクエストに対するレスポンスで、SageMaker AI は `ClosedSessionId` レスポンスパラメータのセッション ID を提供します。

   次の例では、閉じたセッション ID を `invoke_endpoint` レスポンスから抽出します。

   ```
   closed_session_id = closeSessionResponse['ResponseMetadata']['HTTPHeaders']['x-amzn-sagemaker-closed-session-id'].split(';')[0]
   ```

## 実装例
<a name="stateful-sessions-example-notebook"></a>

次のノートブック例は、ステートフルモデルのコンテナを実装する方法を示しています。さらに、クライアントアプリケーションがステートフルセッションを開始、継続、終了する方法も示しています。

[SageMaker AI による LLaVA ステートフル推論](https://github.com/aws-samples/sagemaker-genai-hosting-examples/blob/main/LLava/torchserve/workspace/llava_stateful_deploy_infer.ipynb)

ノートブックは、画像とテキストプロンプトを受け入れる [LLaVA: Large Language and Vision Assistant](https://github.com/haotian-liu/LLaVA/tree/main) モデルを使用しています。ノートブックは画像をモデルにアップロードし、すべてのリクエストに対して画像を再送信することなく画像について質問します。モデルコンテナは、TorchServe フレームワークを使用しています。また、画像データを GPU メモリにキャッシュします。