投机解码:用草稿模型或 n-gram 预测加速 LLM 解码。
投机解码先由廉价草稿源生成多个候选 token,再由目标模型一次并行验证,接受匹配部分。正确实现下它不改变目标模型的输出分布,但收益取决于接受率和并发形态。
常见方法:draft model、EAGLE/EAGLE3、n-gram(prompt lookup)。草稿模型必须与目标模型共享 tokenizer 和词表。
pip install -U vllm
先分别确认目标模型和草稿模型能独立加载,并记录无投机时的吞吐、TTFT 和 TPOT 基线。
草稿模型方式,适合有同系列小模型的场景:
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--speculative-config '{"method":"draft_model","model":"meta-llama/Llama-3.2-1B-Instruct","num_speculative_tokens":5}' \
--max-model-len 8192
n-gram 方式,适合代码改写、摘要、RAG 引用等大量复制输入的任务:
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--speculative-config '{"method":"ngram","num_speculative_tokens":5,"prompt_lookup_max":4,"prompt_lookup_min":2}'
EAGLE3 方式,需要与目标模型严格匹配的 EAGLE 权重:
vllm serve meta-llama/Llama-3.3-70B-Instruct \
--speculative-config '{"method":"eagle3","model":"nvidia/Llama-3.3-70B-Instruct-Eagle3","num_speculative_tokens":3}' \
--tensor-parallel-size 4
查看草稿数和接受 token 数:
curl -s localhost:8000/metrics \
| grep -E 'spec_decode_num_(drafts|draft_tokens|accepted_tokens)'
用 PromQL 计算接受率,低于 50% 通常不值得继续:
# accepted / draft
rate(vllm:spec_decode_num_accepted_tokens_total[5m])
/ rate(vllm:spec_decode_num_draft_tokens_total[5m])
同一数据集分别压测有、无投机配置:
vllm bench serve --backend openai-chat --base-url http://localhost:8000 \
--endpoint /v1/chat/completions --model llama-8b \
--dataset-name random --random-input-len 1024 --random-output-len 256 \
--num-prompts 500
max-model-len、减小草稿模型或改用 EAGLE。num_speculative_tokens 过大,被拒绝的候选会浪费计算;从 3 到 5 开始,按接受率曲线调整。grep spec_decode 确认实际暴露的指标再写告警。合上页面,先回答,再展开对照。