量化改变的是数值表示与计算方式。判断能否部署,需要同时看权重、运行时内存和实际任务质量,而不是只看“几位”。

先算权重下限,再算运行空间

理想化地,参数数目 × 每参数位数 ÷ 8 得到权重数据本体的字节数。例如 70 亿参数的 16 位权重约为 140 亿字节,4 位约为 35 亿字节。但真实文件还会保存缩放参数等信息,部分层也可能保留较高精度。

这里使用十进制 GB;GiB 则按 2^30 字节计算。不要把两套单位混在一张预算表里。700 亿参数的 4 位权重本体就约 35 GB,不能据“4位”推断它能完整放入 24 GB 显卡。

运行时还可能需要 KV Cache、激活、工作区和框架开销。上下文长度、批量与并发变化后,总显存也会改变。权重量化不自动意味着这些部分按相同比例缩小。

一个量化和反量化的算术示例

下面采用对称的 INT8 演示,使用 [-127,127]、一个全局尺度、没有偏置。它不实现 GPTQ、AWQ、NF4,也不是可部署的大模型量化器。量化方案、粒度与校准方法需要单独选择。Hugging Face 量化概念说明

import numpy as np

def quantize_demo(values):
    values = np.asarray(values, dtype=np.float32)
    maximum = float(np.max(np.abs(values)))
    scale = maximum / 127 if maximum else 1.0
    integers = np.clip(np.rint(values / scale), -127, 127).astype(np.int8)
    restored = integers.astype(np.float32) * scale
    return integers, restored, scale

weights = np.array([-2.3, -0.2, 0.0, 0.7, 1.9], dtype=np.float32)
quantized, restored, scale = quantize_demo(weights)
assert np.max(np.abs(weights - restored)) <= scale / 2 + 1e-6
assert quantized.nbytes * 4 == weights.nbytes
assert np.all(quantize_demo([0., 0.])[1] == 0)
assert 70_000_000_000 * 4 / 8 > 24_000_000_000
print("quantization error and ideal weight budget checks passed")

nbytes 比较只覆盖本例数组,不包括尺度和程序对象。更重要的是:小的逐参数误差不保证生成质量一定合格。任务指标、长上下文、数值回答和结构化输出都需要重新评估。

不先写死加速倍数

低位权重可能节省带宽,但最终速度取决于硬件、内核、反量化开销、批量和模型形状。相同输入下分别记录预填充、首 token 延迟、生成吞吐与峰值显存,再报告结果。未实测时,不填写“必然提速2—3倍”或固定质量损失。

校准数据应代表实际任务,但不能用测试集反复挑量化配置。还要保存基座与适配器的版本及训练关系,核对适配器合并流程,不能把不同基座上训练的增量随意叠加。

来源与核验边界

本篇依据疏锦行大模型专题《量化部署》讲义的存储、量化与服务预算部分,重新区分理论估算和部署实测。独立的 INT8 算术示例已运行;没有量化课程模型、启动推理服务或复现速度数字。视频口头补充尚未逐节核验,原课件不公开。