加速
主线位置:一个请求的一生里的「前向 → 采样」。投机解码改的是解码阶段每一步的形状(一次验证多个 token),权重量化改的是每个线性层算什么、读多少字节。两个引擎这一段都是 Python 编排加 CUDA / Triton kernel,没有 Rust。
版本:vLLM v0.32.0、SGLang v0.5.22
解码访存受限:每生成一个 token,都要把全部权重从显存读一遍(见 为什么服务大模型难)。这一部分的两种加速从两头下手:
- 投机解码:读一遍权重,验证多个 token。便宜的草稿先猜 k 个,目标模型一次前向全部验证,接受规则保证输出分布和不开时一样。两边默认都不开。
- 权重量化:让每次读的权重更少。FP8 减半,4 bit 约减到四分之一;算力够的卡还能用低精度张量核做矩阵乘。用量化好的 checkpoint 时引擎自动识别,按卡型挑 kernel。
两者能叠加,也都和 KV cache 有关:投机的草稿 token 要先占 KV 槽,量化省下的权重显存可以多放 KV 块。
本部分两页:
- 投机解码:两边支持的方法(n-gram、草稿模型、EAGLE / EAGLE3、MTP 等)和配置;草稿怎么提出,目标模型怎么一次验证;贪心逐 token 比对和拒绝采样为什么不改变输出分布,对上 vLLM 的 Triton kernel 和 SGLang 的 CUDA kernel;两边默认都不用草稿概率,仍然无损;SGLang 两个放宽阈值调小就不再无损;一个玩具分布上的数学验证;草稿占的 KV 槽与回滚。接受率和加速比待实测(C3-5)。
- 权重量化:从 checkpoint 的
quant_method和--quantization到具体 kernel 的分派路径;最低算力检查与 kernel 自身的架构检查;FP8 在 8.9 以下退到 Marlin 做 W8A16,AWQ / GPTQ 主要走 Marlin,vLLM 在 Hopper 上用 Machete;按卡型的对照表;和 KV 量化的区别;8B 模型的权重显存估算。效果待实测(C3-5)。
flowchart LR step["解码一步"] --> wread["读一遍全部权重"] wread --> tok["出 1 个 token"] spec["投机解码"] -.->|"读一遍,验证 k+1 个位置"| tok quant["权重量化"] -.->|"读的字节变少"| wread spec -.->|"草稿 token 先占 KV 槽"| kv["KV cache"] quant -.->|"省下的显存给 KV"| kv
两种加速换来多少吞吐、对输出有没有可见影响,都要 GPU,统一待实测(C3-5)。
💬 关联讨论
发起讨论加载中...