深度学习模型加速方法

加速的方法

1、从网络结构上进行优化
2、从计算量上进行优化
3、硬件上优化

从网络结构上进行优化

首先是网络设计时候的考虑优化

1、使用11卷积核代替全连接层可以减小参数
2、使用多个小卷积核代替一个大卷积核,可以达到相同的感受野,同时减小计算量和参数量
3、使用1
1卷积核进行升维和降维
4、使用depth-wise separable卷积代替传统卷积,也就是MobileNet轻量化网络的做法
5、使用分组卷积

模型训练后进行优化

1、模型剪枝
一类是结构化剪枝,另一类是非结构化剪枝。

所谓结构化剪枝是对参数矩阵做有规律的裁剪,比如按行或列裁剪,使得裁剪后的参数矩阵仍然是一个规则的的矩阵。结构化裁剪主流的方法有Channel-level、Vector-level、Group-level、Filter-level级别的裁剪。
非结构化剪枝是将原本稠密的参数矩阵裁剪为稀疏的参数矩阵,一般矩阵大小不变,其效果类似于参数正则化。因为目前大部分计算平台不支持稀疏矩阵的计算,只有结构化剪枝才能真正减少计算量。

L1/L2-norm
计算每层权重的卷积核权重绝对值或者平方作为重要性指标,删除权重值比较小的卷积核,并对删除后的卷积核重新组成新的卷积核矩阵,然后进行微调
FPGM-Norm
该算法基于几何中值FPGM通过修剪冗余的卷积核而不是重要性相对较小的卷积核来压缩CNN模型。即该策略通过统计Filters两两之间的几何距离来评估单个卷积内的Filters的重要性。直觉上理解,离其它Filters平均距离越远的Filter越重要。
slim-Norm
该算法采用一种channel-level的裁剪方案,可以通过稀疏化尺度因子(BN层的scaling factor)来裁掉“不重要”的channel。并且该算法可以在训练时实现自动剪枝。原论文直接使用BN层的γ作为稀疏化裁剪的尺度因子
模型剪枝工具https://github.com/Sharpiless/Pytorch-Auto-Slim-Tools
2、模型蒸馏
将大模型学习得到的知识作为先验,将先验知识传递到小规模的神经网络中,并在实际应用中部署小规模的神经网络。在实际研究中,我们将大模型称为Teacher,小模型称为Student,模型蒸馏的过程就是让Student去学习Teacher的知识。目前大部分模型蒸馏框架都是基于Teacher-Student的模式。
蒸馏方法都会让Student去学习Teacher的logit输出,而不是实际的预测值。
模型蒸馏技术是通过用小模型替代大模型来实现推理阶段的加速,适用于推理阶段的加速。而在训练阶段,由于需要预训练大模型,还需要付出额外的计算开销。

计算量进行优化

模型量化是通过减少表示每个权重参数所需的比特数来压缩原始网络,从而实现计算加速。

半浮点精度(FP16)和混合精度是一种常见的做法,不过需要底层计算框架支持,否则无法实现计算加速。另一种是INT8量化,即将模型的权重参数从 FP32 转换为 INT8,以及使用 INT8 进行推理。量化的加速主要得益于定点运算比浮点运算快,但从FP32量化为INT8会损失模型精度。

量化技术适用场景较广,加速效果明显。此外,对于精度敏感的模型,还可以通过精度补偿的操作来进一步优化量化模型的效果。多数部署平台都支持量化加速。

其余方法就是基于平台的加速

英伟达的tensorRT、英特尔的openvino等都是用于深度模型的加速推理工具

你可能感兴趣的:(深度学习,机器学习,算法)