apizone 看笔记

量化跑通实测:INT8 和 INT4 到底掉多少质量

同一模型三种精度跑同一批任务,看速度、显存和输出差异。

量化是把模型权重(有时连激活)从 FP16 压到 INT8 甚至 INT4 的技术,代价通常是精度。这篇记录一次小规模实测:同一个 7B 级开源模型,三种精度跑同一批任务,看速度、显存和输出的真实差异。

实验设置

同一块 24G 显存的卡,llama.cpp 加载 GGUF,对比 FP16、Q8_0、Q4_K_M 三档。测试集是自己攒的 60 条:20 条知识问答、20 条中文改写、20 条简单代码。评分不靠感觉:知识题对标准答案,改写题看指令遵循清单,代码题直接跑单元测试。

速度与显存

Q4_K_M 相对 FP16:显存降到约三分之一,单请求解码速度接近三倍——瓶颈主要在显存带宽,权重量小了,每 token 搬运的字节就少了。批量场景收益会缩水,因为算力逐渐接棒成为瓶颈。

质量掉在哪

  • 知识问答:Q8 几乎无损;Q4 错的多是冷门事实,常见知识稳定。
  • 中文改写:Q4 开始出现风格漂移——指令理解没问题,但用词偶尔"回退"到训练语料的平均腔。
  • 代码:最敏感。括号配对、变量名一致性这类精确任务上,Q4 的单测通过率掉了约一成,长函数更明显。

几条经验

量化损失不均匀地分布在层间,对首尾层和 attention 的投影矩阵保高精度(mixed precision 方案)能明显救回质量。选量化方案时先想清楚任务的容错面:聊天容忍度高,结构化输出容忍度低。另外别只看 perplexity,它和下游任务表现的对齐并没有想象中好。

量化的正确问法不是"掉了几个点",而是"在我这个任务上,用户能不能察觉"。