一句话回答:INT4 量化是用 4 位有符号整数表示一部分模型张量,每个值只有 16 个离散状态;在大语言模型部署中,最常见的是 W4A16——权重按 4 bit 存储,激活与计算仍使用 FP16/BF16 等更高精度。它能显著降低权重文件与内存带宽,但不代表整个模型只占 4 bit,也不保证任何硬件上都更快或“精度无损”。
本文面向准备下载 4-bit 权重、把模型部署到 GPU/CPU/本地设备,或需要判断“INT4 到底省多少显存”的中文用户。若你要先比较 INT8、FP8、GPTQ、AWQ、GGUF 与 KV cache,请先阅读模型量化总指南;本文只解决 INT4 与 4-bit 权重的专项问题。
INT4、W4A16、4-bit、NF4、GPTQ、AWQ 和 Q4 有什么区别
| 标签 | 它描述什么 | 不能据此推断什么 |
|---|---|---|
| INT4 | 4 位整数表示;有符号常见范围为 -8 到 7 | 不能证明激活也是 INT4,也不能证明有原生 INT4 计算 |
| W4A16 | 4-bit 权重、16-bit 激活/计算的 weight-only 路线 | 不能证明所有层都量化,也不能保证速度提升 |
| 4-bit | 只说明每个编码约占 4 bit | 可能是 INT4、NF4、FP4 或其他码本,不等于 INT4 |
| NF4 | NormalFloat 4,面向近似正态分布权重的 4-bit 数据类型 | 不是有符号整数 INT4;常见于 bitsandbytes/QLoRA |
| GPTQ / AWQ | 决定如何生成低比特权重的算法或流程 | 不是统一文件格式;仍要看 bits、group size、backend |
| GGUF Q4_K_M | llama.cpp 生态中的容器与混合量化类型标签 | 不能直接当作某个框架的 INT4 checkpoint |
Transformers 量化概念文档说明,signed INT4 映射到 16 个值,通常把两个 4-bit 值打包进一个字节。bitsandbytes 文档则把 NF4、FP4 与计算 dtype 分开配置:load_in_4bit=True 只表示启用 4-bit 加载,不足以说明它是整数 INT4。
INT4 权重在运行时经历什么
常见 weight-only 路线不是把所有算子永久改成 4-bit。权重先按 group 或 block 计算 scale(有的方案还使用 zero point),再量化、打包和保存;推理时,运行时按内核要求读取、解包、反量化或执行融合矩阵乘。能否变快取决于减少的内存传输是否大于解包、反量化和调度开销。

| 环节 | 需要记录 | 常见失败 |
|---|---|---|
| 浮点基线 | 模型仓库、revision、tokenizer、原始 dtype | 用不同模型或不同 revision 做前后比较 |
| 量化 | 方法、bits、对称性、group size、校准数据、跳过层 | 只保留“int4”文件名,无法复现 |
| 打包 | packing/layout、scale/zero-point dtype、分片 | 同为 4-bit 但布局不被目标内核识别 |
| 加载 | runtime 版本、量化配置、模型实现 | 静默转高精度、CPU offload 或加载失败 |
| 计算 | 实际 kernel、激活/累加 dtype、fallback | 有 4-bit 存储却没有匹配的高效内核 |
torchao 0.17 的 Int4WeightOnlyConfig当前只支持 groupwise,列出 256、128、64、32 等 group size,并把 packing format 作为配置的一部分。TensorRT 当前量化方案文档则明确:其 INT4 使用 per-block scale,支持 block size 64/128,且 INT4 只用于权重量化。两套实现都叫 INT4,但可接受的布局、粒度和执行路径并不相同。
为什么 W4A16 不等于“全程 4 位计算”
W4A16 的 W 表示权重,A 表示激活。权重以 4 bit 形式减少文件、RAM/VRAM 读取量;激活、输入输出和部分累加仍可能是 16 bit。Intel 当前的 weight-only 文档把 WOQ 与同时量化权重和激活的 W8A8 分开,并在示例中使用 weight_dtype="int4_fullrange"、compute_dtype="fp16",再由运行时替换为相应的 INT4 优化算子。这说明 4-bit 权重与计算 dtype 必须分别记录。
| 方案写法 | 权重 | 激活/计算 | 主要收益 | 主要风险 |
|---|---|---|---|---|
| W4A16 | 约 4 bit + 元数据 | 常见 FP16/BF16 | 权重带宽与常驻空间 | 解包/反量化开销、内核兼容 |
| W8A8 | 8 bit | 8 bit | 匹配硬件时兼顾计算与带宽 | 校准与激活异常值 |
| NF4 + BF16 compute | NF4 码本 | BF16 | 低内存加载或 QLoRA | 不能标成整数 INT4 |
| GGUF Q4 | 由具体 Q4 类型决定,可能混合 | 由 llama.cpp backend 决定 | 本地 CPU/GPU 生态与可移植文件 | 不能与 GPTQ/AWQ checkpoint 互换 |
INT4 能省多少显存:先算权重下限,再算完整运行预算
只计算量化权重的理论下限,可以用 参数量 × 4 ÷ 8,即每个参数约 0.5 字节。这个结果不是完整显存:scale、zero point、未量化层、embedding、输出头、KV cache、激活、kernel workspace、图缓存、运行时和碎片都要另算。
| 标称参数量 | 纯 4-bit 权重下限(十进制) | 部署时还需加入 |
|---|---|---|
| 7B | 约 3.5 GB | 量化元数据、高精度层、模型配置、KV cache、激活、运行时、工作区与安全余量 |
| 8B | 约 4.0 GB | |
| 14B | 约 7.0 GB | |
| 32B | 约 16.0 GB | |
| 70B | 约 35.0 GB |
def int4_weight_floor_gb(parameters: int) -> float:
"""仅估纯 4-bit 权重的十进制 GB 下限,不是运行显存。"""
return parameters * 4 / 8 / 1_000_000_000
for billions in (7, 8, 14, 32, 70):
print(billions, int4_weight_floor_gb(billions * 1_000_000_000))
MoE 还要区分总参数、每 token 激活参数和实际驻留权重;“只激活部分专家”并不等于只加载这些专家。长上下文或高并发时,KV cache 可能超过节省下来的权重空间。更完整的预算方法见模型量化显存与质量验收。
选择 INT4 文件前先读懂模型卡和量化配置
下载前至少确认:原始模型与 revision、量化作者、算法、bits、group size、对称性、校准数据、哪些层跳过、目标 backend、最低版本、许可证和文件哈希。缺少这些信息时,文件能加载也不代表结果可复现。
| 模型卡字段 | 你要回答的问题 | 缺失时的处理 |
|---|---|---|
| base model / revision | 量化自哪个精确基线 | 不能与未知 revision 的高精度模型做质量结论 |
| quant method | GPTQ、AWQ、AutoRound、bitsandbytes 或其他 | 不要仅按文件名猜算法 |
| bits / group size / sym | 位宽、粒度、是否对称 | 保存 config 并核对 runtime 是否支持 |
| calibration | 样本来源、数量、长度与语言 | 业务分布差异大时扩大回归测试 |
| modules skipped | 哪些层保持高精度 | 实际文件可能明显大于理论 4-bit 下限 |
| runtime / kernel | 在哪个版本和硬件上运行 | 先做小模型或单实例 canary |
| license / hashes | 能否使用、文件是否完整 | 不明来源不进入生产 |
GPTQ 论文把它定义为利用近似二阶信息的一次性权重量化方法;AWQ 论文利用激活分布识别并保护显著权重。二者可以产生 4-bit 权重,但“算法名”“数值类型”“checkpoint 布局”和“推理内核”是四个不同层级。
运行时与硬件兼容:不要照抄一张永久支持表
兼容关系变化很快,应以实际使用版本的官方矩阵为准。vLLM 当前量化页分别列出 AWQ、GPTQ、GGUF、bitsandbytes、TorchAO 与 LLM Compressor,并给出 GPU 架构、Intel、x86 和 Arm 的支持矩阵;这说明“vLLM 支持 INT4”不是一个足够精确的部署条件。
| 先确认 | 为什么 | 验收证据 |
|---|---|---|
| 模型架构 | 量化器或 runtime 未必覆盖所有层与 MoE 实现 | 官方 supported models + 成功加载日志 |
| checkpoint 格式 | GPTQ、AWQ、GGUF、bitsandbytes 布局不同 | 量化 config、文件结构与 loader 一致 |
| GPU/CPU 架构 | 可加载不等于有高效 kernel | 启动日志、profiling 与官方矩阵 |
| 框架版本 | 格式、kernel 和 config 会变 | 锁定依赖、驱动与容器 digest |
| fallback/offload | 回退可能隐藏在“成功运行”后 | 设备映射、实际 kernel、CPU/GPU 占用 |
如果目标只是“在现有硬件上放得下”,还应先比较更小的高精度模型、云端服务和不同量化路线;可参考本地部署还是云端大模型决策指南。不要为了追求 4 bit 标签而接受不可维护的自定义内核。
如何确认 checkpoint 真的按目标方案运行
LLM Compressor 的当前 W4A16 示例把配方、校准、保存和 vLLM 加载放在同一流程中。这里最值得复用的不是某一行命令,而是证据链:生成端保存量化配置,部署端识别同一配置,并在目标模型与硬件上验证。若下载的是第三方 checkpoint,应先把仓库中的 config.json、量化配置、权重索引和模型卡保存到发布记录,再启动服务。
| 证据层 | 最低检查 | 通过信号 | 不通过时 |
|---|---|---|---|
| 文件 | 权重分片、索引、量化配置、哈希完整 | 文件名与索引引用一致 | 重新下载,不绕过校验 |
| 配置 | quant method、bits、group size、sym、skip modules | 与模型卡和目标 loader 一致 | 停止按文件名猜测 |
| 启动 | 完整保存 stdout/stderr、版本与设备映射 | 量化 backend 和设备被明确识别 | 排查 fallback、offload 或不支持层 |
| 运行 | 固定一组短/长输入并采集 profiler | 目标 kernel 被调用,结果可复现 | 回到受支持组合或高精度基线 |
| 资源 | 同时看 GPU、CPU、RAM、VRAM 与磁盘读写 | 负载位置与设计一致 | 识别是否把压力转移到 CPU/内存 |
canary 不应只验证“能回答一句话”。至少包含冷启动、短 prompt、长 prefill、持续 decode、目标并发和一次故障恢复;同时记录模型加载时间、首 token 延迟、token 间延迟、P95、峰值内存、CPU offload、超时与重启。只有这些数据与高精度基线使用相同输入和环境时,才能支持“该 INT4 版本适合这台机器”的结论。
GGUF 的 Q4_K_M 为什么不能直接写成 INT4
GGUF 是带模型元数据和张量的文件容器,Q4_K_M 是 llama.cpp 的具体量化类型。一个 GGUF 文件可对不同张量使用不同类型,因此 Q4 标签不必表示所有权重都是完全相同的 signed INT4。llama.cpp 当前量化说明还明确警告:对已经量化的张量再次量化,质量可能比从 16/32-bit 源模型量化明显更差。
| 你的目标 | 优先选择 | 不要做 |
|---|---|---|
| llama.cpp 本地推理 | 从官方/可信浮点 GGUF 量化或选择注明来源的 Q4 类型 | 把任意 GPTQ/AWQ 文件改后缀当 GGUF |
| vLLM GPU 服务 | 使用当前版本明确支持的 GPTQ/AWQ/LLM Compressor 格式 | 只看“4-bit”忽略模型与 GPU 支持矩阵 |
| Transformers 低内存加载 | 明确 bitsandbytes 的 NF4/FP4 与 compute dtype | 把 NF4 记录成整数 INT4 |
| 自己生成 checkpoint | 保留浮点源、revision、配置、校准集和哈希 | 从低比特文件反复 requantize |
INT4 上线前的质量与性能验收

| 门禁 | 固定条件 | 测量内容 | 硬失败 |
|---|---|---|---|
| 基线 | 模型 revision、tokenizer、提示、采样 | 可复现配置与高精度输出 | 基线不是同一模型 |
| 格式/内核 | runtime、driver、容器、量化 config | 实际加载 dtype、kernel、fallback | 静默回退或未知 offload |
| 内存 | 上下文、批量、并发、生成长度 | 文件、RAM/VRAM 峰值、OOM | 目标负载下无安全余量 |
| 任务质量 | 真实任务、语言、难例、结构化输出 | 正确、完整、引用、格式、人工返工 | 关键字段或事实错误增加 |
| 性能 | 相同硬件与请求分布 | TTFT、ITL、吞吐、P50/P95 | 只报告峰值 tokens/s |
| 稳定性 | 持续压测与冷启动 | 超时、重启、功耗、队列 | 压力下频繁失败 |
| 回滚 | 旧镜像、权重和路由仍可用 | 切换时间与兼容 | 无法在目标时间恢复 |
多模态模型还要分别测 OCR、定位、图表、视觉细节和多图输入。以 CogVLM2 为例,官方 INT4 权重有其特定环境与显存口径,不能扩展成所有 VLM 的结论;具体边界可看CogVLM/CogVLM2 本地部署核验。
推荐的八步 INT4 部署流程
- 冻结目标:写清目标硬件、运行时、最大上下文、并发、延迟和质量硬门槛。
- 冻结基线:保存浮点模型 repo、revision、tokenizer、依赖和任务集。
- 读模型卡:核对算法、bits、group size、校准、跳过层、许可证和哈希。
- 查兼容矩阵:确认模型架构、checkpoint、硬件与 kernel 的组合由当前版本支持。
- 先做 canary:只加载一份候选,核对 dtype、device map、fallback 与峰值内存。
- 同任务对照:用完全相同的提示、材料、采样和评分比较高精度基线。
- 压力与回滚:测试长上下文、并发、失败恢复和旧版本切换。
- 记录版本:保存权重哈希、容器 digest、驱动、runtime、量化 config 与复核日期。
常见问题
INT4 权重一定只有 FP16 的四分之一吗?
纯权重位宽下限约为四分之一,但实际文件还包含 scale、zero point、元数据和未量化层;运行内存还要加入 KV cache、激活、工作区和运行时。因此不能用参数量乘 0.5 字节直接承诺显存。
INT4 一定比 INT8 或 FP16 快吗?
不一定。它更容易减少内存传输,但还要支付解包与反量化开销。只有目标请求是内存带宽瓶颈,并且格式、硬件与高效内核匹配时,净速度收益才可能成立。
NF4 是 INT4 吗?
不是。两者都使用 4 bit 编码,但 NF4 是 NormalFloat 4 码本数据类型,signed INT4 是 16 个整数状态。加载配置、运行时和适用场景不能混写。
下载别人量化好的模型还是自己量化?
可信预量化权重能节省时间,但必须有明确的 base revision、量化配置、校准说明、目标 backend、许可证和哈希。缺少这些信息,或业务对中文、代码、事实和结构化输出很敏感时,应保留浮点基线并重新量化与验收。
能把一个 Q4 模型再次量化成更小的 Q3 吗?
技术上某些工具允许,但误差会累积。llama.cpp 也明确警告 requantize 可能严重降低质量;优先从 FP16/BF16/FP32 源权重生成目标量化版本。
编辑复核记录:本文由兰塞 AI 编辑流程于 2026 年 7 月 18 日依据 Transformers、bitsandbytes、torchao、TensorRT、vLLM、Intel、llama.cpp 与 GPTQ/AWQ 原始论文重写。量化支持矩阵、runtime、kernel 和模型格式会变化;部署前请重新打开与你的版本对应的一手文档。本站的来源、更新与纠错原则见关于本站与编辑规范。
