好文集ChatGPT Plus¥119

权重压到 4 bit,大模型为什么还能工作?

文章目录

部分视频或图片暂未收录,已在正文保留提示;需要时可查看原文。查看原文 ↗

一个拥有 270 亿参数的模型,如果每个参数从 16 bit 改成 4 bit,理想情况下,权重存储就能减少 75%。

省掉这么多信息,它为什么还能写代码、做推理?又为什么有些量化版本表现很好,有些却明显变差?

答案藏在三个问题里:计算机怎样表示数字,数字的误差怎样进入计算,以及我们怎样控制这些误差。

以 Qwen3.8-27B 为例,从一次最简单的计算开始。

1.参数怎样参与模型的计算

大模型处理文本时,会把 token(文本片段)变成向量,再经过多层计算,最终得到下一个 token 的概率分布。

其中,大量计算涉及矩阵乘法。把它拆到最小,可以先看一次加权求和:

[未转换内容,参见原始 JSON]

例如,两个权重是 0.73 和 -0.36,两个输入都是 1,输出就是:

[未转换内容,参见原始 JSON]

真实模型还包含注意力、非线性变换等结构,但这个例子足够说明:权重是训练得到、实际参与运算的数值,改变权重可能改变输出。

常见的权重量化通常保留模型结构和参数数量,主要改变这些数值的表示方式。

这里先分清两件事:27B 描述参数规模,4 bit 描述数值的编码位宽。

2.bit 数决定能用多少种编码

1 bit 只有 0、1 两种状态;8 bit 有 256 种组合;4 bit 有 16 种组合。

这些组合如何对应数值,取决于编码格式。浮点数会把位数分配给符号、指数和有效数字,因此能覆盖较大的数值范围,但不同区间的刻度疏密不同。FP16、BF16 都占 16 bit,范围与精细程度的取舍却不同。

它们本身也有舍入误差。例如,3.1415926 转成 FP16 后,实际表示的是 3.140625。

Qwen3.8-27B 官方仓库标注的权重类型是 BF16。后面说的 16 bit 基线,以这个发布版本为背景。

量化继续缩减表示数值的预算。接下来用均匀整数量化说明机制;FP8、FP4 等低精度浮点方案,则采用另外的编码规则。

3.让 0.73 变成一个 4 bit 编码

假设用有符号 INT4,整数编码范围是 -8 到 7,共 16 种;再给这一组权重选一个共享刻度 s = 0.2。

于是,每前进一个整数编码,就代表实际数值增加 0.2。编码 4 对应 0.8,编码 -2 对应 -0.4,整组能表示的范围是 -1.6 到 1.4。

现在处理权重 0.73:

[未转换内容,参见原始 JSON]

[未转换内容,参见原始 JSON]

整数 4 可以用四个二进制位 0100 保存。以后根据编码和刻度,只能重建出 0.8,无法恢复原来的 0.73。这里引入了 0.07 的误差。

文章配图

把这个过程写得更完整一些:

[未转换内容,参见原始 JSON]

[未转换内容,参见原始 JSON]

round 表示舍入,clip 表示超出范围时截到边界。例如,同样的刻度下,2.0 只能被截到 1.4,误差就大得多。这是一个零点为 0 的简化方案;非对称方案还可以加入零点偏移。

因此,“INT8 就是保留一位小数”会误导理解。能表示哪些数、相邻数差多少,要结合编码和刻度一起看。

刻度通常由一组权重共享,单独保存。不同组可以使用不同刻度,所以 4 bit 权重量化也不意味着整个模型只剩下 16 个不同的权重值。量化粒度说明

4.量化真正困难的地方,是安排有限的刻度

假设同一组数里,大部分权重很小,却混着一个 3.0。为了让正向最大编码 7 覆盖 3.0,若选 s = 3/7,刻度间隔就约为 0.429。

此时,0.02、0.07、0.15 都会舍入到 0。原本彼此不同的数,被挤进同一个档位。

扩大范围可以照顾异常大值,却会让中间的刻度变粗;缩小范围可以保留中间的细节,却可能截断两端。

这就是范围、分辨率与截断误差之间的取舍。按组设置刻度能让不同数值分布各自适配,但分组越细,通常也要存更多刻度等信息。

4 bit 于是从一个简单的“文件大小选项”,变成了一个工程问题:把有限的表示能力分配到哪里,对模型最有价值?

5.权重误差怎样变成输出误差

回到开头。两个权重 0.73、-0.36,用 s = 0.2 量化后,变成 0.8、-0.4。

输入仍然是 1、1:

[未转换内容,参见原始 JSON]

[未转换内容,参见原始 JSON]

输出只相差 0.03,因为两项误差发生了部分抵消。

但把输入改成 10、1:

[未转换内容,参见原始 JSON]

[未转换内容,参见原始 JSON]

同样的权重误差,输出差值变成了 0.66。

对一个线性层、固定输入 x 而言,这个关系可以概括为:

[未转换内容,参见原始 JSON]

这解释了为什么只看“每个权重改了多少”还不够。输入的大小、方向,以及后续计算,都可能改变误差的影响。

量化能够工作的一个基础,是部分计算与决策对小扰动保持稳定。拿某一步选 token 来说:假设采用“取最高分”的方式,第一名得分 5.0,第二名 3.0;如果所有候选分数的变化都不超过 0.1,第一名仍然是第一名。

但如果前两名是 5.0 和 4.99,很小的变化就可能颠倒顺序。这只是说明单步决策的稳定条件;随机采样时,还要考虑整个概率分布的变化。

真实网络中,前一层的误差还会传到后一层,某些计算可能放大它。生成的文本又会成为后续输入,因此局部误差小,并不能自动保证整段回答可靠。

不少量化方法因此会利用校准数据,也就是一批有代表性的输入,观察真实计算中的敏感性。

GPTQ 利用近似二阶信息,在逐步量化时调整尚未量化的权重,尽量减小层输出的重建误差。AWQ 则观察激活分布,识别敏感的权重通道,通过等价缩放降低它们的量化误差。

训练完成后再量化,属于 PTQ;在训练或微调阶段模拟量化误差、让参数适应它,属于 QAT。它们都是在处理同一个目标:以更少的数值资源,尽量保持任务表现。

“4 bit 保留 98% 智商”无法表达这些差异。有效的结论需要说明:哪个模型、哪种量化、什么任务,以及怎样的评测条件。

6.为什么文件会变小,推理又可能更快

先算最容易确定的部分:纯权重编码的存储量。1 字节等于 8 bit,所以估算公式是“参数量 × 每参数位数 ÷ 8”。

按 270 亿参数、所有参数统一位宽估算,16 bit 约为 54 GB,8 bit 约为 27 GB,4 bit 约为 13.5 GB。这里用十进制 GB,尚未计入刻度等开销,也不是某个文件的实测大小。

刻度确实会占空间。比如每 128 个 4 bit 权重,额外保存一个 16 bit 刻度,平均每个权重就需要:

[未转换内容,参见原始 JSON]

部分权重保留高精度、零点、其他元数据等,还会继续影响大小。

计算精度也要单独看。W4A16 中,W 指权重、A 指激活,也就是计算过程中的中间数值;它通常表示权重采用 4 bit 编码,激活采用 16 bit。低位宽权重可以在计算时按块解包和反量化,不必先把整个模型还原成一份完整的高精度权重。具体乘法与累加精度由实现决定。

即使使用较高精度计算,压缩仍可能加速:在单用户、低批量、逐个生成 token 的阶段,计算单元经常需要等待权重从内存送来。权重变小,搬运的数据减少,就可能缓解带宽瓶颈。

不过,读取长提示词的预填充阶段、高并发场景,以及不同硬件上的瓶颈可能不同。解包也有成本,低精度算子也需要适配。因此,位数更低并不保证所有场景都更快,速度要在实际工作负载下测。

7.回到 Qwen3.8-27B,怎样判断自己能不能运行

13.5 GB 是前面的理想估算。检索日为 2026 年 10 月 4 日,ggml-org 发布的 Qwen3.8-27B Q4_K_M 文件,页面标注约 19 GB。这是该发布者、该具体文件的大小,不能推广到所有 4 bit 版本。

下载文件之外,运行模型还要给其他内容留空间:权重及量化参数、KV 缓存与其他状态、激活与临时工作区,以及运行时开销。

文章配图

在注意力层里,当前 token 的查询向量 Q 会与历史 token 的键 K 计算相关程度,再据此加权汇总值 V。历史 token 的 K/V 已经算过,KV 缓存把这些中间结果保留下来,供后续生成复用,避免反复计算。

对常规全注意力,其他条件相同时,历史越长、同时处理的独立序列越多,所需 KV 容量通常越大。KV 量化就是降低这些向量的存储精度:例如从 16 bit 降到 8 bit,纯向量存储理论上减半,但还要计入刻度等开销,也会引入数值误差。权重采用 4 bit,不会自动让 KV 缓存也变成 4 bit;缓存精度需要推理引擎另行支持和配置。

Qwen3.8-27B 的语言骨干共有 64 层,按“3 层 Gated DeltaNet + 1 层 Gated Attention”重复 16 次,也就是 48 层 DeltaNet 和 16 层全注意力。每层还包含前馈网络(FFN),继续变换当前表示。模型结构

两类层保存历史的方式不同:Gated Attention 保留逐 token 的 K/V;Gated DeltaNet 则用门控控制旧信息的保留,再根据新信息修正一份状态矩阵。在常规逐 token 解码时,这份状态的形状固定,不需要为每个历史 token 追加一份 K/V;但那 16 层全注意力的缓存仍随历史增加。因此,混合结构减少了需要逐 token 保存 K/V 的层数,不能据此认定整个模型的运行内存恒定。

此外,它还带有视觉编码器,将图像转换为送入语言骨干的视觉表示;处理图像或视频时,也要考虑相应的运行开销。

文章配图

所以,选择本地版本时,实际需要核对的是:具体文件与量化配置、计划使用的上下文长度、是否处理图像、推理框架,以及目标硬件上的速度和任务表现。采用 CPU 卸载或多设备运行,也会改变显存需求与速度。

能力评估同样要落到用途:写代码看测试通过率,做抽取看准确率与格式遵循,做长文分析看指定长度下的信息检索和回答质量。一次回答不同,或者某项语言建模指标接近,都不足以代表全部能力。

理解量化以后,值得追问的就更具体了:这份压缩,把误差放在了哪里?对我需要完成的任务,它带来了多少收益,又付出了多少代价?

全文完
查看原文