TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

量化:将权重缩减至 8 位为何能加快解码速度及其代价

状态:草案(2026-10-27),已实际测量 FP8、GPTQ、AWQ,未实际测量 GGUF、bitsandbytes。 于 2026-10-27 使用单张 8GB 级笔记本 GPU(Ada 架构)、vLLM 0.31.0、Qwen3-Reranker-0.6B 进行测量。初次测量时需要重新下载预量化的检查点(AWQ、GPTQ),因此未进行测量,在批准后的小节 3-1 中进行了测量。KV 缓存 8 位容量的实际测量结果在《Toss ML/AI Infra 准备》第 14 篇中。 2026-10-27 新增。 获得批准后,拉取了 vLLM 0.32.0 镜像以及 Qwen3-0.6B、Qwen3-0.6B-GPTQ-Int8、Qwen3-4B-AWQ(均为 Apache-2.0,safetensors),并添加了小节 3-1。前文的 0.31.0 数值保持不变。 编写规则:以实际测量数据为基础,无法测量的标记为“未实际测量”,未能确认的标记为“未确认”。

目录

1. 为什么会变快

在解码过程中,每个请求为了生成一个 Token,需要完整读取一次 GPU 内存中的所有权重。对于 0.6B 模型,以 bf16 格式存储时,每一步都需要传输约 1.2GB 数据。相比之下计算量较小,因此步骤耗时大致由“权重字节数 ÷ 内存带宽”决定。将权重缩减至 8 位后,需要读取的字节数减半,从而缩短了步骤耗时。

由此衍生出两点:

2. vLLM 的量化指南

方法 缩减对象 检查点 原理(论文)
在线 FP8(fp8_per_tensor, fp8_per_block) 权重与激活值 8 位 保持 bf16 不变,加载时转换 FP8 格式(Micikevicius 等,2022):E4M3、E5M2
llm-compressor FP8 W8A8 权重与激活值 8 位 提前转换 相同格式,通过校准数据决定缩放比例
AWQ 权重 4 位 提前转换 保护激活值较大的通道的权重(Lin 等,MLSys 2024)
GPTQ 权重 3、4 位 提前转换 利用二阶信息补偿误差并按列进行量化(Frantar 等,ICLR 2023)
Marlin 内核 加速 GPTQ、AWQ、FP8、FP4 上述格式 4 位权重与 16 位激活值的乘积内核
GGUF、bitsandbytes 权重 各自格式 llama.cpp 格式,读取时进行量化
KV 缓存 FP8(--kv-cache-dtype fp8) KV 存储 无关 相同内存可存两倍 Token

官方文档的硬件表格显示,FP8 W8A8 仅在 Ada、Hopper 及以上架构受支持,而 AWQ 和 GPTQ 在大多数 Turing 及更新架构上运行。论文报告的数字在不同条件下各有差异。AWQ 称其 4 位权重在桌面和移动 GPU 上比 Hugging Face FP16 实现快 3 倍以上;GPTQ 报告称将拥有 1,750 亿参数的模型部署在单张 GPU 上,在 A100 上比 FP16 快约 3.25 倍,在 A6000 上快 4.5 倍(两者均基于摘要)。

0.31.0 文档将在线量化方法列为 fp8_per_tensor, fp8_per_block, mxfp8, mxfp4 。MXFP8 的 W8A8 仅在 Blackwell(SM 100)及以上架构上运行,其余 GPU 则回退到仅将权重设为 8 位的路径。

3. 亲自测量:在线 FP8

方法

结果

项目 bf16 FP8(在线) 比例
权重内存(日志) 1.12GiB 0.71GiB 0.63
KV 容量 40,208 个 Token 42,080 个 Token 1.05
吞吐量,并发 1 174.2 tok/s 236.3 tok/s 1.36
Token 间隔中位数,并发 1 5.6ms 4.1ms 0.73
吞吐量,并发 16 1,683.1 tok/s 2,085.8 tok/s 1.24
吞吐量,并发 64 2,899.3 tok/s 3,143.3 tok/s 1.08
贪婪输出与 bf16 相同的请求 标准 12 个中的 6 个
困惑度(四篇文章) 36.03 36.46(+1.2%)

3-1. 2026-10-27 重新测量:对话模型与预量化检查点

在 vLLM 0.32.0 官方容器中,以对话模型 Qwen3-0.6B 为基准,对比了在线 FP8 与 GPTQ 8 位版本,并在同一 GPU 上部署了 AWQ 4 位的 4B 模型。负载与困惑度测试方法同上。

模型与方法 权重内存 KV 容量 吞吐量并发 1 并发 16 并发 64 困惑度
Qwen3-0.6B bf16 1.12GiB 38,224 个 Token 174.1 1,678.0 2,898.7 30.29
Qwen3-0.6B 在线 FP8(fp8_per_tensor) 0.71GiB 42,080 个 Token 237.9(1.37 倍) 2,094.5(1.25 倍) 3,148.2(1.09 倍) 29.88(-1.4%)
Qwen3-0.6B GPTQ 8 位(Marlin) 0.74GiB 42,048 个 Token 244.3(1.40 倍) 2,023.0(1.21 倍) 2,996.5(1.03 倍) 30.78(+1.6%)
Qwen3-4B AWQ 4 位(Marlin) 2.5GiB 15,424 个 Token 80.0 651.9 736.4 21.02

吞吐量单位为 tok/s,括号内为相较于 bf16 的倍数。

4. KV 缓存 8 位

--kv-cache-dtype fp8 并非缩减权重,而是将 KV 缓存存储为 8 位。在先前使用 1.7B 模型在同款 GPU 上的实际测量中,KV 容量从 22,048 个 Token 增加到 41,920 个 Token(每个 Token 的字节数刚好减半),因长输入导致 KV 不足而产生队列的瓶颈点向后推迟了(第 14 篇)。此处仅补充了相同的困惑度测试和贪婪输出对比。

项目 KV bf16(默认) KV FP8
KV 容量(日志) 40,208 个 Token 69,920 个 Token(1.74 倍)
困惑度(同四篇文章,338 个 Token) 36.03 36.50(+1.3%)
贪婪输出与 bf16 KV 相同的请求 基准 12 个中的 5 个

5. 运维层面的建议

6. 未验证的事项

参考资料

登录后即可点赞

评论

还没有评论。

登录后即可发表评论