View a markdown version of this page

Prefill dan Decode terpilah untuk inferensi HyperPod - Amazon SageMaker AI

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

Prefill dan Decode terpilah untuk inferensi HyperPod

Disaggregated Prefill and Decode (DPD) memisahkan dua fase inferensi LLM, prefill dan decode, ke pool GPU khusus dan mentransfer cache nilai kunci (KV) di antara mereka melalui Elastic Fabric Adapter (EFA) menggunakan Remote Direct Memory Access (RDMA). GPU-Direct

Saat prefill dan decode berjalan pada GPU yang sama (colocated), satu permintaan konteks panjang dapat menghentikan aliran token dalam penerbangan untuk klien lain, meningkatkan latensi per token saat dimuat. DPD menghilangkan interferensi ini dengan menjalankan prefill terikat komputasi pada satu set GPU dan decode terikat bandwidth memori pada yang lain, menghasilkan latensi yang lebih dapat diprediksi di bawah lalu lintas campuran dan memungkinkan Anda menskalakan setiap fase secara independen.

Operator inferensi menangani orkestrasi, yang mencakup penyediaan router, pengkabelan prefill dan decode pod bersama-sama melalui LMCache dan NIXL, dan mengintegrasikan dengan observabilitas. HyperPod Anda dapat mengaktifkan DPD dengan menambahkan pdSpec bagian ke InferenceEndpointConfig sumber daya yang sama yang sudah Anda gunakan untuk titik akhir inferensi.

Ketika DPD membantu

DPD memberikan manfaat paling besar ketika semua kondisi berikut hadir:

  • Model padat besar — 70B+parameter (misalnya, Llama 3.3 70B).

  • Input panjang — 4.000+ token masukan. Inter-token Skala peningkatan latency (ITL) dengan panjang input karena prefill yang lebih panjang menyebabkan lebih banyak interferensi decode saat dikolokasi.

  • Konkurensi berkelanjutan - 2+ permintaan per detik. Tanpa permintaan bersamaan yang bersaing untuk GPU yang sama, tidak ada yang bisa dipisahkan.

  • Output sedang atau panjang — 256+ token keluaran. Lebih banyak token keluaran berarti lebih banyak manfaat kumulatif dari latensi per token yang stabil.

Jika beban kerja Anda memiliki input pendek, konkurensi rendah, atau menggunakan model kecil, penerapan kolokasi standar lebih sederhana dan berkinerja baik.

Prasyarat

Sebelum menerapkan titik akhir inferensi yang menggunakan Disaggregated Prefill dan Decode, Anda perlu menyiapkan komponen berikut di lingkungan pengembangan lokal Anda:

  • AWS Antarmuka Baris Perintah (AWS CLI)

  • Akses ke cluster HyperPod Amazon EKS Anda melalui kubectl

  • Token Hugging Face yang memungkinkan akses baca ke pos pemeriksaan model masing-masing. Ini tidak diperlukan jika pos pemeriksaan model sudah terletak di ember Amazon S3.

  • Gambar pekerja yang mencakup VllM, LMCache, NVIDIA NIXL, dan penyedia libfabric EFA. Opsi gambar berikut didukung:

    • DLC: public.ecr.aws/deep-learning-containers/vllm:server-hyperpod-cuda-v1.1

    • LMcache: lmcache/vllm-openai:v0.4.3

    Kedua gambar termasuk LMCache 0.4.3, vLLm 0.19.0, dan NIXL 1.0.0.

  • HyperPod Operator Inferensi versi 3.2 atau yang lebih baru diinstal. DPD tidak didukung pada versi sebelumnya. Operator diinstal secara default di cluster HyperPod Amazon EKS yang baru dibuat. Jika Anda berniat menggunakan cluster yang ada, ikuti petunjuk penginstalan diMenyiapkan HyperPod cluster Anda untuk penerapan model. Verifikasi versi Anda:

    kubectl get deployment hyperpod-inference-operator-controller-manager \ -n hyperpod-inference-system \ -o jsonpath='{.spec.template.spec.containers[?(@.name=="manager")].image}{"\n"}'
penting

Prefill dan Decode terpilah memerlukan EFA-capable instance dengan dukungan RDMA. GPU-Direct Jenis contoh berikut didukung:ml.p5.48xlarge,ml.p5e.48xlarge,ml.p5en.48xlarge,ml.p6-b200.48xlarge,ml.p6-b300.48xlarge. Jenis instans lainnya tidak didukung untuk DPD.

Menyebarkan titik akhir DPD

Sebagian besar InferenceEndpointConfig bidang dibagi dengan titik akhir non-DPD dan didokumentasikan dalam. Terapkan model pondasi dan model penyesuaian khusus Untuk mengaktifkan DPD, tambahkan bagian berikut ke manifes Anda.

Prefill-Decode Spesifikasi: PDSpec

Mendeklarasikan prefill/decode topologi dan menentukan argumen. Kehadiran bidang inilah yang membuat titik akhir terpilah: operator membuat Deployment terpisah untuk prefill dan decode dan menghubungkannya melalui router dan backend LMCache PD.

pdSpec: prefillSpec: replicas: 1 resources: limits: nvidia.com/gpu: ${GPUS_PER_NODE} requests: nvidia.com/gpu: ${GPUS_PER_NODE} args: - "--gpu-memory-utilization" - "0.75" decodingSpec: replicas: 1 resources: limits: nvidia.com/gpu: ${GPUS_PER_NODE} requests: nvidia.com/gpu: ${GPUS_PER_NODE} routingThreshold: 4096
replicas

Skalakan prefill dan decode secara independen.

resources

Diterapkan pada spesifikasi pod peran. Top-levelworker.resourcesdiabaikan untuk pod DPD; nilai per peran diganti.

routingThreshold

Ambang batas panjang token yang merutekan permintaan ke jalur terpilah. Permintaan yang tidak memenuhi ambang batas ini melewati prefiller dan langsung menuju ke decoder.

args

Bendera VllM khusus untuk peran itu. Digabungkan worker.args saat startup: flag yang sudah worker.args ada diganti dengan nilai per peran; flag yang tidak ada ditambahkan.

Variabel Lingkungan DPD: Variabel Lingkungan

Variabel lingkungan ini diterapkan secara identik ke wadah prefiller dan decoder; tidak ada bidang env-var per-peran. Untuk perilaku per peran, gunakan pdSpec.{prefillSpec,decodingSpec}.args sebagai gantinya.

environmentVariables: - name: PD_BUFFER_SIZE value: "8589934592" - name: LMCACHE_SAVE_DECODE_CACHE value: "False" - name: PYTHONHASHSEED value: "0"
PD_BUFFER_SIZE(8 GiB)

Buffer GPU dicadangkan pada decoder untuk transfer cache KV yang masuk, berukuran per peringkat. Untuk Llama 70B di TP=8, cache KV setiap token kira-kira 40 KB per peringkat, jadi prompt 6000-token menempati sekitar 0,23 GB per peringkat dan 8 GiB menampung sekitar 35 transfer dalam penerbangan tersebut. Ketika buffer melebihi kapasitas, log dekoder Failed to allocate memory object, retrying... dan klien melihat lonjakan latensi. Tingkatkan ke 16/32 GiB atau skala decodingSpec.replicas jika diperlukan.

LMCACHE_SAVE_DECODE_CACHE: "False"

Menonaktifkan caching L1 yang berlebihan pada decoder. Prefiller adalah sumber kebenaran untuk cache hits.

PYTHONHASHSEED: "0"

LMCache menggunakan built-in Python hash() untuk menghitung kunci cache prompt token. Python mengacak benih hash per proses secara default, sehingga prompt identik menghasilkan kunci yang berbeda pada prefiller dan decoder dan pencarian hilang. Menyematkan benih membuat kunci setuju di seluruh polong.

Konfigurasikan strategi perutean

intelligentRoutingSpecBagian ini menetapkan strategi perutean yang digunakan router DPD untuk memilih prefiller untuk setiap permintaan. Router dibuat secara otomatis saat pdSpec ada; bagian ini opsional dan default ke. prefixaware

intelligentRoutingSpec: enabled: true routingStrategy: prefixaware

DPD juga dapat diintegrasikan dengan intelligent routing dan KV caching. Untuk informasi selengkapnya, lihat Konfigurasikan caching KV dan perutean cerdas.

Dengan replika prefill tunggal, semua strategi merutekan ke replika itu. Pilihan hanya memengaruhi perilaku ketikaprefillSpec.replicas > 1:

  • Untuk replika prefill tunggal, gunakan prefixaware (default) untuk memaksimalkan klik cache KV saat prompt berbagi awalan umum seperti prompt sistem atau riwayat obrolan.

  • Untuk beberapa replika prefill, gunakan roundrobin untuk mendistribusikan beban secara merata di seluruh replika dan hindari bercak panas pada satu prefiller.

Contoh lengkap

Manifes berikut menerapkan Llama 3.3 70B pada dua instance ml.p5.48xlarge (satu prefiller, satu decoder):

apiVersion: inference.sagemaker.aws.amazon.com/v1 kind: InferenceEndpointConfig metadata: name: dpd-test namespace: default spec: endpointName: dpd-test instanceType: ml.p5.48xlarge invocationEndpoint: v1/chat/completions modelName: Llama-3.3-70B-Instruct modelSourceConfig: modelSourceType: s3 modelLocation: Llama-3.3-70B-Instruct s3Storage: bucketName: <YOUR_BUCKET> region: <YOUR_REGION> loadBalancer: healthCheckPath: /health metrics: enabled: true kvCacheSpec: enableL1Cache: true intelligentRoutingSpec: enabled: true routingStrategy: prefixaware pdSpec: prefillSpec: replicas: 1 resources: requests: nvidia.com/gpu: "8" limits: nvidia.com/gpu: "8" decodingSpec: replicas: 1 resources: requests: nvidia.com/gpu: "8" limits: nvidia.com/gpu: "8" routingThreshold: 4096 worker: image: public.ecr.aws/deep-learning-containers/vllm:server-hyperpod-cuda-v1.1 args: - "--model" - "/opt/ml/model" - "--host" - "0.0.0.0" - "--port" - "8000" - "--tensor-parallel-size" - "8" - "--max-model-len" - "16384" - "--gpu-memory-utilization" - "0.75" modelInvocationPort: name: http containerPort: 8000 modelVolumeMount: name: model-weights mountPath: /opt/ml/model resources: requests: cpu: "96" memory: 1024Gi nvidia.com/gpu: "8" limits: cpu: "96" memory: 1024Gi nvidia.com/gpu: "8" environmentVariables: - name: HF_HOME value: /tmp/hf_home - name: PD_BUFFER_SIZE value: "8589934592" - name: LMCACHE_SAVE_DECODE_CACHE value: "False" - name: PYTHONHASHSEED value: "0"

Terapkan manifes:

kubectl apply -f inference_endpoint_dpd_config.yaml

Verifikasi penyebaran

Penarikan gambar dan pemuatan model membutuhkan waktu beberapa menit. Pantau status pod:

kubectl get pods -A \ | grep -E "prefill-|decode-|router"

Penyebaran yang sehat menunjukkan:

NAMESPACE NAME READY STATUS RESTARTS AGE default prefill-dpd-test-XXXX 3/3 Running 0 7m default decode-dpd-test-XXXX 3/3 Running 0 7m hyperpod-inference-system dpd-test-router-XXXX 2/2 Running 0 7m

Setiap pod model memiliki 3 kontainer (pekerja VllM, proxy terbalik Nginx, kolektor). OpenTelemetry Pod router memiliki 2 kontainer (router, OpenTelemetry kolektor). Periksa InferenceEndpointConfig statusnya:

kubectl get inferenceendpointconfig dpd-test -n default \ -o jsonpath='{.status.conditions[0].message}{"\n"}'

Output yang diharapkan: DPD prefill and decode deployments are ready

Verifikasi peran DPD

Konfirmasikan laporan prefiller sender dan laporan decoder. receiver Ini adalah satu-satunya sinyal startup yang paling diskriminatif — jika kedua pod melaporkan peran yang sama atau tidak mencetak saluran, operator tidak menghubungkan DPD dengan benar.

PREFILL_POD=$(kubectl get pod -n ${NAMESPACE} \ -l 'inference.sagemaker.aws.amazon.com/dpd-role=prefill' \ -o jsonpath='{.items[0].metadata.name}') DECODE_POD=$(kubectl get pod -n ${NAMESPACE} \ -l 'inference.sagemaker.aws.amazon.com/dpd-role=decode' \ -o jsonpath='{.items[0].metadata.name}') kubectl logs $PREFILL_POD -n ${NAMESPACE} -c prefill-${DEPLOYMENT_NAME} \ | grep -oE "'pd_role': '[a-z]+'" | sort -u kubectl logs $DECODE_POD -n ${NAMESPACE} -c decode-${DEPLOYMENT_NAME} \ | grep -oE "'pd_role': '[a-z]+'" | sort -u

Keluaran yang diharapkan

'pd_role': 'sender' 'pd_role': 'receiver'

Memanggil titik akhir

Setelah titik akhir siap, kirim prompt pendek dan panjang untuk melatih kedua jalur perutean, lalu periksa log untuk mengonfirmasi transfer KV melalui EFA.

PREFILL_POD=$(kubectl get pod -n ${NAMESPACE} \ -l 'inference.sagemaker.aws.amazon.com/dpd-role=prefill' \ -o jsonpath='{.items[0].metadata.name}') DECODE_POD=$(kubectl get pod -n ${NAMESPACE} \ -l 'inference.sagemaker.aws.amazon.com/dpd-role=decode' \ -o jsonpath='{.items[0].metadata.name}') ROUTER_POD=$(kubectl get pods -n hyperpod-inference-system -o name \ | grep -- "${DEPLOYMENT_NAME}-${NAMESPACE}-router" | head -1) ROUTER_URL=http://${DEPLOYMENT_NAME}-${NAMESPACE}-routing-service.hyperpod-inference-system.svc.cluster.local:443/v1/chat/completions

Prompt pendek (di bawah ambang batas, langsung ke decoder)

Permintaan dengan token lebih sedikit daripada routingThreshold melewati prefiller dan langsung menuju ke decoder:

kubectl run curl-short --rm -it --image=curlimages/curl --restart=Never -- \ curl -s -k -X POST "$ROUTER_URL" \ -H "Content-Type: application/json" \ -d '{ "model": "/opt/ml/model", "messages": [{"role": "user", "content": "What is disaggregated prefill-decode in one sentence?"}], "max_tokens": 80, "temperature": 0.0 }'

Long prompt (melebihi ambang batas, jalur DPD)

Permintaan yang melebihi rute ambang batas melalui prefiller untuk perhitungan cache KV, lalu ke dekoder untuk pembuatan token:

kubectl run curl-long --rm -it --image=curlimages/curl --restart=Never -- sh -c ' LONG="" i=0; while [ $i -lt 600 ]; do LONG="${LONG}The quick brown fox jumps over the lazy dog. "; i=$((i+1)); done curl -s -k -X POST "'"$ROUTER_URL"'" \ -H "Content-Type: application/json" \ -d "{\"model\":\"/opt/ml/model\",\"messages\":[{\"role\":\"user\",\"content\":\"${LONG}\"}],\"max_tokens\":30,\"temperature\":0.0}" '

Verifikasi transfer KV

Setelah mengirim prompt yang panjang, konfirmasikan cache KV ditransfer dengan memeriksa log decoder:

kubectl logs $DECODE_POD -n ${NAMESPACE} -c decode-${DEPLOYMENT_NAME} \ | grep -E "Retrieved.*tokens.*throughput" | tail -2

Output yang diharapkan (satu baris per peringkat TP):

[Worker_TP5] [LMCache INFO] [req_id=cmpl-...] Retrieved 6035 out of 6035 required tokens (from 6035 total tokens). size: 0.2344 gb, cost 1.3304 ms, throughput: 176.1686 GB/s

Retrieved N out of N required tokensdengan N > 0 mengonfirmasi cache KV berhasil melintasi saluran NIXL. Jika Anda lihatRetrieved 0 out of N, decoder kembali ke perhitungan ulang lokal — lihat. Masalah penyebaran Prefill and Decode (DPD) terpilah

Anda juga dapat memverifikasi keputusan perutean di log router:

kubectl logs $ROUTER_POD -n hyperpod-inference-system -c router-container --tail=20 \ | grep -E "Conditional routing"

Untuk prompt panjang, Anda akan melihat:

[INFO] Conditional routing: estimated_tokens=6750, threshold=4096, disaggregate=True

Untuk prompt singkat:

[INFO] Conditional routing: estimated_tokens=12, threshold=4096, disaggregate=False
catatan

Untuk memanggil melalui titik akhir SageMaker AI AI, atur endpointName di file Anda. InferenceEndpointConfig Jika tidak endpointName disetel, tidak ada titik akhir SageMaker AI AI yang dibuat dan hanya pemanggilan ALB langsung yang tersedia.

Observabilitas

Aktifkan metrik dengan menyetel metrics.enabled: true di AndaInferenceEndpointConfig. Metrik DPD tersedia di dasbor HyperPod inferensi. Untuk informasi selengkapnya, lihat Menerapkan observabilitas inferensi pada cluster HyperPod.

DPD-specific Metrik berikut tersedia:

DPD-specific metrik
Metrik Deskripsi
E2E TTFT Keseluruhan waktu untuk token pertama (prefill +transfer KV+routing)
Pra-isi TTFT Prefiller-only latensi
Antrian Prefill Jumlah permintaan yang menunggu prefill
Antrian Dekode Jumlah permintaan yang menunggu di decoder
Waktu Prefill Waktu yang dihabiskan untuk komputasi prefill
Dekode Latensi Per-token latensi keluaran (TPOT)
Waktu Transfer KV Saatnya mentransfer cache KV dari prefiller ke decoder
Hitungan Perutean DPD Permintaan terpilah vs. fallback (di bawah ambang batas)

Sesuaikan penerapan DPD Anda

Tabel berikut memberikan referensi cepat untuk menyetel DPD berdasarkan gejala yang Anda amati di dasbor metrik Anda.

Referensi penyetelan DPD
Config Apa yang dilakukannya Default Kapan harus menyetel
pdSpec.routingThreshold Token input minimum untuk rute melalui prefiller. Permintaan di bawah ambang batas ini langsung menuju ke decoder. 4096 Default berfungsi dengan baik untuk sebagian besar beban kerja. Mengaturnya terlalu rendah meningkatkan TTFT karena transfer KV yang tidak perlu pada prompt singkat, sementara pengaturannya terlalu tinggi membatasi perbaikan TPOT karena lebih sedikit permintaan yang mengambil jalur DPD.
pdSpec.prefillSpec.replicas Jumlah pod prefill. 1 Tingkatkan jika kedalaman antrian prefill tinggi untuk meningkatkan TTFT prefill.
PD_BUFFER_SIZE Buffer GPU decoder untuk transfer KV yang masuk (per peringkat). 8 GiB menampung sekitar 35 K-token transfer dalam penerbangan 6 untuk 70B di TP = 8. "8589934592"(8 GiB) Tingkatkan untuk menangani lebih banyak transfer KV bersamaan. Kurangi jika Anda melihat masalah memori. Saat meningkatkan, Anda mungkin perlu menurunkan --gpu-memory-utilization decoder untuk membebaskan memori GPU untuk buffer yang lebih besar.
--gpu-memory-utilization Fraksi memori GPU yang digunakan VllM untuk bobot, aktivasi, dan cache KV. 0.75 Tingkatkan untuk lebih banyak ruang kepala cache KV pada input panjang. Risiko: prefiller OOM karena prefill juga membutuhkan memori untuk aktivasi. Uji dengan distribusi panjang input Anda yang sebenarnya.
--max-num-seqs Urutan bersamaan maks per batch pekerja. 16(prefiller), 32 (decoder) Naikkan untuk batching yang lebih baik di bawah beban. Turunkan jika menekan OOM pada prefiller. Tetapkan per peran melalui. pdSpec.{prefillSpec,decodingSpec}.args
intelligentRoutingSpec.routingStrategy Bagaimana router memilih prefiller ketika ada beberapa replika. prefixaware Gunakan roundrobin untuk mendistribusikan beban secara merata di beberapa replika prefiller. Gunakan prefixaware atau kvaware dengan prefiller tunggal atau ketika prompt berbagi awalan umum (prompt sistem, riwayat obrolan) untuk memaksimalkan klik cache.

Uji dengan beban kerja aktual Anda dan distribusi panjang input.

Untuk menerapkan perubahan konfigurasi, edit penerapan YAMM Anda dan terapkan kembali:

kubectl apply -f inference_endpoint_dpd_config.yaml

Keterbatasan yang Sudah Diketahui

  • DPD direkomendasikan untuk model padat dengan parameter 70B atau lebih. Model dan Mixture-of-Experts model yang lebih kecil biasanya tidak mendapat manfaat dari disagregasi.

  • Rilis saat ini mendukung penerapan decode tunggal per titik akhir. Support untuk beberapa penerapan decode direncanakan untuk rilis di masa mendatang.

  • Kinerja divalidasi hingga 64 permintaan bersamaan pada ml.p5.48xlarge dengan Llama 3.3 70B.

  • Untuk kembali dari penerapan DPD ke penerapan kolokasi standar, terapkan yang baru tanpa. InferenceEndpointConfig pdSpec

Untuk pemecahan masalah penyebaran DPD, lihat. Masalah penyebaran Prefill and Decode (DPD) terpilah