Introduction Pruning
1 什么是pruning
移除神经网络的突触、神经元,以使得神经网络更小。
step1 训练一个网络;
step2 pruning,准确率下降;
step3 重训剩余权重,准确率恢复;
step4 重复step2,3,获得更高剪枝比例
在CV领域,AlexNet、VGG、GoogleNet等网络上可以达到模型大小减小3-9倍。
A100硬件支持2:4稀疏 Xilinx 支持剪枝
2 pruning形式化
小于阈值N前提下,损失函数L最小:
L表示损失函数,表示剪枝后权重
确定剪枝粒度
结构化(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 最小化对应剪枝层的重建误差(最小化未剪枝输出张量与剪枝后输出张量误差),而不是关注最小化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
每个迭代,使性能减少
step1 逐层prune,满足性能;
step2 对上步骤生成的几组裁剪,分别short-time fine-tune,选择accuracy最高的prune layer;
step3 重复step1、2,直到总性能满足target。
Fine-Tune/Train Pruned Neural Network
GPU加速库、Torch sparse library(Torch 稀疏库)