![7a09ee698eb8f0aea905d1ae08ecd807.png](https://i-blog.csdnimg.cn/blog_migrate/8524b1e5ef2f1952114e340234965065.jpeg)
当我们谈论模型加速的时候,我们在谈论什么?
最近为了让模型在车上又快又好的跑起来,研究了一下模型的压缩和加速。严格来说,模型的压缩和加速是两件事情,这里我们不区分概念,只讨论目的 —— 让模型又快又好的跑起来,即在不过分损失精度的前提下,提升模型的推理速度。
总结起来,目前实现这一目的主要依靠以下四种手段:
- 剪枝
- 输入模糊化
- 代码去重和优化
- 具体硬件角度设计加速方案
剪枝
剪枝是对模型进行裁剪,去掉低效低价值分支。现在的剪枝方法其实效率蛮低的,都是模型训练完成后再根据结果进行剪枝的,比如某一层参数有128,裁剪到64,然后其它层不变训练到没问题,然后再裁剪下一层。会比较麻烦一点,当然在卡够的情况下还是很值得一试的。
输入模糊化
其实就是缩小输入图像,比如输入图像的原尺寸是1800X1200,处理这么大的图像当然耗时,缩小到一定尺寸,能满足任务就好。
代码去重和优化
这就是软件工程师的术业有专攻了,在工程化,尤其是比较大型的工程中,这一过程尤其重要。互联网公司中,算法工程师的模型要上线,是需要软件工程师重写的,就是这一考虑。在自动驾驶上,算法工程的模型要上嵌入式平台,也是需要软甲工程师的帮助的。
具体硬件角度设计加速方案
这其实是对性能提升最显著的一点,在很多时候这也是算法工程师力所能及且职责所在的工作。当然,算法工程师能做的,基本是使用硬件提供的加速包,比如英伟达的硬件平台就是用TensorRT,一些框架比如caffe就用caffe-intel,tensorflow下可以用tflite进行全量化加速或后处理量化加速,或者能力强一点的基于基本框架可以自己搭建一些特定需求的功能包。总的来说,还是用硬件平台的加速包的时候比较多,针对硬件本身自己上手加速可操作空间不高,要知道为了更好的使用GPU,英伟达可是养了好大一支的全球团队和联合培养的PHD呢。
不同硬件平台上的加速是一件很有意思的事儿,这里有一篇关于TensorRT为什么能加速计算的文章:
https://zhuanlan.zhihu.com/p/64933639
除此之外,还有一类办法是做知识蒸馏(knowledge distill),把复杂网络学习的feature迁移到简单的网络上面来,比如残差网络,前面上百层的都在做提取特征的事情,迁移到一个简单的网络上面来,加速做推理。不过知识蒸馏更多时候是为了充分利用在推理时缺席的数据,不单单是为了让模型跑快快这件简单的小事了。