【深度学习部署】

转载自:https://www.cnblogs.com/supersayajin/p/11445401.html

如果说前几年深度学习主题追求的是越来越深的模型及越来越准的方法,那么最近两年关注的点是模型的轻量化及部署,这是一个比较大而且比较复杂的话题。即训练好的模型怎样部署在实际的项目中,也就是我们常说的train和inference(或者forward,test,deploy)主要关注以下几点:

(1) 场景和平台选择,是移动端还是服务器端的,CPU还是GPU的,速度和准确率要求等等。有的时候像TensorFlow、PyTorch、MXNet等框架不太适合直接拿来部署,即使用这些框架部署也要结合硬件平台手动做一些配置上的加速,比如Intel CPU可以用MKL或者SSE、AVX等SIMD指令集加速等等。

(2) 移动端有很多大厂的forward框架比如主流的NCNN,上半年阿里开源的MNN,以及比较低调的armNN等等,目前看NCNN用的最多,MNN很有潜力,移动端的GPU支持貌似不是很好,NVIDIA GPU的话主流还是他们自家的TensorRT加速。训练好的模型部署到移动端需要做模型转换,要注意有些框架只支持几个大厂的格式,比如TensorFlow,PyTorch、Caffe、onnx等,话说这里的onnx貌似发展的并不怎么样,感觉caffe本身反而是最时候做中间转换的桥梁,哈哈。。比如MXNet->Caffe->MNN;另外诸多框架的op也尚未完全统一,很多需要自己自定义op实现,还有的方法是做截断,也就是拿支持的那部分网络的op做转换,先计算得到这部分的结果,后接自己实现的剩余部分。

(3) 用TVM做编译优化,这个看起来比较有意思,很可能是深度学习部署优化的方向之一,针对不同框架、不同语言的前端(目前使用relay)生成中间层IR,然后针对不同的硬件平台做针对性的优化工作。优化的内容包括内存分配、算子融合、GEMM优化等等。之前试过mobilefacenet的TVM版本,差不多能加速30%左右,14ms->9.5ms还是非常给力的,但是目前看默认的优化选项并不是最优的,比如我也试过mxnet gluoncv中的模型还不如不用TVM来得快,更多的时候需要用tvm中auto-tuning方法搜索一个最优的配置,这个过程比较耗时,一个模型可能需要几个小时来实验。

(4) 手动写forward方法,如果做到完全脱离第三方库,需要自己手写forward方法,基本思路还是im2col+GEMM等等,做好内存分配,数据对齐重排,使用指定架构的寄存器提高访存效率、提高cache命中率等等,模型压缩和优化的坑太深,这里不多说了。。。。

猜你喜欢

转载自blog.csdn.net/u011622208/article/details/105947467