训练好的深度学习模型原来这样部署的!(干货满满,收藏慢慢看)
作者:Edison_G
当我们辛苦收集数据、数据清洗、搭建环境、训练模型、模型评估测试后,终于可以应用到具体场景,但是,突然发现不知道怎么调用自己的模型,更不清楚怎么去部署模型! 这也是今天“计算机视觉研究院”要和大家分享的内容,部署模型需要考虑哪些问题,考虑哪些步骤及现在常用的部署方法! 今天内容较多,感兴趣的请收藏慢慢阅读!
1
背景
当我们辛苦收集数据、数据清洗、搭建环境、训练模型、模型评估测试后,终于可以应用到具体场景,但是,突然发现不知道怎么调用自己的模型,更不清楚怎么去部署模型!
使用GPU Coder生成整个端到端应用程序的代码
将深度学习模型部署到生产环境面临两大挑战:
- 我们需要支持多种不同的框架和模型,这导致开发复杂性,还存在工作流问题。数据科学家开发基于新算法和新数据的新模型,我们需要不断更新生产环境
- 如果我们使用英伟达GPU提供出众的推理性能。首先,GPU是强大的计算资源,每GPU运行一个模型可能效率低下。在单个GPU上运行多个模型不会自动并发运行这些模型以尽量提高GPU利用率
Matlab案例
能从数据中学习,识别模式并在极少需要人为干预的情况下做出决策的系统令人兴奋。深度学习是一种使用神经网络的机器学习,正迅速成为解决对象分类到推荐系统等许多不同计算问题的有效工具。然而,将经过训练的神经网络部署到应用程序和服务中可能会给基础设施经理带来挑战。多个框架、未充分利用的基础设施和缺乏标准实施,这些挑战甚至可能导致AI项目失败。今天就探讨了如何应对这些挑战,并在数据中心或云端将深度学习模型部署到生产环境。
一般来说,我们应用开发人员与数据科学家和IT部门合作,将AI模型部署到生产环境。数据科学家使用特定的框架来训练面向众多使用场景的机器/深度学习模型。我们将经过训练的模型整合到为解决业务问题而开发的应用程序中。然后,IT运营团队在数据中心或云端运行和管理已部署的应用程序。
2
部署需求
以下需求讲解转自于《知乎-田子宸》
链接:https://www.zhihu.com/question/329372124/answer/743251971
需求一: 简单的demo演示,只看看效果
caffe、tf、pytorch等框架随便选一个,切到test模式,拿python跑一跑就好,顺手写个简单的GUI展示结果;高级一点,可以用CPython包一层接口,然后用C++工程去调用
需求二: 要放到服务器上去跑,不要求吞吐和时延
caffe、tf、pytorch等框架随便选一个,按照官方的部署教程,老老实实用C++部署,例如pytorch模型用工具导到libtorch下跑。这种还是没有脱离框架,有很多为训练方便保留的特性没有去除,性能并不是最优的。另外,这些框架要么CPU,要么NVIDIA GPU,对硬件平台有要求,不灵活;还有,框架是真心大,占内存(tf还占显存),占磁盘。
需求三: 放到服务器上跑,要求吞吐和时延(重点是吞吐)
这种应用在互联网企业居多,一般是互联网产品的后端AI计算,例如人脸验证、语音服务、应用了深度学习的智能推荐等。由于一般是 大规模部署 ,这时不仅仅要考虑吞吐和时延,还要考虑功耗和成本。所以除了软件外,硬件也会下功夫。
硬件上,比如使用推理专用的NVIDIA P4、寒武纪MLU100等。这些推理卡比桌面级显卡功耗低,单位能耗下计算效率更高,且硬件结构更适合高吞吐量的情况。
软件上,一般都不会直接上深度学习框架。对于NVIDIA的产品,一般都会使用TensorRT来加速。TensorRT用了CUDA、CUDNN,而且还有图优化、fp16、int8量化等。
需求四: 放在NVIDIA嵌入式平台上跑,注重时延
比如PX2、TX2、Xavier等,参考上面,也就是贵一点。
需求五: 放在其他嵌入式平台上跑,注重时延
硬件方面,要根据模型计算量和时延要求,结合成本和功耗要求,选合适的嵌入式平台。
比如模型计算量大的,可能就要选择带GPU的SoC,用opencl/opengl/vulkan编程;也可以试试NPU,不过现在NPU支持的算子不多,一些自定义Op多的网络可能部署不上去;
对于小模型,或者帧率要求不高的,可能用CPU就够了,不过一般需要做点优化(剪枝、量化、SIMD、汇编、Winograd等)。在手机上部署深度学习模型也可以归在此列,只不过硬件没得选,用户用什么手机你就得部署在什么手机上。
上述部署和优化的软件工作,在一些移动端开源框架都有人做掉了,一般拿来改改就可以用了,性能都不错。
需求六: 上述部署方案不满足你的需求
比如开源移动端框架速度不够——自己写一套。比如像商汤、旷世、Momenta都有自己的前向传播框架,性能应该都比开源框架好。只不过自己写一套比较费时费力,且如果没有经验的话,很有可能费半天劲写不好
粉丝福利:
MATLAB的使用 GPU Coder 将深度学习应用部署到 NVIDIA GPU上
链接:https://ww2.mathworks.cn/videos/implement-deep-learning-applications-for-nvidia-gpus-with-gpu-coder-1512748950189.html
NVIDIA Jetson上的目标检测生成和部署CUDA代码
链接:https://ww2.mathworks.cn/videos/generate-and-deploy-cuda-code-for-object-detection-on-nvidia-jetson-1515438160012.html
3
部署举例
作者:糖心他爸 链接:https://www.zhihu.com/question/329372124/answer/809058784
选择嵌入式部署的场景来进行分析
一般从离线训练到在线部署,我们需要依赖离线训练框架(静态图:tensorflow、caffe,动态图:pytorch、mxnet等),静态图工业部署成熟坑少,动态图灵活便捷、预研方便,各有各的好处;还需要依赖在线inference的框架(如阿里的MNN、腾讯的NCNN等等,一般不建议你自己去抠neon等simd底层的东西),能大大缩减你的部署周期,毕竟公司里面工期为王!
选定了上述工具链以后,剩下的就是我们问题所关心的 如何部署 ,或者说的是 部署流程 。
一般流程分为如下几步:
- 模型设计和训练
- 针对推断框架的模型转换
- 模型部署
虽然把整个流程分成三步,但三者之间是相互联系、相互影响的。首先第一步的模型设计需要考虑推断框架中对Op的支持程度,从而相应的对网络结构进行调整,进行修改或者裁剪都是经常的事情;模型转换也需要确认推断框架是否能直接解析,或者选取的解析媒介是否支持网络结构中的所有Op,如果发现有不支持的地方,再权衡进行调整。
下面我给大家推荐几个部署案例,很多case在产品部署中都有应用, 离线训练框架主要使用tensorflow、mxnet,在线inference框架我主要使用阿里MNN。案例请参考下面链接:
静态图的部署流程:
- 实战MNN之Mobilenet SSD部署(含源码) https://zhuanlan.zhihu.com/p/70323042
- 详解MNN的tf-MobilenetSSD-cpp部署流程 https://zhuanlan.zhihu.com/p/70610865
- 详解MNN的tflite-MobilenetSSD-c++部署流程