使用 Amazon SageMaker 模型的可設定狀態會話 - Amazon SageMaker

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

使用 Amazon SageMaker 模型的可設定狀態會話

將請求傳送到 Amazon SageMaker 推論端點時,可以選擇將請求路由到可設定狀態的工作階段。在可設定狀態工作階段期間,您會將多個推論要求傳送至相同的 ML 執行個體,而執行個體便於工作階段。

通常,當您叫用推論端點時,Amazon 會將您的請求 SageMaker 路由到端點託管的多個執行個體之間的任何一個 ML 執行個體。此路由行為可平均分配推論流量,有助於將延遲降至最低。但是,路由行為的一個結果是您無法預測哪個執行個體會為您的請求提供服務。

如果您打算將請求發送到可狀態模型,則此不可預測性是一個限制。可設定狀態模型有一個容器,可快取從推論要求接收的內容資料。由於資料已快取,因此您可以傳送多個要求來與容器互動,而且針對每個要求,您不需要包含互動的完整內容。相反地,模型會從快取的內容資料中繪製,以通知其預測。

當互動的上下文數據非常大時(例如,當它包含以下內容時),可設定狀態模型是理想的選擇:

  • 大型文字檔

  • 長聊天記錄

  • 多模式模型的多媒體資料 (影像、視訊和音訊)

在這些情況下,如果您在每個提示時傳遞完整內容,則請求的網路延遲會變慢,並且應用程式的回應速度也會降低。

在您的推論端點可支援可設定狀態工作階段之前,它必須裝載可設定狀態模型。可設定狀態模型的實作是由您所擁有。Amazon SageMaker 讓您可以將請求路由到可設定狀態的工作階段,但不提供可部署和使用的可設定狀態模型。

如需示範如何實作有狀態互動的範例筆記本和模型容器,請參閱實施示例

如需使用實作可設定狀態模型的相關資訊 TorchServe,請參閱儲存庫中的有狀態推論。 TorchServe GitHub

有狀態工作階段如何運作

在可設定狀態的工作階段期間,您的應用程式會以下列方式與模型容器互動。

若要啟動可設定狀態階段作業
  1. 若要使用 Amazon 託管的可設定狀態模型開始工作階段 SageMaker,您的用戶端會傳InvokeEndpoint送具有. SageMaker API 對於SessionID請求參數,客戶端告訴 SageMaker 通過指定值啟動一個新的會話NEW_SESSION。在請求有效負載中,客戶端還告訴容器啟動新的會話。這個陳述式的語法會根據您的容器實作而有所不同。這取決於您的容器代碼如何處理請求有效負載。

    下列範例會使用 Python (Boto3) 來啟SDK動新的工作階段:

    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")
  2. 您的模型容器通過啟動一個新的會話來處理客戶端的請求。對於會話,它緩存客戶端在請求有效負載中發送的數據。它還創建一個會話 ID,並設置一個時間為 live (TTL) 時間戳。此時間戳記表示工作階段到期的時間。容器必須透過在回應中設定下列HTTP標頭,向 Amazon SageMaker 提供工作階段 ID 和時間戳記:

    X-Amzn-SageMaker-Session-Id: session_id; Expires=yyyy-mm-ddThh:mm:ssZ
  3. 在回應InvokeEndpoint請求時,Amazon 會為回NewSessionID應參數 SageMaker 提供工作階段 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 路由傳送至啟動工作階段的相同 ML 執行個體。由於您的容器已經緩存了原始請求有效負載,因此您的客戶端不需要傳遞原始請求中的相同上下文數據。

    下列範例會傳遞工作階段 ID 與 SessionId request 參數,繼續工作階段:

    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)
  2. 當它關閉會話時,容器 SageMaker 通過在響應中設置以下HTTP標頭返回會話 ID:

    X-Amzn-SageMaker-Closed-Session-Id: session_id
  3. 在響應來自客戶端的InvokeEndpoint請求, SageMaker 提供ClosedSessionId響應參數的會話 ID。

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

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

實施示例

下列範例筆記本示範如何為可設定狀態模型實作容器。它也會示範用戶端應用程式如何啟動、繼續和關閉可設定狀態工作階段。

LLaVA有狀態推論 SageMaker

筆記本使用 LLaVA:大型語言和視覺助理模型,可接受圖像和文本提示。筆記本會將影像上傳至模型,然後詢問有關影像的問題,而不必重新傳送每個要求的影像。模型容器使用 TorchServe 框架。它緩存在GPU內存中的圖像數據。