Disaggregated Quantization: Specializing LLM Prefill and Decode
在解决通过解决计算密集型预填充阶段和内存带宽密集型解码阶段相互冲突的量化需求,在不牺牲准确率的情况下加速大语言模型推理。
结论证明了将预填充(原生计算格式)和解码(纯权重格式)的量化解耦可以显著提高准确率和速度,但 SSD 流式加载优化 (ODP) 对 MoE 架构和短上下文请求无效。
1. 任务
试图解决的问题:大型语言模型(LLM)的推理包含两个计算特征迥异的阶段:预填充(Prefill,处理输入提示,受计算瓶颈限制)和解码(Decode,逐个自回归生成 token,受内存带宽瓶颈限制)。
为什么重要且困难:为了最大化效率必须进行量化,但标准的量化方案通常对两个阶段强制使用相同的格式。如果使用纯权重(Weight-only)压缩,会加速受内存限制的解码阶段,但相比硬件原生的计算格式会拖慢预填充;反之,如果使用同时量化权重和激活的格式(如 NVFP4),会加速预填充,但会损害准确率,并且在解码时无法最大化内存带宽。
本文目标:本文通过提出“解耦量化”(Disaggregated Quantization, DQ)来解决这一僵化的权衡。DQ 针对预填充和解码阶段的不同瓶颈,分别专门定制计算格式、权重格式,甚至权重的存储位置。
2. 核心思路
DQ 不再强制整个模型采用单一的量化方案,而是对推理的每个阶段进行独立优化。其最极端的版本(完全解耦)训练模型在预填充阶段使用硬件原生、计算高效的权重(如 NVFP4)来快速构建 KV Cache,而在解码阶段使用极度压缩的纯权重表示(如 1-3 bit LUT)以最大化内存带宽。这两个阶段在训练时被联合优化,确保解码器能够完美理解预填充阶段生成的表示。
3. 机制 + 心智模型
- 解耦量化感知蒸馏(QADD): 从教师模型中进行蒸馏。前向传播使用标签掩码来选择路径:提示(Prompt)token 通过预填充量化格式处理,而生成的 token 使用解码格式。
- 格式解耦(Format Disaggregation): 一种简单的插入式干预,主权重共享,但仅在解码时完全禁用激活量化(例如,预填充使用 NVFP4,解码使用 NVFP4A16)。
- 完全解耦(Full Disaggregation): 维护两套完全独立的权重。预填充使用专属的 NVFP4 权重,而解码使用自己的 2-3 bit 纯权重。
- 卸载式解耦预填充(ODP): 为了避免在有限的显存中同时存放两套权重,预填充权重被置于 SSD 上。在预填充期间,这些权重被逐块流式传输到设备内存中,将加载与矩阵计算重叠,并临时借用空闲解码权重的空间。
心智模型: 预填充是计算密集型的,因此给它配备硬件原生的量化计算格式(NVFP4);解码是内存带宽密集型的,因此给它配备极致紧凑的权重(1-4 bit),且剔除激活量化带来的准确率惩罚。
4. 指标 / 数据集
- 基准测试: 偏重解码的任务:GSM8K (5-shot), MATH-500 (4-shot), MMLU-Pro (5-shot, 文本)。偏重预填充的任务:RULER (13 个任务, 4K 到 32K 上下文)。多模态视觉:MMMU-Pro (zero-shot)。
- 模型: Qwen 3 (0.6B 到 8B, 以及 27B), Gemma 3 (270M 到 12B)。并在 Qwen 3.8, Gemma 4, Muse Glimmer, Nemotron 3, Kimi-K3(最高 2.8T 参数)上进行了大规模 PTQ 测试。
- 硬件: NVIDIA DGX Spark (GB10, sm_121) 用于本地栈测速;GB300 节点用于大规模 vLLM 测试。
- 服务栈: vLLM 以及用于 ODP 的定制
llama.cpp扩展。 - 工作负载: 解码测速使用 Batch Size 1(内存带宽主导的场景),涵盖文本和多模态推理。
5. 对比 baseline
- 基线: 稠密无量化模型 (BF16),未解耦的统一 NVFP4 量化,以及统一的纯权重 (2-3 bit) 量化模型。基线由作者亲自实现并运行。
- 公平对比: 是的,基线是完美匹配的——使用了相同的模型尺寸、硬件和评估服务框架。
- 核心收益:
- 在 Qwen3.8-27B(1-bit 解码器,IQ1_S)上,训练一个 NVFP4 预填充器(Prefiller)相比纯权重基线,使 MMLU-Pro 准确率提升 32.5 个百分点,MMMU-Pro 提升 35.3 个百分点。
- 在
llama.cpp中处理 8K 长度的提示时,ODP 的首字时间 (TTFT) 相比纯权重基线实现了 1.78 倍的加速。 - 在超大模型(最高 2.8T)上进行 4-bit 训练后量化 (PTQ) 时,格式解耦(仅在解码时禁用激活量化)在零额外推理成本的情况下,带来了微小但具有统计学意义的提升(例如 Gemma-4-31B MMMU-Pro 提升 1.13)。
6. 开源
代码和 llama.cpp 的 fork 版本已开源:https://github.com/IST-DASLab/disaggregated-quantization 与 https://github.com/IST-DASLab/disaggregated-llama.cpp。 权重(Qwen3.8-27B NVFP4 prefiller)已发布在 Hugging Face Hub 上。
7. 关键数字核实
| 说法 | 出处 | 实际条件 | 成立? | 备注 |
|---|---|---|---|---|
| 在解码重度任务上移除解码激活量化可提高准确率,且不增加推理成本 | §摘要, §3.2, Tab 1 | 格式解耦使 Qwen 3 和 Gemma 3 在未解耦方案上平均准确率提升 1.9 和 3.1 点 (NVFP4)。 | ✅ | 零额外的权重存储或预填充计算成本。 |
| 在 8K 提示长度下,ODP 的首字时间比纯权重快 1.78 倍 (llama.cpp) | §摘要, §3.2, Fig 1 | Qwen3.8-27B,8K 上下文,llama.cpp,对比 IQ1_S 纯权重基线。 | ⚠️ | 8K 是最有利的配置。在 < 4K 的上下文中,由于固定的 SSD 流式传输开销,ODP 实际上比纯权重预填充更慢。 |
| 训练 NVFP4 预填充器使 1-bit 的 MMLU-Pro 和 MMMU-Pro 准确率分别提升 32.5 和 35.3 | §摘要, §3.2, Tab 4 | Qwen3.8-27B 使用 IQ1_S 解码器并搭配 NVFP4 预填充器。 | ⚠️ | 这个头条数据来自最有利的配置 (1-bit),其基线性能本身已严重受损。在 3-bit 时,NVFP4 预填充器反而会降低准确率。 |
| 大规模 PTQ 格式解耦在 13 个模型-基准组合中的 11 个上提升了点估计值 | §3.3, Tab 2 | 针对高达 2.8T 参数模型进行 4-bit PTQ 测试 (MMLU-Pro & MMMU-Pro)。 | ✅ | 其中 6 项提升具有统计显著性;没有出现显著的性能下降。 |
| 完全解耦方案优于 LUT2A16 纯权重基线 4.5 至 12.5 个百分点 | §3.2, Tab 1 | 2-bit LUT2 解码 + NVFP4 预填充 (Qwen 3 和 Gemma 3)。 | ⚠️ | 完全解耦使用了一个额外的 4-bit (NVFP4) 预填充权重,如果不使用 ODP,这实际上使权重存储需求翻倍。如果不进行流式传输,将其与纯 2-bit 模型进行对比在模型容量上是不公平的。 |
8. 摘要没说的
- 红利边界 (最佳位宽): 专用预填充器带来的巨大准确率红利在较高位宽下就会消失甚至逆转。例如,在 Qwen3.8-27B 采用 3-bit 解码 (IQ3_S) 时,预填充器反而导致 MMLU-Pro 下降了 0.63,MMMU-Pro 下降了 2.77。其收益严格限于极度压缩 (1-2 bit) 的解码器。
- 短上下文的 ODP 开销: 在较短上下文中,SSD 加载使得 ODP 比驻留显存的预填充要慢。在 DGX Spark 上,上下文长度达到 8K 左右时计算耗时才会超过 SSD 加载耗时。在 >16K 时,卸载带来的延迟增加低于 5%。
- 生成长度的变化: 使用预填充器会剧烈改变生成行为。在 MMMU-Pro (IQ1_S) 上,平均响应长度减半(从 14k 降至 6.5k token),同时准确率飙升。相反,在 MMLU-Pro 上,由于长尾生成变长,预填充器通常会增加平均长度。
- 混合专家模型 (MoE) 上的失败: ODP 的流式传输 trick 无法平滑迁移到 MoE 模型上。对于 MoE,计算成本与加载成本的比率随着激活参数比例的下降而降低,导致即使在极端上下文长度下,SSD 加载成本也远高于计算成本。
- 指标卫生: 测量过程严谨地将推理速度解耦为首字时间 (TTFT) 和单 token 生成延迟,承认解码测试是在带宽限制最严重的 Batch Size 1 场景下进行的。
9. 可达性与启发
- 可达性: 单节点部署的可达性很高。代码库和
llama.cppfork 已经开源。对于用户,直接加载提供的 27B 预填充权重即可立即使用 ODP。训练新的预填充器需要 QADD 蒸馏,但格式解耦(关闭解码阶段的激活量化)是一项免费的 PTQ 干预。 - 启发 (Inference): KV Cache 是一个通用的瓶颈接口。我们不必对模型进行均匀压缩。我们可以使用庞大、偏重计算的格式快速构建 Cache,然后在自回归生成期间使用高度压缩、偏重内存的格式来读取它。
- 启发 (Inference): ODP 对本地大模型是一个绝妙的系统 trick。既然预填充权重在每次请求中只被遍历一次,它们完全可以留在 SSD 上并做到即时流式加载,从而将 VRAM 严格保留给 KV Cache 和解码权重。
10. 置信度与下一步
- 机制: 高。区分计算密集的预填充和内存带宽密集的解码的核心直觉在物理上是非常稳固的。
- 报告的提升: 中到高。1-bit 下 +35 分的提升是真实的,但它们是建立在一个极其羸弱、近乎失效的基线之上。2-3 bit 的提升则更为克制和真实。
- 泛化性: 中等。数据中心的解耦服务早已将预填充和解码分离到不同的机器上,但通过 ODP 将其下放到单设备本地推理对稠密模型是一项有力贡献(尽管明确指出对 MoE 无效)。
- 值得复现吗? 值得。将 ODP 集成到诸如
llama.cpp或 Ollama 的消费级工具中,可以大幅提升在 Mac/消费级 GPU 上运行海量稠密模型的用户体验。 - 下一步阅读/探索:
- 探究该机制如何与 Prompt Caching 协同。如果 KV Caches 大量被复用,预填充权重的使用频率会更低。
- 在多轮对话中的鲁棒性如何?如果 KV Cache 是通过多次预填充循环迭代构建的,其表示是否会与解码权重自然生成的表示产生漂移?
11. 审校记录
- 将 ODP 的 1.78 倍加速降级为 ⚠️: 该加速比是在 8K 上下文取得的,这是最有利的配置。在 < 4K 的上下文中,由于固定的 SSD 流式传输开销,ODP 实际上比纯权重预填充更慢。
- 将 NVFP4 预填充器 32.5 分提升降级为 ⚠️: 这个头条数据来自最有利的配置 (1-bit),而该基线性能本身已严重受损。在 3-bit 时,收益会消失甚至逆转(准确率下降)。
- 将完全解耦对比 LUT2A16 降级为 ⚠️: 完全解耦使用了一个额外的 4-bit (NVFP4) 预填充权重,如果不使用 ODP,这实际上使权重存储需求翻倍。如果不进行流式传输,将其与纯 2-bit 模型进行对比在模型容量上是不公平的。
- 已核实: 所有其他数字、声明以及格式解耦相关的要点均与论文相符,且评估标准宽容公允。未发现无法核实的声明。