Lensa ML

Merancang Serving LLM

Langkah 1 dari 6: Kebutuhan Sistem

Traffic, ukuran prompt, dan target latency

GPU
3
Token pertama
45 ms
Per token
32 ms
Per 1 juta output
$0.556
Desain untuk 10 req/s · prompt 1.000 token · jawaban 300 token
Satu request, sesuai skala (sumbu sampai 9.000 token)prompt 1,000jawaban 300 →0k3k6k9k
Target request per detik10
Panjang prompt (token)1,000
Panjang jawaban (token)300
Target waktu sampai token pertama1.0 s
Target per token50 ms
Token per request
1,300
Token jawaban/s yang dibutuhkan
3,000
Kecepatan baca pada target
20 tok/s

Armada GPU harus menghasilkan 3.000 token jawaban setiap detik, sementara tiap pengguna melihat token pertamanya dalam 1,0 s, lalu satu token setiap 50 ms. Langkah berikutnya menghitung biayanya.

Asumsi
Efisiensi terhadap roofline ideal100%
Headroom untuk lonjakan1.30×
Model7B, fp16Bentuk Llama 2 7B: 32 layer, 32 KV head berdimensi 128
GPU80 GB · 2 TB/s · 300 TFLOP/sIlustrasi, akselerator yang sama dengan penjelasan KV cache dan continuous batching
Waktu satu passmax(compute, memory)FLOP ÷ puncak atau byte ÷ bandwidth, mana pun yang lebih lambat
Cadangan memori10%Aktivasi, fragmentasi, buffer runtime
Harga$2.00/GPU-jamContoh; atur di langkah terakhir
Tidak dimodelkanantrean, jeda prefillWaktu sampai token pertama mengasumsikan antrean kosong; headroom mewakili keduanya

Geser kelima slider untuk mengatur kebutuhan. Token jawaban per detik adalah request per detik dikali panjang jawaban, dan angka inilah yang harus dipertahankan seluruh armada GPU. Target 50 ms per token setara sekitar 20 token per detik. Itu lebih cepat daripada kecepatan baca kebanyakan orang, makanya layanan chat membidik dekat angka ini, bukan jauh di bawahnya.

Langkah 2 dari 6: Muatkah di Satu GPU?

Weight cukup sekali, KV cache per request

GPU
3
Token pertama
45 ms
Per token
32 ms
Per 1 juta output
$0.556
Desain untuk 10 req/s · prompt 1.000 token · jawaban 300 token
Memori pada satu GPU80 GBweight 13.5 GBKV × 32 21.8 GBcadangan 8.0 GB
Weight
KV cache
Request yang berjalan bersamaan32
Weight
13.5 GB
KV per request
0.68 GB
Maksimum yang muat
85

KV cache untuk 32 request (21,8 GB) sudah lebih besar daripada weight (13,5 GB). Begitu request lebih dari beberapa, cache-lah, bukan modelnya, yang menentukan jumlah pengguna yang bisa dilayani satu GPU: di sini 85.

Asumsi
Efisiensi terhadap roofline ideal100%
Headroom untuk lonjakan1.30×
Model7B, fp16Bentuk Llama 2 7B: 32 layer, 32 KV head berdimensi 128
GPU80 GB · 2 TB/s · 300 TFLOP/sIlustrasi, akselerator yang sama dengan penjelasan KV cache dan continuous batching
Waktu satu passmax(compute, memory)FLOP ÷ puncak atau byte ÷ bandwidth, mana pun yang lebih lambat
Cadangan memori10%Aktivasi, fragmentasi, buffer runtime
Harga$2.00/GPU-jamContoh; atur di langkah terakhir
Tidak dimodelkanantrean, jeda prefillWaktu sampai token pertama mengasumsikan antrean kosong; headroom mewakili keduanya

Ganti Weight antara fp16, int8, dan int4, lalu seret Request yang berjalan bersamaan melewati garis 80 GB. Biaya weight adalah 6,74 miliar parameter dikali byte per parameter. Key-value (KV) cache butuh 2 (key dan value) × 32 layer × 32 KV head × 128 dimensi × 2 byte = 0.5 MiB per token pada fp16, untuk setiap token dari setiap request. Sebanyak 10% memori disisihkan untuk aktivasi dan fragmentasi.

Langkah 3 dari 6: Linimasa Satu Request

Prefill dibatasi komputasi, decode dibatasi memori

GPU
3
Token pertama
45 ms
Per token
32 ms
Per 1 juta output
$0.556
Desain untuk 10 req/s · prompt 1.000 token · jawaban 300 token
Prefill, lalu 20 token jawaban pertama (satu pengguna)prefilltoken pertama 45 mstarget 1.0 s di luar grafik, ke kanan →0186 ms
Panjang prompt (token)1,000
Token pertama
45 ms
Per token (sendiri)
7.0 ms
Prefill dibatasi
komputasi

Prefill memproses semua 1.000 token prompt dalam satu pass: 13,5 TFLOP, dibatasi komputasi, selama 45 ms. Setelah itu, tiap token jawaban butuh satu pass terpisah yang membaca ulang 13,5 GB weight hanya untuk satu token, jadi decode dibatasi memori dan butuh 7,0 ms per token dengan satu pengguna.

Asumsi
Efisiensi terhadap roofline ideal100%
Headroom untuk lonjakan1.30×
Model7B, fp16Bentuk Llama 2 7B: 32 layer, 32 KV head berdimensi 128
GPU80 GB · 2 TB/s · 300 TFLOP/sIlustrasi, akselerator yang sama dengan penjelasan KV cache dan continuous batching
Waktu satu passmax(compute, memory)FLOP ÷ puncak atau byte ÷ bandwidth, mana pun yang lebih lambat
Cadangan memori10%Aktivasi, fragmentasi, buffer runtime
Harga$2.00/GPU-jamContoh; atur di langkah terakhir
Tidak dimodelkanantrean, jeda prefillWaktu sampai token pertama mengasumsikan antrean kosong; headroom mewakili keduanya

Seret Panjang prompt dan lihat batang prefill memanjang, sementara lebar tiap tanda decode tetap. Prefill memproses semua token prompt dalam satu pass, sekitar 2 FLOP per parameter per token, jadi ia dibatasi komputasi. Tiap pass decode menangani satu token, tetapi tetap membaca semua weight, jadi ia dibatasi bandwidth memori: 13.5 GB ÷ 2 TB/s ≈ 6.7 ms sebelum ada pembacaan cache.

Langkah 4 dari 6: Batching

Satu kali baca weight dipakai bersama banyak pengguna

GPU
3
Token pertama
45 ms
Per token
32 ms
Per 1 juta output
$0.556
Desain untuk 10 req/s · prompt 1.000 token · jawaban 300 token
waktu per token (ms)token/s per GPU00291,444572,889target per token185request dalam batch (sampai batas memori)
Ukuran batch32
Per token
16 ms
Token/s per GPU
1,953
Request/s per GPU
5.04

32 request berbagi setiap pembacaan weight, jadi GPU menghasilkan 1.953 token per detik, dan tiap pengguna tetap mendapat satu token setiap 16 ms. Bayarannya, cache milik tiap request dibaca di setiap langkah. Itulah sebabnya waktu per token naik perlahan.

Asumsi
Efisiensi terhadap roofline ideal100%
Headroom untuk lonjakan1.30×
Model7B, fp16Bentuk Llama 2 7B: 32 layer, 32 KV head berdimensi 128
GPU80 GB · 2 TB/s · 300 TFLOP/sIlustrasi, akselerator yang sama dengan penjelasan KV cache dan continuous batching
Waktu satu passmax(compute, memory)FLOP ÷ puncak atau byte ÷ bandwidth, mana pun yang lebih lambat
Cadangan memori10%Aktivasi, fragmentasi, buffer runtime
Harga$2.00/GPU-jamContoh; atur di langkah terakhir
Tidak dimodelkanantrean, jeda prefillWaktu sampai token pertama mengasumsikan antrean kosong; headroom mewakili keduanya

Seret Ukuran batch dari 1 sampai batas memori. Waktu per token adalah max(2 × params × batch ÷ 300 TFLOP/s, (weights + batch × context × 0.5 MiB) ÷ 2 TB/s). Suku weight dipakai bersama oleh batch, tetapi cache tiap request tidak, jadi waktu per token terus naik. Rencana ini memakai batch terbesar yang waktu per token-nya masih di bawah target.

Langkah 5 dari 6: Scale Out

Hukum Little dan opsi yang mengecilkan armada GPU

GPU
3
Token pertama
45 ms
Per token
32 ms
Per 1 juta output
$0.556
Desain untuk 10 req/s · prompt 1.000 token · jawaban 300 token
3 GPU, masing-masing menjalankan sekitar 33 dari batch 85 request
Target request per detik10
berjalan = 10 req/s × 9.75 s = 98
GPU
3
Request yang sedang berjalan
98
Req/s per GPU
6.28

Tiap langkah decode menghabiskan sebagian besar waktunya untuk membaca cache, bukan weight. Itu sebabnya GQA, yang mengecilkan cache empat kali, memangkas armada GPU jauh lebih banyak daripada weight int4. Hukum Little merangkumnya: 10 req/s yang masing-masing butuh 9,75 s berarti ada 98 request yang sedang berjalan setiap saat.

Asumsi
Efisiensi terhadap roofline ideal100%
Headroom untuk lonjakan1.30×
Model7B, fp16Bentuk Llama 2 7B: 32 layer, 32 KV head berdimensi 128
GPU80 GB · 2 TB/s · 300 TFLOP/sIlustrasi, akselerator yang sama dengan penjelasan KV cache dan continuous batching
Waktu satu passmax(compute, memory)FLOP ÷ puncak atau byte ÷ bandwidth, mana pun yang lebih lambat
Cadangan memori10%Aktivasi, fragmentasi, buffer runtime
Harga$2.00/GPU-jamContoh; atur di langkah terakhir
Tidak dimodelkanantrean, jeda prefillWaktu sampai token pertama mengasumsikan antrean kosong; headroom mewakili keduanya

Geser Target request per detik dan aktifkan keempat opsi. Request per GPU adalah 1 ÷ (token jawaban × waktu per token ÷ batch + waktu prefill), dan armada GPU adalah laju target dikali headroom 1,3 lalu dibagi angka itu. Hukum Little (L = λW) menyatakan bahwa request yang sedang berjalan sama dengan laju kedatangan dikali waktu tiap request berada di dalam sistem. Grouped-query attention (GQA) membuat beberapa query head berbagi satu key-value head. Mistral 7B dan Llama 2 70B sama-sama memakai 8 KV head; dengan 8, bukan 32, cache model ini mengecil empat kali.

Langkah 6 dari 6: Tinjauan Desain

Desain dibandingkan dengan kebutuhan, dan apa yang perlu diubah berikutnya

GPU
3
Token pertama
45 ms
Per token
32 ms
Per 1 juta output
$0.556
Desain untuk 10 req/s · prompt 1.000 token · jawaban 300 token
✓Token pertama ≤ 1.0 s45 ms
✓Per token ≤ 50 ms32 ms
·GPU 10 req/s × 1.3 headroom3
·Per 1 juta token jawaban pada $2.00/GPU-jam$0.556
Opsi paling berdampak dari sini (GPU yang dihemat)GQA (8 KV head)−2 → 1weight int4−1 → 2KV cache int8−1 → 2
Harga GPU ($ per jam)$2.00
Armada per jam
$6.00
Per 1.000 request
$0.167
Bottleneck
baca KV

Kedua target latency terpenuhi dengan 3 GPU, dengan biaya $0,556 per sejuta token jawaban. Tiap langkah decode dibatasi oleh pembacaan KV cache, jadi perubahan terbaik berikutnya adalah GQA (8 KV head), yang menghemat 2 GPU.

Asumsi
Efisiensi terhadap roofline ideal100%
Headroom untuk lonjakan1.30×
Model7B, fp16Bentuk Llama 2 7B: 32 layer, 32 KV head berdimensi 128
GPU80 GB · 2 TB/s · 300 TFLOP/sIlustrasi, akselerator yang sama dengan penjelasan KV cache dan continuous batching
Waktu satu passmax(compute, memory)FLOP ÷ puncak atau byte ÷ bandwidth, mana pun yang lebih lambat
Cadangan memori10%Aktivasi, fragmentasi, buffer runtime
Harga$2.00/GPU-jamContoh; atur di langkah terakhir
Tidak dimodelkanantrean, jeda prefillWaktu sampai token pertama mengasumsikan antrean kosong; headroom mewakili keduanya

Atur Harga GPU sesuai tarif penyediamu. Biaya per sejuta token jawaban adalah GPU × harga per jam ÷ token jawaban per jam × 10⁶. Peringkat opsi menjalankan ulang seluruh rencana dengan tiap perubahan diaktifkan, lalu menyimpan yang menghemat GPU. Buka Asumsi dan turunkan Efisiensi untuk melihat seberapa besar armada GPU bergantung pada pencapaian roofline ideal.

Berapa GPU yang dibutuhkan untuk serving LLM?

Serving large language model (LLM) berarti menjawab banyak pengguna sekaligus dalam batas target latency: berapa lama sampai token pertama jawaban muncul (time to first token), dan berapa lama tiap token berikutnya (time per output token). Jumlah GPU yang dibutuhkan ditentukan oleh tiga hal: kebutuhan memori tiap request, lama tiap forward pass, dan jumlah request yang datang per detik.

Studi kasus ini merencanakan deployment model chat 7 miliar parameter dari prinsip dasar. Setiap angka dihitung dari bentuk model dan GPU ilustratif berkapasitas 80 GB dengan bandwidth memori 2 TB/s dan komputasi 300 TFLOP/s, akselerator yang sama dengan penjelasan KV cache dan continuous batching. Tiap forward pass butuh waktu sebesar mana pun yang lebih lambat: aritmetikanya, atau pembacaan byte-nya dari memori. Inilah model roofline.

Ide utama

  • Weight dimuat sekali per GPU, tetapi tiap request menyimpan KV cache-nya sendiri, jadi memori cache yang menentukan jumlah pengguna yang bisa dilayani satu GPU.
  • Prefill dibatasi komputasi dan menentukan time to first token; decode dibatasi memori dan menentukan time per output token.
  • Batching membagi setiap pembacaan weight ke banyak request, sehingga throughput naik, sementara waktu per token tiap pengguna naik perlahan.
  • Batch terbaik adalah yang terbesar yang muat di memori dan menjaga waktu per token di bawah target.
  • Hukum Little mengubah laju request dan latency menjadi jumlah request yang sedang berjalan, yang harus ditampung armada GPU sekaligus.
  • Saat pembacaan cache mendominasi langkah decode, mengecilkan cache (GQA, cache int8, konteks lebih pendek) menghemat lebih banyak GPU daripada mengecilkan weight.

Pertanyaan umum

Kenapa model 7B butuh lebih dari satu GPU kalau muat di 13,5 GB?

Weight mudah dimuat, tetapi melayani banyak pengguna sekaligus dibatasi oleh KV cache dan waktu. Dengan prompt 1.000 token dan jawaban 300 token, tiap request butuh sekitar 0,68 GB cache, jadi sekitar 85 request muat di samping weight pada GPU 80 GB. Tiap GPU lalu menjawab sekitar 6 request per detik dengan target 50 ms per token, sehingga 50 request per detik butuh sekitar 11 GPU termasuk headroom untuk lonjakan.

Apa bedanya time to first token dan time per output token?

Time to first token adalah lama pengguna menunggu sampai jawaban mulai muncul. Waktu ini didominasi prefill, yaitu satu pass atas seluruh prompt. Time per output token adalah jarak antar-token berikutnya, yang ditentukan oleh satu pass decode atas batch saat itu. Pengguna merasakan yang pertama sebagai jeda dan yang kedua sebagai kecepatan baca.

Seberapa akurat angka ini untuk deployment sungguhan?

Angka ini menunjukkan cara deployment membesar, bukan angka pasti untuk vendor mana pun. Model ini mengasumsikan roofline ideal (bisa diatur di Asumsi), antrean request kosong, dan prefill yang tidak menahan decode. Server sungguhan hanya mencapai sebagian dari puncaknya, jadi ukur perangkat kerasmu sendiri dan pakai perencana ini untuk melihat perubahan mana yang paling berpengaruh.

Kenapa quantization int4 kurang membantu dibanding grouped-query attention di sini?

Pada kebutuhan bawaan, satu langkah decode dengan batch terpilih membaca sekitar 13,5 GB weight, tetapi sekitar 51 GB KV cache, jadi cache yang mendominasi. int4 hanya mengecilkan weight, dari 13,5 GB menjadi 3,4 GB. GQA dengan 8 KV head memangkas cache empat kali, jadi tiap langkah membaca jauh lebih sedikit dan GPU bisa menampung request empat kali lebih banyak.

Penjelasan terkait

Referensi

  1. Williams, Waterman, and Patterson (2009), "Roofline: An Insightful Visual Performance Model for Multicore Architectures", Communications of the ACM
  2. Little (1961), "A Proof for the Queuing Formula: L = λW", Operations Research
  3. Pope et al. (2022), "Efficiently Scaling Transformer Inference"
  4. Ainslie et al. (2023), "GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints"
  5. Touvron et al. (2023), "Llama 2: Open Foundation and Fine-Tuned Chat Models"
  6. Kwon et al. (2023), "Efficient Memory Management for Large Language Model Serving with PagedAttention"

Terakhir diperbarui