

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 具有 Amazon SageMaker AI 模型的狀態工作階段
<a name="stateful-sessions"></a>

當您將請求傳送至 Amazon SageMaker AI 推論端點時，您可以選擇將請求路由到*狀態工作階段*。請在狀態工作階段期間，將多個推論請求傳送至相同的 ML 執行個體，而執行個體會推動工作階段。

一般而言，當您調用推論端點時，Amazon SageMaker AI 會將您的請求路由到端點託管的多個執行個體中的任何一個 ML 執行個體。此路由動作會平均分佈您的推論流量，進而盡可能降低延遲。不過，這種路由動作所產生的其中一個結果是您無法預測哪個執行個體會負責處理您的請求。

如果您打算將請求傳送至*狀態模型*，則此特性即是一種限制。狀態模型具有容器，可以快取從推論請求接收的內容資料。資料是快取而來，所以您可以傳送多個請求與容器互動，而不需要針對每個請求納入完整的互動內容。反之，模型會從快取的內容資料中提取內容，以進行預測。

狀態模型的理想情況是互動的內容資料非常龐大，例如包含下列項目：
+ 大型文字檔案
+ 長聊天歷史記錄 
+ 多模態模型的多媒體資料 (影像、影片和音訊)

在這些情況下，如果您透過每個提示傳遞完整文字內容，請求的網路會變慢，應用程式回應能力也會降低。

您的推論端點必須託管狀態模型，才可以支援狀態工作階段。狀態模型的實作由您擁有。Amazon SageMaker AI 可以讓您將請求路由到狀態工作階段，但不會提供可以部署和使用的狀態模型。

如需範例筆記本和模型容器，了解如何實作狀態互動，請參閱 [實作範例](#stateful-sessions-example-notebook)。

如需使用 TorchServe 實作狀態模型的資訊，請參閱 TorchServe GitHub 儲存庫中的[狀態推論](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。SageMaker AI 會透過此 ID，將請求路由到啟動工作階段的相同 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。

   下列範例從 `invoke_endpoint` 回應中擷取已關閉的工作階段 ID：

   ```
   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：大型語言和視覺助理](https://github.com/haotian-liu/LLaVA/tree/main)模型，該模型接受映像和文字提示。筆記本會將映像上傳至模型，然後詢問映像相關問題，但不必為每個請求重新傳送映像。模型容器使用 TorchServe 架構。它會快取 GPU 記憶體中的映像資料。