前言
关于视觉算法部署及落地,知乎上有一个较为热的话题。本文对相关回答等进行了整理,供大家参考。
最近关注的一个知乎问题:视觉算法的工业部署及落地方面的技术知识,怎么学?
感觉落地这块坑确实挺多,入职以来一直在做视觉算法落地这一块的东西,感觉有必要系统的整理一些落地部署相关的资料。
链接:https://zhuanlan.zhihu.com/p/277522145
一、部署
1. 火星少女:在C++平台上部署PyTorch模型流程+踩坑实录
2. DanielTANG:利用LibTorch部署PyTorch模型
二、加速
1. TensorRT
有两个比较优秀的git:
onnx/onnx-tensorrtgithub.com/onnx/onnx-tensorrt
wang-xinyu/tensorrtxgithub.com/wang-xinyu/tensorrtx
1)伯恩legacy:如何使用TensorRT对训练好的PyTorch模型进行加速?
2)阿里云云栖号:高性能深度学习支持引擎实战——TensorRT
3) xcyuyuyu:深度学习模型部署(1)-Pytorch转TensorRT(C++版)
4)基于TensorRT量化部署YOLOV5s 4.0模型
5)基于TensorRT量化部署RepVGG模型
6)基于TensorRT完成NanoDet模型部署
2. OpenVINO
1)手把手教你使用OpenVINO部署NanoDet模型
2)OpenVINO部署Mask-RCNN实例分割网络
3)OpenVINO2021.4+YOLOX目标检测模型部署测试
4)OpenVINO 头部姿态评估网络应用演示
5)OpenVINO 基于人脸landmark检测实现眼睛疲劳/睡意检测
三、模型转换
1. ONNX
1)ONNX初探
2)ONNX 再探
3)YOLOv5x6模型来了! 同样支持CPU上ONNX部署与推理
相关回答2
视觉算法的工业部署和落地是没有你想得那么容易的,dirty work(手写c++, cuda各种前后处理) 全靠你对于上层模型算法的理解,以及不同hardware backend设计的深刻认知。如果要利用编译技术,你又得对深度学习编译器中如何在design space中搜optim的值和手写template来达到半自动优化有很好的掌握,你才能真正把一个paper里吹的“天花乱坠”的model部署到一个理论算力能跟得上的设备上( 当然,real-time和power是很重要的指标)
从工业界的角度想要快速出活,真正要自学的话:
深度学习框架方面,读一读caffe的源码和设计理念,看看其中的cpu/gpu上的op是怎么写的。
深度学习编译器方面,读一读tvm的源码和设计理念,看看编译器是怎么把一个dl model经过relay IR 再到 tvm IR,再到不同backend的codegen。以及编译器对计算图的常见优化(算子融合,data layout等)
深度学习模型部署方面,针对nvidia的gpu,看看cuda,tensorRT的document,自己尝试着把一个检测或者分割的模型部署到实验室的机器上。针对移动端的cpu,gpu,看看mnn,学习下mnn的code design。很多非常好的profiling,可视化工具。针对fpga设备,可以看看hls,opencl,verilog。毕竟直接拿现成的tool把model中的op翻译成hls,opencl代码还不是非常高效,很多东西还是直接写HDL所带来的speed up才更直接。这就和很多时候在arm架构的cpu上去优化算法,直接手写汇编所带来的提升更加直接。
从提升自己内功的角度来看,认真啃好:“编译器,计算机体系结构,并行计算,
编程语言设计,计算机系统,计算机网络,C++程序设计” 来说是更好不过了。
当然,一切的一切都得来源于你对上层DL算法都有了深入了解,知道每个layer是怎么跑的,输入的feature和输出的feature都是怎么存的,软件和算法层面都经历过怎样的加速,还有哪些加速是需要结合hardware来进行co-design的,你才能更好地把模型中的不同layer合理高效地部署到不同的hardware上。
给个结论:如果要真正想习得视觉算法的部署和落地,最快捷的方法,首先你需要有一个极为严格经常push你并且还活跃在代码一线的leader,然后还得有一个特定的业务场景和急迫的ddl。
相关回答3
个人认为算法部署落地这个方向是比较踏实务实的方向,相比“设计模型提出新算法”,对于咱们这种并不天赋异禀来说,只要你肯付出,收获是肯定有的(不像设计模型,那些巧妙的结果设计不出来就是设计不出来你气不气)。其实算法部署也算是开发了,不仅需要和训练好的模型打交道,有时候也会干一些粗活累活(也就是dirty work),自己用C++、cuda写算子(预处理、op、后处理等等)去实现一些独特的算子。算法部署最常用的语言是啥,当然是C++了,C++虽然复杂,但是由于优异的性能和各种特性(类对象、元编程等),被很多推理框架作为backbone的语言。
如果你想要自学但不知道学哪个,无从下手,哈哈恭喜你和当初的我一毛一样。不过你现在要是问,我还是不知道应该跟你怎么说,因为部署落地这方面你需要学习需要做的事情还是蛮多的。最好还是以项目作为驱动,或者找一些开源的推理部署框架练练手,找一两个开源项目玩玩,找找感觉,自己也就逐渐有方向了。
前面几位大佬提到的NCNN(优秀)、MNN(牛逼)等框架(还有很多框架这里不一一列举了额),是针对移动端进行部署进行优化的推理引擎,对ARM核进行了优化,如果你想做和移动端或者嵌入式端有关系的,可以看看这两个框架的源码,跑一两个demo找找感觉,另外还有Openvino和TensorRT,分别是对应cpu和gpu端的首推框架(想详细了解可以参考我之前的文章),可以找相关的项目去做做。
部署的流程一般就是:
训练一个模型,也可以是拿一个别人训练好的模型
针对不同平台生成的模型进行转换,也就是俗称的parse、convert,前端解释器
针对转化后的模型进行优化,这一步很重要,涉及到很多优化的步骤
将转化好的模型运行在特定的平台(嵌入端或者服务端)
需要掌握什么技术,学好C++很重要,起码能看懂各种关于部署精巧设计的框架(再列一遍:Caffe、libtorch、ncnn、mnn、tvm、openvino、tensorrt,不完全统计,我就列过我用过的)。当然并行计算编程语言也可以学一个,针对不同的平台而不同,可以先学学cuda,资料更多一些,熟悉熟悉并行计算的原理,对以后学习其他并行语言都有帮助。
部署和落地的重要性...当然是很重要呃,对于硬件公司来说,需要将深度学习算法部署到性能低到离谱的开发板上,因为成本能省就省,这时就需要部署了。在算法层面优化模型是一方面,但更重要的是从底层优化这个模型,这就涉及到部署落地方面的各个知识(手写汇编算子加速、算子融合等等);对于软件公司来说,我们往往需要将算法运行到服务器上,当然服务器可以是布满2080TI的高性能CPU机器,但是如果QPS请求足够高的话,需要的服务器数量也是相当之大的。这个要紧关头,如果我们的模型运行的足够快...可以省机器又可以腾一些buffer上新模型岂不很爽,这个时候也就需要优化模型了,其实优化手段也都差不多,只不过平台从arm等嵌入式端变为gpu等桌面端了。
系统的知识嘛,有是有,不过实际中都是用到啥再看啥,有项目在push你,个人建议直接上手项目,没有自己找找,按需学习。
这里简单总结下可以选择上手:
好用的开源推理框架:caffe NCNN、MNN、TVM
好用的开源推理框架:Openvino、TensorRT(infer不开源)
好用的开源服务器框架:triton-server
好用又不好用的编程语言:C++、CUDA、python
基础知识:计算机原理编译原理等
最近在搞triton server,将TensorRT作为inference后qps很夸张(这个是服务端部署),有兴趣可以找我一块交流。
再补充一点:之前没有详细提到TVM这个神奇的神经网络编译器,TVM最近也增加了对TensorRT转化的支持,可以无缝将relay的中间ir转化为TensorRT的算子op,从而实现两者之间的转换。
有关TVM可以看我之前的两篇文章:
一步一步解读神经网络编译器TVM(一)——一个简单的例子
一步一步解读神经网络编译器TVM(二)——利用TVM完成C++端的部署
总之,如果想要好好学习落地部署这一类知识,首先还是需要认真阅读一些优秀的开源框架的源码,了解其工作原理和内部实现。久而久之,慢慢尝试,对于落地部署这一块也就慢慢熟络起来了。
相关回答4
这题我会,上半年自己魔改了一个三维物体探测的网络,分别部署在了树莓派,Xilinx的FPGA板和谷歌的USB加速器上(论文是没有的,精度不好被毙了哈哈哈)。
这个方向还是很偏工程实践的。不同的硬件都有各自的工具链,比如服务器上的TF serving,N卡的TensorRT,Xilinx的VitisAI,谷歌的TF Lite,跨平台的TVM等等。做的时候很多时间都花在熟悉API上了。我是建议从最简单的TF Lite和TensorRT开始,之后可以一通百通。另外C++以及编译那一套技术得会。
个人感觉最大的困难一在工程优化。量化压缩如何做好,能不能剪枝,如何科学安排前处理,数据加载,推理,后处理的整个pipeline等等。现在很多工具都自动化了,但是需要人为干涉的地方还是很多。有时候还能整出玄学来。
二在那些硬件或工具链压根就不支持的算子,典型的就是Faster-RCNN的RoI-Pooling。遇到这种东西要么改网络(比如换成Yolo这种硬件友好的),要么硬着头皮自己手写kernel,魔改框架(比如TensorRT允许你这么做,前提是会写CUDA),要么耻辱地在CPU上用C++实现。
我自己栽在第二个上了。点云处理上那些天马行空的算子在设计的时候是不考虑硬件实现的,想部署在非CUDA硬件上简直搞死人。硬核的做法是在FPGA上手写IP Core,但是这条技能树想点出来也太漫长了。偷懒的做法就是丢一部分运算去CPU。这样你的数据就要在CPU和协处理器之间反复横跳。然而把Pipeline切的太碎之后,一来影响速度,二来量化又怎么做才好呢……
所以除非工程能力很强,为了避免头秃,尽量不要碰那些稀奇古怪的自定义算子。卷积卷卷卷就好。遇到算子名字里带deformable,dynamic,graph,point,spatial的,我劝你赶紧跑。
相关回答5
我是19年开始逐渐接触CV中的一些算法部署,在NCNN,TensorRT,OpenVINO,NNIE和华为Atlas系列的各个框架上都有一些部署经历。另外目前作为一个新的小型Pytorch推理框架MsnhNet的核心开发者之一,感觉自己是比较适合回答这个问题的。我个人将从两个方面回答这个问题,第一个是怎么学的问题,第二个是怎么学得更好的问题。
算法落地部署怎么学?
我这里就以Hisi 3519A嵌入式开发版(AI硬件和工具链叫NNIE)为例,描述一下我的学习经历。
首先,拿到一块开发版我们做CV相关算法部署的人员最关注的应该就是它的CPU以及AI硬件的浮点峰值,这可以让我们后面在部署我们某个算法,某个网络的时候做到心中有数,具体怎么算或者怎么查看可以参考:高洋:浮点峰值那些事儿。实际上,各个厂家的开发板都会提供对应的工具链和一些Benchmark数据。例如最近接触到的地平线旭日开发板就提供了包括Mobilenetv1/2/3,Yolov3/4/5,FCN/SegNet等常见视觉场景用到的网络的Benchmark数据,通过这些数据我们可以清楚的看到对于某个分辨率的图像跑特定网络的fps以及内存消耗等等。上面介绍的这些是我在拿到一个开发板进行部署之前关注的。
然后,在了解了硬件的一些关键信息之后,我们就可以花几天熟悉一下开发版对应工具链(也就是开发板的前向推理框架)和官方示例。一般来说特定的开发板使用厂商提供的推理框架性能应该是最高的,因为他分它们的AI芯片如NNIE一些通用框架(比如NCNN,MNN,Tegine等)是没有相关的底层加速实现的,例如nvida的显卡部署我们首选TensorRT,Intel的CPU首选OpenVINO,arm的cpu选NCNN或者MNN。一般来说特定开发版官方示例都提供了一些经典的视觉任务比如分类,检测使用它们的工具链进行部署的例子,我们要熟悉这些例子,特别关注一下如何Debug,内存释放等等。
再然后,我们就可以针对我们的某个任务在我们想要的硬件平台进行部署了。例如我要部署一个DeepSort框架到Hisi 3519A开发板上,首先我要保证我能在CPU上正常运行我们的DeepSort代码。然后将我们的DeepSort代码拆分成检测,Reid,卡尔曼滤波,帧匹配各个过程利用开发版的推理框架分别编码。我建议在部署一个工程的时候最好进行子任务的拆分,因为这样更容易让我们编码完成之后进行Debug的时候更容易找到是哪部分出了问题,不至于调试时长时间卡顿,降低工作效率。
最后,在我们部署完一个工程或者视觉任务以后我们最好再评估一下我们的网络耗时和Benchmark提供的数据是否能对应上,如果我们的某个网络性能明显低于Benchmark数据需要查看是否AI硬件被使用了,是否网络细节设计不合理等等。只有我们部署的项目的精度和速度在上线之后经过了大量数据验证,我们才能算完成了一个部署任务。
所以,我将自己部署一个工程的思路分享出来,这里面都是我认为应该学习的比较关键的点。希望能帮助到你。
参考文献
[1] https://zhuanlan.zhihu.com/p/277522145
[2] https://www.zhihu.com/question/428800593
编辑:黄飞
评论
查看更多