给冻结1-bit GGUF配NVFP4预填涨32.5分

Disaggregated Quantization: Specializing LLM Prefill and Decode

Andrei Panferov, Maximilian Kleinegger, Sweta Priyadarshi, Tijmen Blankevoort, Dan Alistarh

cs.LG

2026-09-22

预填走NVFP4、解码走低比特,1-bit GGUF加预填器后MMLU-Pro涨32.5分,8K TTFT快1.78倍。

这篇在解决什么

LLM 推理拆成两段:prefill 把整段 prompt 做成 KV cache,decode 再按 token 往外吐。两段的硬件瓶颈相反。prompt 够长时,同一份权重在很多 token 上复用,线性层是算力瓶颈,NVFP4、INT4 这类硬件原生低精度算术能加速。decode 在 batch=1 时每个权重只做一次乘加,时间几乎全花在从显存搬权重,2-3 bit 的 weight-only 编码更划算。

现成量化通常给两段套同一套格式。weight-only 在 prefill 上吃不到原生 GEMM;W4A4 能加速 prefill,但 decode 也量化激活,生成任务掉点更狠。Qwen 3 和 Gemma 3 上,decode-heavy 任务里只量化 decode 的掉点是只量化 prefill 的 2-4 倍,Gemma3-1B 上到 7 倍。prefill-heavy 任务这个顺序反过来。

方法

Disaggregated quantization(DQ)把两段的计算格式、权重和存放位置拆开,注意力不动,只特化线性层。Quantization-aware distillation with disaggregation(QADD)借用 SFT 的 assistant mask 选通路:user 走 prefill,assistant 走 decode。蒸馏只在回复 token 上算 KL(teacher∥student),梯度仍经 prompt 的 KV 打到 prefill 权重,一次前向反向同时训两条路。语料是 Tülu 3 的 1 亿非 padding token,教师冻结在 BF16。

已有 GGUF 解码器冻住 decode,只训适配它的 NVFP4 prefiller。量化配方可以是黑盒,只要最终 checkpoint。

结果

核心实验覆盖 Qwen 3 的 0.6B、1.7B、4B、8B 和 Gemma 3 的 1B、4B、12B。decode-heavy 平均 GSM8K、MATH-500、MMLU-Pro(Qwen 3 开/关 think);prefill-heavy 平均 RULER 13 项任务在 4K/8K/16K/32K。家族数字是各尺寸未加权平均,取 QADD 末段五个 checkpoint。prefill 延迟是 DGX Spark 上 16K 的 transformer 栈,decode 是 vLLM batch=1 的每 token 延迟。

设置(Qwen 3 家族)decode-heavyprefill-heavy8B prefill设备权重
BF1666.284.21.00×16.38 GB
NVFP4 两边一样61.879.81.49×6.40 GB
NVFP4 格式拆分63.781.11.49×6.40 GB
LUT2 两边一样34.861.31.49×4.66 GB
LUT2 完全拆分45.576.61.49×8.57 GB
LUT2 + ODP45.576.61.47×4.66 GB

格式拆分相对「两边同一套」:decode-heavy 上 NVFP4 涨 1.9/3.1 分(Qwen/Gemma),LUT3 涨 4.5/3.7,LUT2 涨 2.5/1.8;prefill-heavy 上不到 1.3 分。设备占用和 prefill 速度不变,decode 因跳过激活量化快 2-3%。

完全拆分在 2-bit 上差距最大。相对非拆分 LUT2,Qwen 3 的 decode-heavy 从 34.8 到 45.5,prefill-heavy 从 61.3 到 76.6;相对 weight-only LUT2A16 高 4.5-12.5 分,prefill 还更快。Gemma 3 上 LUT2 完全拆分把 decode-heavy 从 30.8 拉到 38.2,prefill-heavy 从 50.8 到 61.3。ODP 把 Qwen3-8B 的设备权重从 8.57 GB 压回 4.66 GB,16K 以上额外延迟不到 5%。Gemma3-12B 上 ODP 的 16K prefill 仍是 BF16 的 1.58×。

给现成 Qwen3.8-27B 的 Unsloth GGUF 训 NVFP4 prefiller,decode checkpoint 不动:

decode 格式MMLU-ProMMMU-Pro
IQ1S 原/加 prefiller29.04 / 61.54(+32.50)24.39 / 59.65(+35.26)
IQ2XXS70.50 / 77.93(+7.42)59.60 / 65.90(+6.30)
IQ3S83.65 / 83.02(-0.63)74.74 / 71.97(-2.77)

1-bit 上精度翻倍有余。训练语料没有图,视觉基准 MMMU-Pro 同样涨。3-bit 上 prefiller 反而略掉点。跟 round-to-nearest 的 NVFP4 prefill 比,IQ1S 在 MMLU-Pro 上还要再高 13.1 分,增益不只来自换格式。llama.cpp 里 ODP 在 8K prompt 把 TTFT 从 12.27 s 降到 6.90 s(1.78×);4K-32K 加速介于 1.38× 到 1.78×,更短会被 SSD 加载拖住。

PTQ 版格式拆分推到 2.8T 参数:13 组模型-基准里 11 组点估计更好,6 组 p<0.05 显著,没有显著变差。幅度大约 +0.1 到 +1.1 分,和 QADD 在 1-2 bit 上的增益差一截。

为什么重要

本地跑低比特 GGUF 时,1-2 bit 又慢又差是日常。这篇给了一条不用动 decode checkpoint 的补丁:另训一份 NVFP4 prefiller,SSD 流式加载,显存不涨,长 prompt 的首 token 还能更快。代码、llama.cpp fork 和 27B prefiller 都已放出。

机房里 prefill/decode 已经分卡时,完全拆分几乎不增加常驻成本,2-3 bit decode 收益最大。格式拆分更轻,同一份权重,decode 关掉激活量化,decode-heavy 任务白捡 2-4 分,适合显存紧、不能加第二份 checkpoint 的单用户服务。

这是工程向的渐进改进,不是新架构。3-bit 以上、短 prompt、MoE,收益会迅速变薄。

局限与存疑

论文自己划了几条:没测高 batch,没测多轮和 agent。多轮里历史 assistant token 的 KV 是 decode 产的,若用 prefill 重建会变成另一套表示,cache 策略依赖完全没验证。ODP 对 MoE 不友好,active 参数比例让加载比计算贵得多,短序列的 TTFT 也会被 SSD 拖累。误差条是单次训练末段 checkpoint 波动,不是多种子。

另外几处读下来站不稳。3-bit GGUF 加 prefiller 在两个基准上掉 0.6-2.8 分,卖点压在 1-bit,负迁移没有机制解释。27B 蒸馏语料来自同一 BF16 模型的 math/code trace,跟 MMLU-Pro 有少量题面重叠;训练无图、评视觉,迁移机制不清楚。速度全在 DGX Spark、batch=1,vLLM 高并发下 prefill 是否仍算力瓶颈、ODP 是否还划算,没有数据。prefiller 还会改生成长度:IQ1S 在 MMMU-Pro 上平均 token 从 14579 降到 6582,截断率从 24.57% 降到 4.16%,MMLU-Pro 上均值反而变长,decode 权重没改不等于生成成本没改。

术语

原文与代码

相关论文

全部论文解读