要理解量化,你需要先了解它在压缩什么。神经网络的“知识”以数十亿个数值参数(权重)的形式存储,每个参数都是一个浮点数。在训练过程中,这些参数通常以FP32(32位浮点数)或BF16(bfloat16,16位)格式存储。一个70亿参数的BF16模型需要7B × 2字节 = 14GB内存。量化通过降低每个权重的精度(用更少的位数表示)来实现压缩。在INT8(8位整数)格式下,同一模型缩小到约7GB;在INT4(4位)格式下,仅需约3.5GB。关键的洞察是,神经网络权重出人意料地冗余——实际上你并不需要16位精度来有效表示它们。大多数权重集中在零附近,可以用更粗略的表示方式近似。
你将遇到的主要量化格式各有不同的技术实现方式。GPTQ(GPU优化,训练后量化)是早期实用方法之一——它通过分析校准数据中实际推理时权重的交互方式,以最小化误差传播的方式对权重进行量化。AWQ(激活感知权重量化)在此基础上改进,通过聚焦对模型质量影响最大的少数权重,并用更高精度保护它们。GGUF是llama.cpp使用的格式,旨在实现CPU和GPU上的灵活混合精度量化。GGUF文件的命名规则会告诉你具体内容:Q4_K_M表示使用K-quant方法的中等质量4位量化;Q5_K_M是5位;Q2_K是激进的2位(质量损失明显);Q8_0是8位(几乎无损)。
量化带来的质量损失是真实存在的,但常常被夸大。从BF16转为Q8(8位)几乎可以忽略不计——基准测试通常显示标准评估中损失小于0.5%。Q5_K_M仍保留了模型的大部分能力,通常是本地推理的黄金平衡点。Q4_K_M是开始注意到细微差异的地方:模型在处理数字时可能略微不够精确,偶尔在非常长的输出中丢失逻辑线,或在遵循复杂指令时稍显逊色。低于4位时,质量下降更加明显——Q2和Q3量化会使模型在推理任务中明显变“笨”。一般的经验法则是:日常使用时量化到Q4_K_M或Q5_K_M即可,只有在实在无法将模型装入显存时才考虑更低位数。
量化还有一个常被忽视的维度:它不仅节省内存,还能加快推理速度。如果你认为量化数学是“近似”的,因此更慢,这似乎违背直觉。但对LLM推理而言,生成token时的瓶颈是读取显存中的模型权重(内存带宽),而不是计算本身。Q4模型需要读取的数据量仅为Q8的一半,因此token生成速度大约是两倍——前提是推理引擎正确支持量化计算。这就是为什么llama.cpp在桌面GPU上运行Q4_K_M模型时,有时能与云API的token每秒数相当:量化模型在单位硬件上的效率确实更高。权衡始终如一——你用一些质量换取速度和可访问性——但对许多应用来说,这是一笔值得做的交易。
最新值得关注的发展是量化感知训练(QAT),即从一开始就以量化为目标进行模型训练,而不是事后量化。Meta发布了经过QAT训练的Llama模型,其在相同位宽下表现优于训练后量化版本。这种方法生成的模型是“天生”适应低精度的,而不是被强制量化,这很可能是随着本地推理持续增长,该领域未来的发展方向。