使用 Core ML Tools 压缩机器学习模型
Use Core ML Tools for machine learning model compression
2023年6月5日
一句话判断
如果你的 App 里塞了多个 Core ML 模型导致体积膨胀,这场 Session 提供了三种压缩手段——调色板量化(Palette Quantization)、线性量化(Linear Quantization)和结构化剪枝(Structured Pruning),配合优化工作流实现精度和体积的平衡。
这场 Session 讲了什么
Session 围绕 Core ML Tools 的模型压缩能力展开,介绍了三种压缩技术和两个优化工作流。
模型压缩的动机很直接:模型越来越大(ResNet50 的 50MB 已经算小的,Stable Diffusion 更是巨大),App 中部署的模型数量也在增加。压缩模型不仅能减少 App 体积,还能减少内存与处理器之间的数据搬运,间接提升推理速度。
调色板量化(Palette Quantization):将浮点权重聚类到有限的离散值集合中(类似图像的颜色量化)。比如把 65536 个 Float16 值映射到 256 个聚类中心,索引只需 1 字节存储,压缩比约 4 倍。聚类数量可以选择 4、8、16…256,灵活性很高。
线性量化(Linear Quantization):将浮点权重线性映射到整数范围(如 Int8),每个权重只需 1 字节,压缩比稳定在 2 倍。相比调色板方式更简单直接,适合大模型。
结构化剪枝(Structured Pruning):直接移除对输出影响最小的权重通道或层,最高可实现 2-4 倍压缩。被剪枝的结构在推理时完全不参与计算,所以还能提升速度。
两个优化工作流:训练后量化(Post-Training Quantization)直接压缩已有模型,简单快速;训练时量化感知(Quantization-Aware Training)在训练过程中考虑量化误差,精度损失更小。
值得深挖的点
压缩方式的选择:调色板量化适合中小模型、对精度敏感的场景(可以精细控制聚类数量);线性量化适合大模型(操作简单,压缩比稳定);剪枝适合同时需要减少体积和推理时间的场景。
精度损失的权衡:压缩必然带来精度损失,但实际影响取决于模型和任务。Session 提供的优化工作流允许你在压缩前后对比精度,找到最佳平衡点。对于分类任务,1-2% 的精度下降通常可以接受。
剪枝的加速效果:量化和调色板方法只减少存储体积,推理时仍需反量化计算。剪枝直接移除计算结构,在推理速度上的收益更直接。
代码片段
使用 Core ML Tools 进行模型压缩:
import coremltools as ct
from coremltools.optimize.coreml import (
OpLinearQuantizerConfig,
LinearQuantizer,
OpPaletteQuantizerConfig,
PaletteQuantizer
)
# 加载原始模型
model = ct.models.MLModel("resnet50.mlmodel")
# 方法一:线性量化到 Int8
linear_config = OpLinearQuantizerConfig(
mode="linear_symmetric", # 对称量化
weight_threshold=2048 # 只量化大于此阈值的权重
)
quantizer = LinearQuantizer(global_config=linear_config)
quantized_model = quantizer.compress(model)
# 方法二:调色板量化
palette_config = OpPaletteQuantizerConfig(
nbits=8, # 256 个聚类中心,每个索引 1 字节
mode="kmeans"
)
palette_quantizer = PaletteQuantizer(global_config=palette_config)
compressed_model = palette_quantizer.compress(model)
# 保存压缩后的模型
compressed_model.save("resnet50_compressed.mlmodel")
最佳实践
- 先用训练后量化快速验证压缩效果,如果精度损失可接受就直接上线
- 对精度要求高的模型使用量化感知训练
- 调色板量化从 8-bit 开始尝试,逐步降低到 4-bit 观察精度变化
- 结构化剪枝适合部署在移动端的模型——同时减少体积和推理时间
- 压缩后务必在真实数据集上评估精度,不要只看压缩比
还有什么值得关注
- 量化感知训练的具体实现方式和集成步骤
- 不同压缩技术在 Neural Engine 和 GPU 上的推理性能差异
- Stable Diffusion 等生成式模型的压缩策略
- Core ML Tools 的分析工具——如何在压缩前后可视化权重分布