Nút thắt của pha decode là băng thông bộ nhớ: sinh mỗi token phải đọc toàn bộ trọng số từ VRAM, trong khi phần tính toán của GPU gần như ngồi chơi. Speculative decoding tận dụng đúng phần dư đó.
Cơ chế:
1. Một draft model nhỏ và nhanh đoán trước K token.
2. Target model lớn chạy một lượt forward duy nhất trên cả K+1 vị trí cùng lúc.
3. Duyệt từ trái sang, chấp nhận token draft nào khớp phân phối của target; gặp token đầu tiên bị bác thì lấy token của target tại đó và bỏ phần đuôi.
Điểm mấu chốt hay bị hiểu nhầm: phân phối đầu ra giống hệt target model chạy một mình — điều này có chứng minh toán học. Đây không phải đánh đổi chất lượng lấy tốc độ.
Vì sao nhanh: vì decode nghẽn băng thông chứ không nghẽn tính toán, chạy forward cho K+1 vị trí gần như tốn bằng chạy cho một vị trí. Draft đoán trúng nhiều thì ta thu được nhiều token chỉ với một lần đọc trọng số, mà draft model nhỏ hơn hàng chục lần nên phần sinh nháp gần như miễn phí.
Thực tế nhanh khoảng 2–3 lần, lên 4–5 lần với nội dung dễ đoán như code hay văn bản khuôn mẫu.
Vài biến thể đáng biết:
- Medusa — không cần model phụ, gắn thêm vài đầu decode vào chính target model để đoán song song nhiều token.
- EAGLE — huấn luyện một mạng draft nhẹ dùng đặc trưng bên trong target, tỉ lệ đoán trúng cao hơn Medusa.
- Prompt lookup — không dùng model nào cả, chỉ tìm cụm đã xuất hiện trong prompt để đoán; rất hiệu quả với hỏi đáp trên tài liệu và với code.
Giới hạn:
- Chất lượng draft quyết định tất cả. Draft sai nhiều thì phải bỏ liên tục và tổng thời gian có thể chậm hơn không dùng. Mốc thường dùng: draft cùng dòng model, cỡ khoảng 1/10 target.
- Phải giữ KV cache cho cả hai model, và lập lịch batch phức tạp hơn.
- Target model nhỏ (dưới ~7B) thì không bõ — chi phí chạy draft không bù lại được.
Khi dùng: hệ nhạy độ trễ (chat, trợ lý code) với target model lớn. Ngược lại, batch API vốn đã tối ưu throughput thì gần như không được lợi.
Hỗ trợ sẵn trong vLLM, TensorRT-LLM, SGLang và llama.cpp.