

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Sesi stateful dengan model Amazon AI SageMaker
<a name="stateful-sessions"></a>

Saat mengirim permintaan ke titik akhir inferensi Amazon SageMaker AI, Anda dapat memilih untuk merutekan permintaan ke sesi *stateful*. Selama sesi stateful, Anda mengirim beberapa permintaan inferensi ke instance ML yang sama, dan instance memfasilitasi sesi.

Biasanya, saat Anda memanggil titik akhir inferensi, Amazon SageMaker AI merutekan permintaan Anda ke satu instans ML di antara beberapa instance yang dihosting titik akhir. Perilaku perutean ini membantu meminimalkan latensi dengan mendistribusikan lalu lintas inferensi Anda secara merata. Namun, salah satu hasil dari perilaku perutean adalah Anda tidak dapat memprediksi instance mana yang akan melayani permintaan Anda. 

*Ketidakpastian ini adalah batasan jika Anda berniat mengirim permintaan Anda ke model stateful.* Model stateful memiliki wadah yang menyimpan data konteks yang diterimanya dari permintaan inferensi. Karena data di-cache, Anda dapat berinteraksi dengan penampung dengan mengirimkan beberapa permintaan, dan dengan setiap permintaan, Anda tidak perlu menyertakan konteks penuh interaksi. Sebaliknya, model mengambil dari data konteks cache untuk menginformasikan prediksinya. 

Model stateful ideal ketika data konteks untuk interaksi sangat besar, seperti ketika mencakup yang berikut:
+ File teks besar
+ Sejarah obrolan panjang 
+ Data multimedia (gambar, video, dan audio) untuk model multimodal

Dalam kasus ini, jika Anda melewati konteks lengkap dengan setiap prompt, latensi jaringan permintaan Anda akan diperlambat, dan respons aplikasi Anda berkurang. 

Sebelum titik akhir inferensi Anda dapat mendukung sesi stateful, itu harus menjadi tuan rumah model stateful. Implementasi model stateful dimiliki oleh Anda. Amazon SageMaker AI memungkinkan Anda untuk merutekan permintaan Anda ke sesi stateful, tetapi tidak menyediakan model stateful yang dapat Anda terapkan dan gunakan. 

Untuk contoh notebook dan wadah model yang menunjukkan bagaimana interaksi stateful diimplementasikan, lihat. [Contoh implementasi](#stateful-sessions-example-notebook)

Untuk informasi tentang mengimplementasikan model stateful dengan TorchServe, lihat [Inferensi Stateful](https://github.com/pytorch/serve/tree/master/examples/stateful/sequence_continuous_batching) di repositori. TorchServe GitHub 

## Cara kerja sesi stateful
<a name="stateful-sessions-running"></a>

Selama sesi stateful, aplikasi Anda berinteraksi dengan wadah model Anda dengan cara berikut. 

**Untuk memulai sesi stateful**

1. Untuk memulai sesi dengan model stateful yang di-host oleh Amazon SageMaker AI, klien Anda mengirimkan [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html)permintaan dengan API. SageMaker Untuk parameter `SessionID` permintaan, klien memberi tahu SageMaker AI untuk memulai sesi baru dengan menentukan nilainya`NEW_SESSION`. Dalam payload permintaan, klien juga memberi tahu penampung untuk memulai sesi baru. Sintaks pernyataan ini bervariasi berdasarkan implementasi container Anda. Itu tergantung pada bagaimana kode kontainer Anda menangani payload permintaan.

   Contoh berikut memulai sesi baru dengan menggunakan 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. Container model Anda menangani permintaan klien Anda dengan memulai sesi baru. Untuk sesi, itu menyimpan data yang dikirim klien dalam payload permintaan. Ini juga membuat ID sesi, dan menetapkan waktu untuk hidup (TTL). Stempel waktu ini menunjukkan kapan sesi berakhir. Container harus menyediakan ID sesi dan stempel waktu SageMaker ke Amazon AI dengan menyetel header HTTP berikut dalam respons:

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

1. Sebagai tanggapan atas `InvokeEndpoint` permintaan tersebut, Amazon SageMaker AI menyediakan ID sesi dan stempel waktu TTL untuk parameter respons. `NewSessionID`

   Contoh berikut mengekstrak ID sesi dari `invoke_endpoint` respon:

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

**Untuk melanjutkan sesi stateful**
+ Untuk menggunakan sesi yang sama untuk permintaan inferensi berikutnya, klien Anda mengirimkan `InvokeEndpoint` permintaan lain. Untuk parameter `SessionID` permintaan, ini menentukan ID sesi. Dengan ID ini, SageMaker AI merutekan permintaan ke instance ML yang sama di mana sesi dimulai. Karena container Anda telah men-cache payload permintaan asli, klien Anda tidak perlu meneruskan data konteks yang sama seperti yang ada di permintaan asli.

  Contoh berikut melanjutkan sesi dengan meneruskan ID sesi dengan parameter `SessionId` permintaan:

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

**Untuk menutup sesi stateful**

1. Untuk menutup sesi, klien Anda mengirimkan `InvokeEndpoint` permintaan akhir. Untuk parameter `SessionID` permintaan, klien memberikan ID sesi. Dalam payload di badan permintaan, klien Anda menyatakan bahwa kontainer harus menutup sesi. Sintaks pernyataan ini bervariasi berdasarkan implementasi container Anda.

   Contoh berikut menutup sesi:

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

1. Saat menutup sesi, penampung mengembalikan ID sesi ke SageMaker AI dengan menyetel header HTTP berikut dalam respons:

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

1. Dalam menanggapi `InvokeEndpoint` permintaan dari klien, SageMaker AI menyediakan ID sesi untuk parameter `ClosedSessionId` respons.

   Contoh berikut mengekstrak ID sesi tertutup dari `invoke_endpoint` respons:

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

## Contoh implementasi
<a name="stateful-sessions-example-notebook"></a>

Contoh notebook berikut menunjukkan bagaimana mengimplementasikan container untuk model stateful. Ini juga menunjukkan bagaimana aplikasi klien memulai, melanjutkan, dan menutup sesi stateful.

[LLaInferensi stateful VA dengan AI SageMaker ](https://github.com/aws-samples/sagemaker-genai-hosting-examples/blob/main/LLava/torchserve/workspace/llava_stateful_deploy_infer.ipynb)

Notebook menggunakan model [LLaVA: Large Language and Vision Assistant](https://github.com/haotian-liu/LLaVA/tree/main), yang menerima petunjuk gambar dan teks. Notebook mengunggah gambar ke model, dan kemudian mengajukan pertanyaan tentang gambar tanpa harus mengirim ulang gambar untuk setiap permintaan. Wadah model menggunakan TorchServe kerangka kerja. Ini menyimpan data gambar dalam memori GPU.