模型压缩-pruning

53 阅读3分钟

Introduction Pruning

1 什么是pruning
移除神经网络的突触、神经元,以使得神经网络更小。

step1 训练一个网络;
step2 pruning,准确率下降;
step3 重训剩余权重,准确率恢复;
step4 重复step2,3,获得更高剪枝比例

在CV领域,AlexNet、VGG、GoogleNet等网络上可以达到模型大小减小3-9倍。

A100硬件支持2:4稀疏 Xilinx 支持剪枝

2 pruning形式化
WpW_p小于阈值N前提下,损失函数L最小:
argminwpL(x;Wp)arg\, min_{w_p}L(x; W_p)

L表示损失函数,WpW_p表示剪枝后权重

确定剪枝粒度

结构化(Corse-grained/Structured) or 非结构化(Fine-grained/Unstructured)

非结构化(Fine-grained/Unstructured)
剪枝更灵活,剪枝比例高(优点) 硬件难加速(缺点)

结构化(Corse-grained/Structured)
灵活性差,剪掉整行、整列(缺点) 硬件优化(优点)

从细粒度到粗粒度 1 Fine-grained pruning 2 Pattern-based pruning 3 Vector-level pruning 4 Kernel-level pruning 5 Channel-level pruning

N:M sparsity(Pattern-based pruning) 每M个连续的元素,剪掉N个。典型2:4(50% 稀疏) Nvidia A100支持,加速2x

Channel Pruning Pro:硬件友好,由于通道数减少,直接获得加速 Con:压缩比小

剪枝准则

哪些突触(权重)、神经元(激活)可以剪掉 magnitude-based pruning 剪掉权重小的 element-wise L1范数 row-wise L1范数,L2范数

scaling-based pruning scaling 参数是可训练的 剪掉scaling 参数小的channels

second-order-based 对损失函数L 泰勒展开,保留一阶、二阶,去掉三阶以上

神经元(激活)剪枝

神经元剪枝可以看做是是粗粒度剪枝

基于零百分比的剪枝(激活)
ReLu激活函数 使用APoZ(平均零百分比)表示神经元的重要性。举例:输出激活有3个channel,每个channel是4*4,统计每个channel的APoZ:11/32,12/32,14/32。移除零百分比最大的channle。

Regression-based Z=XWTZ=XW_{T} 最小化对应剪枝层的重建误差(最小化未剪枝输出张量与剪枝后输出张量误差),而不是关注最小化L损失函数(反向传播跨越所有层),局部优化更简单。 LLM大部分是矩阵乘,非常有帮助,原因:LLM的反向传播非常昂贵。

重点看看

确定剪枝比率(Pruning Ratio)

pruning ration: 每层剪掉多少,每层有多少冗余 Uniform prune vs. Channel prune(Non-uniform)

Sensitivity Analysis(敏感性分析) 对敏感的layer prune比率小,对不敏感的layer prune 比率大。 敏感性分析忽略layers之间相互影响 -> sub-optimal

AMC: AutoML for Model Compression AutoML 自动机器学习,自动化方法确定剪枝比率、剪枝策略。

NetAdapt
每个迭代,使性能减少ΔR\Delta R
step1 逐层prune,满足性能ΔR\Delta R
step2 对上步骤生成的几组裁剪,分别short-time fine-tune,选择accuracy最高的prune layer;
step3 重复step1、2,直到总性能满足target。

Fine-Tune/Train Pruned Neural Network

GPU加速库、Torch sparse library(Torch 稀疏库)