开始前,会这些就够了
- 知道模型权重是一组数
- 理解位和字节
看到模型文件变小,很自然会期待它回答得更快。文件和权重占用少一些,确实可能减少读取压力;但“要搬多少数据”和“完成整次回答要多久”仍是两个问题。量化能否提速,还取决于硬件、实际运算方式,以及原本最耗时的环节。
量化是用较少的数值表示去近似原来的数。例如把连续刻度换成有限格子,数值就必须落到附近的格子上。这个比喻只帮助理解舍入;真实模型还需要考虑不同层的数值范围、异常大值和任务质量,不能靠文件大小判断答案是否仍可靠。
先看舍入与超出范围时发生什么
下面自定义一个简化的有符号四位整数范围,从负八到七,缩放步长为零点二五。先把原数除以步长并就近舍入到整数,再限制在范围内;还原时乘回步长。这里使用 Python round 的舍入规则,没有实现 AWQ、NF4 或某个模型的完整量化方法。
中间的整数是较粗的表示,还原值不保证等于原值。超出可表示范围时会被截到端点,误差可能更明显。打印结果只用于观察近似过程;Python 的 int 对象本身不是打包后的四位存储,所以不能拿这个列表的内存大小或运行耗时,证明四位模型能节省多少显存、快多少倍。
scale = 0.25
qmin, qmax = -8, 7
for original in [-2.30, -0.62, 0.14, 1.61, 2.20]:
quantized = max(qmin, min(qmax, round(original / scale)))
restored = quantized * scale
print(f"x={original:.2f} q={quantized} restored={restored:.2f} "
f"error={abs(original - restored):.2f}")
怎样运行:Python 3.10+;保存为 quantization_grid.py,在该目录运行 python quantization_grid.py。只用标准库,无需联网。
运行后对照结果
x=-2.30 q=-8 restored=-2.00 error=0.30
x=-0.62 q=-2 restored=-0.50 error=0.12
x=0.14 q=1 restored=0.25 error=0.11
x=1.61 q=6 restored=1.50 error=0.11
x=2.20 q=7 restored=1.75 error=0.45存成四位,不等于全程只算四位
真实格式会把低位宽权重打包,也需要保存缩放参数等辅助信息。一些层还可能保留更高精度。因此单个权重的理想位数比例,不等于模型总文件或整次运行的内存比例。只量化权重,也不会自动把所有激活值、缓存和临时工作空间一起变成同样位数。
存储类型与计算类型可以不同。例如 Transformers v4.46.2 的 bitsandbytes 文档把四位加载和计算数据类型分开配置。运行时可能需要解包、转换,或把部分运算交给更高精度路径。若设备和算子没有高效支持相应格式,额外处理就可能抵消少读权重的收益。
AWQ 论文同时介绍了量化方法和配套推理系统,后者还做算子融合与适合平台的权重打包。这提醒我们,性能来自算法与实现共同作用。不能只看到同一个“AWQ”标签,就把论文在指定实现上的加速结论照搬到另一块显卡、另一种批量或另一套运行时。
把质量、空间和时间分别比较
比较时固定模型任务、输入长度、输出上限、批量、硬件和软件版本,再记录三类结果:任务质量是否改变,峰值显存是多少,生成需要多久。加载耗时、首个输出出现前的等待和后续生成速度可以分别记录,它们解决的是不同体验问题,不能只挑其中最好看的一项。
测试应预热并重复,解释结果来自哪种工作负载。一次只生成短回复,与同时处理许多长请求,瓶颈可能不同。若量化后确实能装入原来放不下的模型,这已经是明确价值;是否还更快,则让同条件测量回答。本篇只运行数值格子实验,没有测 GPU,也不承诺某个量化格式普遍更快。
记住这三点
- 量化用有限表示近似原值,舍入与截断都可能带来误差。
- 权重位数、计算类型与总显存占用是不同概念。
- 速度结论需要绑定硬件、运行时、批量和输入输出长度。
别把例子用过头
- Python 整数示例没有真正打包四位数据,不能用来测量量化加速。
- 本地格子是自拟线性量化,不代表 AWQ、NF4 或全部量化方法。
- 论文或厂商的特定基准不能直接外推到任意设备与任务。
自己试一小步
不运行大模型,怎样看出表示范围与误差之间的关系?
- 保持整数范围不变,尝试两个不同步长并记录还原误差。
- 分别准备靠近零和超出范围的输入,观察误差由舍入还是截断造成。
- 为一次真实量化对比写实验记录表,只列必须固定的条件,不编造性能结果。
做到这些,就算完成
- 分清表示范围变大与格子变细这两个目标。
- 没有把 Python 对象大小当成低位权重的真实占用。
- 记录表同时覆盖质量、峰值空间和时间。
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- PyTorch:量化实践的基本原理 (新标签页)↗
缩放、量化误差、动态转换开销与硬件后端依赖。
- Transformers v4.46.2:bitsandbytes (新标签页)↗
低位加载、其他模块保留不同数据类型,以及独立配置四位计算类型。
- AWQ:权重量化与配套加速系统 (新标签页)↗
量化算法之外,还需要算子融合和面向平台的权重打包来实现配套加速。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
PyTorch 官方性能诊断:Profiler 与调优指南 (新标签页)↗
只练耗时与内存统计,在相同输入下找到真正慢的步骤,再分别记录一次改动对速度、占用和结果的影响。
查看学习准备与访问说明 →