Lensa ML

Speculative Decoding

Langkah 1 dari 6: Bottleneck saat Decode

Setiap token mengalirkan semua weight

Token yang dihasilkan32
Memori GPU (HBM)weight 13.5 GBUnit komputasi1 token per passtiap passLinimasa, 32 passbaca weighthitungUnit komputasi sibuk0.6%Waktu memakai GPU ilustratif: memori 2 TB/s, 312 TFLOP/s fp16
Pass target
32
Byte weight dibaca
431.4 GB
Waktu decode
215.7 ms
Komputasi sibuk
0.6%

32 token butuh 32 pass berurutan dan pembacaan weight sebesar 431,4 GB. Tiap garis tipis adalah hitungannya; bagian abu-abu adalah GPU yang menunggu memori.

Geser Token yang dihasilkan dari 1 sampai 256 dan lihat byte serta waktu tumbuh bersamaan. Aturan di baliknya adalah arithmetic intensity. Satu decode pass mengerjakan sekitar 2 FLOP per parameter dan membaca 2 byte per parameter dalam fp16, kira-kira 1 FLOP per byte. GPU kelas A100 butuh sekitar 150 FLOP per byte agar unit hitungnya terisi penuh. Karena itu, waktu per token ditentukan bandwidth: 13,5 GB pada 2 TB/s sekitar 6,7 ms, batas atas sekitar 150 token per detik untuk satu sequence.

Langkah 2 dari 6: Draft yang Murah

Model kecil menebak γ token ke depan

Panjang draft γ4
"The capital of France is"Model draft 1B menebak 4 token, satu pass murah untuk tiap tokend1Parisq 0.82d2.q 0.71d3Itq 0.55d4isq 0.78Token draft dan probabilitas q bersifat ilustratifByte weight yang dibaca untuk 4 token7B, satu per satu53.9 GBDraft 1B8.0 GB
Pass draft
4
Byte draft dibaca
8.0 GB
Rasio biaya c
0.148
Biaya dalam pass 7B
0.59

4 pass draft membaca 8,0 GB, sekitar 0,59 dari satu pass 7B. Belum ada tebakan yang dipercaya; target masih harus memeriksanya.

Geser Panjang draft γ dari 1 sampai 8 dan bandingkan kedua batang. Rasio biaya c adalah waktu satu draft pass dibagi waktu satu target pass. Ketika kedua model memory-bound, nilainya mendekati rasio ukuran weight-nya, di sini 2,0 GB berbanding 13,5 GB, atau 0,148. Draft harus memakai tokenizer yang sama dengan target, karena verifikasi membandingkan ID token. Pilihan umum adalah model kecil dari keluarga yang sama, misalnya model 1B yang membuat draft untuk model 7B atau 70B.

Langkah 3 dari 6: Verifikasi dalam Satu Pass

Simpan awalan yang cocok ditambah satu token

Panjang draft γ5
Tebakan drafta.ItisknownTarget 7B, satu pass paralel atas prompt + 5 draftParis.ItisknownforbonusOutput putaran inidraft diterimatoken dari targetditolak (ilustratif, ber-seed)
Di-draft
5
Diterima
0
Token putaran ini
…
Pass 7B
0

Target membaca prompt dan semua 5 draft sekaligus, lalu memprediksi token berikutnya di setiap posisi. Tekan Langkah untuk membandingkan tiap draft dengan prediksi target, dari kiri ke kanan.

Tekan Langkah untuk memeriksa draft satu per satu, tekan Draft baru untuk mengacak ulang tebakan, dan geser Panjang draft γ untuk mengubah jumlah yang diperiksa. Verifikasi berjalan karena transformer menilai semua posisi input secara paralel, sama seperti prefill menangani prompt. Causal mask membuat prediksi di posisi i hanya bergantung pada prompt dan draft sebelumnya. Entri KV cache yang ditulis untuk draft yang ditolak dibuang sebelum putaran berikutnya. Pemeriksaan greedy ini menghasilkan keluaran yang sama persis, token demi token, dengan greedy decoding memakai target saja.

Langkah 4 dari 6: Acceptance dan Speedup

Cara α, γ, dan biaya draft menentukan keuntungan

Acceptance rate α0.75
Panjang draft γ4
Rasio biaya draft c0.15
0×1×2×3×12345678910panjang draft γbreak-even1.91×speeduptoken per pass (draft gratis)
Token per pass 7B
3.05
Speedup
1.91×
γ terbaik
4 (1.91×)
Biaya draft γc
0.60

γ = 4 adalah panjang terbaik di sini. Tiap putaran menghasilkan 3,05 token dan berbiaya 1,60 pass 7B, speedup 1,91×.

Geser Acceptance rate α, Panjang draft γ, dan Rasio biaya draft c, lalu ikuti cincin kuning yang menandai γ terbaik. Rumusnya mengasumsikan tiap draft diterima secara independen dengan probabilitas α, sehingga satu putaran menghasilkan 1 + α + α² + ... + α^γ token. Pada α = 0.75 dan γ = 4, jumlahnya 3,05, dan dengan c = 0.15 satu putaran berbiaya 1,6 target pass, sekitar 1,91 kali lebih cepat. Acceptance sungguhan berubah mengikuti teks: kode dan boilerplate mudah ditebak, prosa terbuka lebih sulit.

Langkah 5 dari 6: Output yang Persis Sama

Terima dengan min(1, p/q), atau resample

Ketidakcocokan draft0.60
0.00.20.40.6littleqoutyoungqoutsmallqoutkingqoutdraft diterimaresampledtarget psimulasi (p, q ilustratif)
Acceptance rate
73.2%
Porsi resampled
26.8%
Selisih maks, draft q vs p
0.268
Selisih maks, output vs p
0.011

Draft memberi probabilitas terlalu tinggi pada "king" dan meleset sampai 0,27, tetapi batang output tetap berhenti tepat di p. Yang berubah hanya biayanya: 26,8% putaran berakhir dengan resample.

Geser Ketidakcocokan draft dari 0 sampai 1 dan tekan Resample untuk mengulang simulasi 4.000 sampel. Buktinya cukup satu baris per token. Peluang mengeluarkan x adalah q(x) · min(1, p(x)/q(x)) + (1 − β) · r(x), dengan r sebagai residual ternormalisasi max(0, p − q). Suku pertama sama dengan min(p, q) dan suku kedua sama dengan max(0, p − q), jadi jumlahnya p(x). Acceptance rate β = Σ min(p, q) adalah satu dikurangi total variation distance antara p dan q.

Langkah 6 dari 6: Dalam Praktik

Draft head, prompt lookup, dan batch size

Metode
Batch size1
0×1×2×3×4×1248163264128256batch size (skala log), γ = 41.91×α dan c ilustratif per metode; GPU sama seperti langkah 1, pembacaan KV cache diabaikan
Speedup
1.91×
Token per pass
3.05
Token per pass verifikasi
5
Pass verifikasi
memory-bound

Model kecil terpisah dengan tokenizer yang sama menulis draft-nya. Pada batch 1, pass verifikasi berisi 5 token masih hanya butuh satu kali baca weight, jadi memeriksa draft nyaris gratis: 1,91×.

Ganti Metode dan geser Batch size dari 1 sampai 256. Medusa (Cai dkk., 2024) dan EAGLE (Li dkk., 2024) memverifikasi pohon kandidat kelanjutan dalam satu pass dengan attention mask berbentuk pohon, yang memperpanjang urutan yang diterima melebihi satu rantai. Prompt lookup decoding sama sekali tidak butuh model tambahan, sehingga cocok untuk ringkasan, jawaban retrieval, dan code edit ketika output menyalin input. Speedup satu sequence yang dipublikasikan biasanya 2 sampai 3 kali, dan angka pastinya bergantung pada pasangan model dan tugasnya.

Apa itu speculative decoding pada LLM?

Speculative decoding adalah cara mempercepat pembuatan teks: model kecil yang cepat membuat draft beberapa token ke depan, lalu model besar memeriksa semuanya dalam satu forward pass. Model besar menyimpan setiap token draft yang cocok dengan hasil yang akan ia keluarkan sendiri, mengganti token pertama yang tidak cocok, lalu siklus berulang. Dengan acceptance rule yang tepat, output mengikuti distribusi model besar secara persis, sehingga kecepatan naik tanpa perubahan kualitas.

Membuat satu token dalam satu waktu dibatasi memory bandwidth, bukan aritmetika: tiap langkah mengalirkan semua weight model dari memori GPU untuk menghasilkan satu token. Speculative decoding memakai komputasi yang menganggur untuk memeriksa beberapa tebakan per satu kali baca weight. Cara ini menurunkan latency per token untuk asisten chat, alat coding, dan semua situasi satu pengguna, dan sudah tertanam di sistem serving seperti vLLM, TensorRT-LLM, dan llama.cpp. Manfaatnya mengecil pada batch size besar, saat GPU sudah sibuk.

Ide utama

  • Decoding satu token per pass bersifat memory-bound, jadi unit komputasi GPU lebih banyak menganggur.
  • Drafter murah mengusulkan γ token, dan model target memeriksa semuanya dalam satu pass paralel.
  • Tiap putaran menyimpan awalan terpanjang yang diterima ditambah satu token dari target, jadi selalu ada kemajuan.
  • Dengan acceptance rate α, satu putaran menghasilkan rata-rata (1 − α^(γ+1)) / (1 − α) token.
  • Aturan terima dengan min(1, p/q) dan residual resampling menjaga distribusi output tetap identik dengan target.
  • Speedup paling besar pada satu request dan mengecil ketika batch size membuat decode menjadi compute-bound.

Pertanyaan umum

Apakah speculative decoding mengurangi total komputasi?

Tidak. Biasanya total kerja floating-point justru naik, karena model draft menjalankan pass tambahan dan target menilai draft yang akhirnya ditolak. Yang berkurang adalah jumlah target pass berurutan, jadi komputasi cadangan ditukar dengan latency lebih rendah. Di server sibuk tanpa komputasi cadangan, pertukaran ini tidak lagi menguntungkan.

Apakah speculative decoding bisa dipakai dengan temperature dan top-p sampling?

Bisa. Acceptance rule berlaku untuk pasangan distribusi apa pun, jadi temperature, top-k, atau top-p diterapkan pada p milik target dan q milik draft sebelum pemeriksaan. Greedy decoding adalah kasus khusus ketika kedua distribusi menaruh seluruh probabilitas pada satu token. Acceptance rate cenderung turun pada temperature tinggi, karena token hasil sampling lebih sulit diprediksi.

Bagaimana cara memilih model draft?

Pilih model yang jauh lebih murah dari target, sering kali 10 sampai 20 kali lebih kecil. Model dari keluarga yang sama dan dilatih pada data serupa lebih sering sepakat dengan target, sehingga acceptance rate naik. Sebagian tim juga melakukan distillation dari target ke model draft untuk menaikkannya lebih jauh.

Apa bedanya speculative decoding dan speculative sampling?

Keduanya nama untuk ide yang sama, dipublikasikan terpisah pada waktu yang berdekatan. Leviathan dkk. (2022) menyebutnya speculative decoding dan Chen dkk. (2023) menyebutnya speculative sampling. Keduanya meminjam istilah dari speculative execution di CPU, ketika prosesor berjalan lebih dulu berdasarkan tebakan dan membuang hasilnya kalau tebakan itu salah.

Penjelasan terkait

Referensi

  1. Leviathan, Kalman & Matias (2022), "Fast Inference from Transformers via Speculative Decoding"
  2. Chen et al. (2023), "Accelerating Large Language Model Decoding with Speculative Sampling"
  3. Cai et al. (2024), "Medusa: Simple LLM Inference Acceleration Framework with Multiple Decoding Heads"
  4. Li et al. (2024), "EAGLE: Speculative Sampling Requires Rethinking Feature Uncertainty"

Terakhir diperbarui