大模型压缩全解析:量化、蒸馏与精度评估实战指南 腾讯混元 Hy4-preview 压缩至 200GiB 精度几乎无损这句话拆开看真正值得技术人关心的是三个词体积、压缩、精度。模型权重文件到了百 GB 级别部署就不再是“拷贝一下就能跑”的事从硬盘占用、加载耗时到推理显存每一个环节都在约束模型能不能落地。而“压缩之后精度几乎无损”又是一个很容易被误读的结论不同任务、不同指标下无损的定义差别很大。这里不讨论某个具体模型的内部参数而是把大模型压缩中通用的量化、蒸馏、剪枝、精度评估和排错方法讲清楚让读者在自己机器上也能复现一次从原始权重到压缩权重、再到精度回归的完整流程。1. 先看懂大模型体积和精度之间的关系1.1 权重文件为什么会有几百 GB 那么大一个模型目录的体积往往不是由“层数多深”直接决定而是由参数量和参数存储格式共同决定。更准确地说模型权重体积 参数量 × 每参数字节数每个参数可以存成 32 位浮点、16 位浮点、8 位整数等不同格式。位宽不同字节数不同体积自然不同。8 位是 1 字节16 位是 2 字节32 位是 4 字节。以 200GiB 这个数字为例如果它全部由 FP16 权重构成相当于参数量约为200 GiB 200 × 2^30 字节 ≈ 2.15 × 10^11 字节 参数量 ≈ 2.15 × 10^11 / 2 ≈ 1.07 × 10^11即约 107B如果是 INT8 权重每参数只有 1 字节那么同样的 200GiB 可以容纳约 215B 参数。所以“看到 200GiB”时不能直接判断原始模型是多大必须先确认精度格式。实际目录中除了权重还有 tokenizer 配置、模型配置、分片索引等文件。用du -sh看到的目录体积会略大于纯权重。部署前建议先用ls -lh查看文件列表确认是否存在重复副本或未清理的中间产物。1.2 200GiB 说明部署时在哪一层受限200GiB 的权重放到不同环境里含义完全不同。如果只是存在磁盘上200GiB 对服务器硬盘压力不大但加载进内存会明显耗时。按 2GiB/s 的读取速度算大约需要 100 秒。若加载时还做格式解析、设备搬运和量化转换耗时更长。如果模型要放进 GPU 显存运行200GiB 很难由单卡直接承载。带 80GiB 显存的 A100/H100 需要多卡分片消费级 24GiB 显卡只能在更激进的量化方案下尝试。部署阶段更常见的做法是让框架自动把模型层分到不同显卡再观察是否 OOM。估算显存时不能只看权重。一次推理的显存占用大致是总显存占用 ≈ 模型权重显存 激活值显存 KV Cache 显存模型权重只是第一部分。上下文越长KV Cache 增长越快。压缩权重能明显降低第一项但如果计算精度仍然用 FP16/BF16激活值和 KV Cache 依然按高精度占用显存最终显存下降幅度可能低于预期。1.3 FP32、FP16、BF16、INT8、INT4 到底差在哪压缩的核心动作是改变数值格式。不同格式的差异可以用一张表说清楚格式位宽每参数字节数值特点典型风险FP32324标准单精度范围大、精度高体积最大显存和带宽压力大FP16162指数位少动态范围小大数值容易溢出小数值精度丢失BF16162指数位接近 FP32范围大尾数精度低细节可能比 FP16 更粗INT881只有 256 个取值需要 scale/zero point校准不当会掉点INT440.5只有 16 个取值压缩率最高对校准数据敏感极端值易被截断FP16 和 BF16 都是 16 位但设计思路不同。FP16 尾数精度较高动态范围小BF16 动态范围接近 FP32但尾数精度更低。深度学习权重梯度通常分布在小数值区间BF16 在训练场景更稳定很多新框架默认使用 BF16。INT8 和 INT4 不是简单“降低浮点精度”而是把权重从浮点数映射到整数。映射过程需要额外保存 scale 和 zero point推理时再按近似浮点值参与计算。所以说“精度几乎无损”时必须回答一个问题对比的是什么指标在什么数据上验证允许的误差范围是多少。2. 为什么“精度几乎无损”在技术上可行2.1 量化把连续浮点映射到离散整数量化是当前大模型压缩里最常用的手段因为它不需要重新训练适合已有权重文件。量化思路是找一组缩放关系把原始浮点区间映射到整数编码区间。一个对称 min-max 量化的例子是scale max(abs(x)) / 127 x_int round(x / scale) x_dequant x_int * scaleINT8 只有 256 个码值原始权重中的大量细节必然丢失。很多场景仍能“几乎无损”是因为大模型权重分布通常近似正态多数值集中在零附近。量化算法只要把精细的 scale 放在分布密集区就能用有限码值表达出主要信息。量化粒度同样重要。per-tensor 对整个张量用一个 scale实现简单但对分布不均匀的张量误差大。per-channel 对每个通道单独计算 scale精度更好代价是元数据更多。group_size 再小一级比如 128 个元素一组精度更高但反量化计算开销也更大。量化方案需要在体积、速度和精度之间做平衡而不是一味追求最小位宽。2.2 蒸馏小模型学会大模型的输出分布量化是对同一模型做数值压缩蒸馏则是用一个更小的模型去模仿大模型的输出。蒸馏的优势是压缩比例可以由新模型结构直接决定不受“原模型多少位”的限制。蒸馏基本流程是大模型在训练数据上生成 logits即未归一化的类别得分然后让小模型以同样输入做前向让它的 logits 逼近大模型的 logits。常见损失是带温度的 KL 散度loss KL(softmax(teacher_logits / T), softmax(student_logits / T)) × T^2温度 T 用来放大或缩小概率分布。T 较大时分布更平滑小模型更容易学到教师模型“知道各个答案之间的关系”而不只是标准答案。蒸馏的“几乎无损”通常只在指定下游任务上成立换到另一个任务集时仍可能明显退化。蒸馏成本比量化高很多因为要准备训练数据、训练新模型、评测多轮。生产环境更常见的组合是先用蒸馏把模型结构缩小再用量化把最终体积压到目标值最后统一做精度回归。2.3 剪枝与稀疏去掉不重要的连接或注意力头剪枝的思路是删除模型中对输出影响较小的参数。非结构化剪枝会删除部分权重生成稀疏矩阵但通用矩阵库不一定能加速这类稀疏计算。结构化剪枝直接删除整个注意力头、前馈网络块或层体积和计算量都能直接下降但需要重新训练恢复效果。剪枝在视觉模型上应用成熟在百亿级大模型上比量化麻烦得多。大模型往往带有复杂的并行策略删掉部分结构可能破坏原有张量切分配置稀疏计算库、推理引擎和并行策略的兼容性也限制很大。工程上如果量化已经把体积降到目标附近剪枝的优先级通常低于量化。2.