为什么需要模型压缩
大语言模型参数量从70亿到数千亿不等,直接部署成本极高。模型压缩技术可以在保持模型能力的同时,显著降低存储、内存和计算需求,使LLM在消费级硬件上也能运行。
量化技术
量化是将模型权重和激活值从高精度浮点数(如FP16)降低到低精度表示(如INT8、INT4)的过程。
量化方法
训练后量化(PTQ): - 无需重新训练,直接在已有模型上应用 - GPTQ:基于最优量化理论的逐层量化算法 - AWQ:激活感知的权重量化,效果优于GPTQ - GGUF:llama.cpp社区标准,支持多种量化级别
量化感知训练(QAT): - 在训练过程中模拟量化效果 - 精度损失更小,但需要训练数据和时间
量化级别对比
| 精度 | 模型大小(7B) | 推理速度 | 质量损失 |
|---|---|---|---|
| FP16 | ~14GB | 1x | 无 |
| INT8 | ~7GB | 1.5-2x | 极小 |
| INT4 | ~3.5GB | 2-3x | 轻微 |
| INT2 | ~1.8GB | 3-4x | 明显 |
工具推荐
- AutoGPTQ:GPTQ量化的流行实现
- AutoAWQ:AWQ量化工具,速度更快
- llama.cpp:支持多种量化级别,社区活跃
- bitsandbytes:HuggingFace生态的量化库
知识蒸馏
知识蒸馏是用一个小模型(学生)学习大模型(教师)的行为模式。
蒸馏方式
黑盒蒸馏: - 只使用教师模型的输出(logits或文本) - 不需要访问教师模型内部结构 - 适合从闭源API模型蒸馏
白盒蒸馏: - 利用教师模型的中间层表示 - 效果通常更好,但需要访问模型参数
蒸馏策略
- 数据生成:使用教师模型生成训练数据
- 分布匹配:让学生模型匹配教师模型的输出分布
- 任务蒸馏:针对特定任务进行蒸馏
- 渐进式蒸馏:逐步缩小模型尺寸
结构化剪枝
剪枝是移除模型中不重要参数的技术。
剪枝类型
- 非结构化剪枝:移除单个权重,稀疏度高但硬件加速困难
- 结构化剪枝:移除整个神经元或注意力头,可直接获得推理加速
SparseGPT
利用二阶优化信息进行一次性剪枝,无需微调即可在保持高稀疏度的同时控制质量损失。
Wanda
更轻量的剪枝方法,基于权重和激活值的乘积进行重要性评估。
压缩策略组合
实际部署中,通常组合使用多种压缩技术:
- 先蒸馏:从大模型蒸馏到中等模型
- 再量化:对蒸馏后的模型进行量化
- 可选剪枝:对特定层进行结构化剪枝
例如,将LLaMA-70B通过多轮压缩,可以部署在单张消费级显卡上。压缩后的模型质量仍能满足大多数应用场景的需求。
