视觉算法的工业部署及落地方面的技术知识,怎么学?

新机器视觉

共 5455字,需浏览 11分钟

 · 2022-07-12

点击下方卡片,关注“新机器视觉”公众号

重磅干货,第一时间送达

编辑:深度学习技术前沿

【导读】目前人工智能技术在工业视觉领域的应用逐渐火热起来,但是高校关于具体算法的工业场景应用的技术却涉及较少,那么如何快速的学习以及成功地将视觉算法应用到工业实际场景并完成模型的部署等一系列工作呢?本文整合了知乎上的优秀回答,希望能帮助到大家!

作者:OLDPAN
链接:https://www.zhihu.com/question/428800593/answer/1560898134
来源:知乎

一看这个题目的关键字“部署”和“落地”就深深吸引到了我 。想想当年(去年)秋招,神仙打架诸神黄昏的CV岗,大神们的简历上都是充满顶会比赛top1等等,我不擅长算法(虽然我是算法工程师),简历上也就只能简单水水top10的比赛,写一些水水的项目。唯一感觉和大佬们简历稍微不同的也就落地和部署这块了。看了前面几位大佬的回答,感触颇深,所以我也来简单聊聊(大部分其他回答已经说了,我再补充些吧)。


个人认为算法部署落地这个方向是比较踏实务实的方向,相比“设计模型提出新算法”,对于咱们这种并不天赋异禀来说,只要你肯付出,收获是肯定有的(不像设计模型,那些巧妙的结果设计不出来就是设计不出来你气不气)。其实算法部署也算是开发了,不仅需要和训练好的模型打交道,有时候也会干一些粗活累活(也就是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

  • 基础知识:计算机原理 编译原理等


作者:幻想家皮霸霸丶
链接:https://www.zhihu.com/question/428800593/answer/1560594742
来源:知乎


本人是20届的渣渣硕士,刚刚上研的时候,和大多数“内卷儿”一样,我也很幸运被老板安排了“计算机视觉&图像处理&模式识别”的研究方向。屁颠屁颠的开始看cvpr,iccv的paper。回想起过去,那时的我年幼无知,在地平线的一台四卡服务器上非root权限一步一步的装好了caffe,开始跑起来了openpose的训练,原本以为我的炼丹生涯就这样正式开始了,没想到怎么都复现不到paper上的精度,当时对multi-scale的测试看半天还不懂怎么回事。经常被leader push进度,真心觉得自己菜得扣脚,很多时候都想放弃炼丹。一步一步,在工业界,从单帧图像上的目标检测,语义分割,实例分割,到人体姿态估计。再迁移到视频上的目标检测,语义分割,关键点检测。以及最后毕业论文的多目标跟踪。算是把整个工业界能用的cv模型都摸了一遍,领域内的经典paper也能做到信手拈来?起码,各种开源的检测框架(商汤的mmdet, Facebook 最早的mask rcnn,detectron1 (caffe2), detectron2 (pytorch), gluonCV)都用过并完成了自定义的项目,其中的源码也都是“随心”看过一遍,但是自己太蠢了,写不到这个水平的python和cuda代码,以及每次用完,对很多细节的设计只能感慨作者的牛逼。


2018年:一个偶然的机会,我开始看mxnet的源码(当时还是使用的symbol接口),看着看着,觉得这玩意和caffe代码好像,很多地方都是从caffe那里复用的,设计也比caffe灵活不少,毕竟粒度更细,安装也更加友好。我一步一步的学习mxnet官网上放出来的所有有关framework设计的知识,包括从“怎样设计一个高效的data loader”,“怎么样设计一个engine把框架中的所有组件schedule起来”,“以及怎么样更好的优化memory和减少数据IO”,“包括怎么样设计一套面向任何等级用户都友好的API”。原本以为自己掌握了设计DL framework的大体奥义,发现还是想太多了,在面对让自己从头实现一个框架的时候,我也只会用python定义class 包来包去,性能什么的就别说了,我的菜还是没办法改变,最终还是想自己的愚蠢低下了头。。。


2019年:又一个偶然的机会,我开始在大洋彼岸某个村的CSL做summer research,项目的需求是为他们实验室的一款深度学习编译器(target为fpga)去写一套opencl的backend。什么是编译器?什么是backend?什么是fpga?什么是opencl?一连串的问题对傻逼的我来说,一切都是未知。扒开这套编译器的codebase,我发现大部分代码都是从tvm那里借鉴来的, 于是,我又走上了tvm的学习之路,从tvm的design到完整的编译flow,包括底层的c++到与上层的python交互,以及autoTVM(那会Ansor还没出来)全部走了一遍。对于一个根本没玩过硬件开发板的我,这一切在当时来看是非常困难的,还好实验室有给力的Ph.D.们,在他们的配合下,我也成功把基于xilinx和intel fpga的opencl backend全部添加了上去。那会的我,觉得自己算是掌握了 编译器的大体奥义。可最终我还是想自己的傻逼低下了头,涉及到传统编译器中的llvm的设计,codegen的很多细节,我还是一无所知。。。回国后,又加入了某条的mlsys组继续做编译器,我随后又在glow的基础上,为硬件组的自研芯片MVP开发profile-guided的quantization工具链以及针对网络的每个layer开发了方便debug的可视化工具。


2020年:又又一个偶然的机会,被安排到了一家创业公司做intern,刚刚入职第一天就要求在2080ti上去优化一个超分4k视频。对于一行cuda代码都没写过的我来说,那是不敢想象的,项目负责人每两天催一次进度,连给我配tensorRT,学习如何写高性能cuda代码的机会都不给。我每天都活在自责与痛苦中,为什么我这么菜?这么垃圾啊?待我整完了从pytorch模型到onnx模型转换,再到trt的编译,以及为各种不支持的operator写完tensorRT的plugin,再到关于image的前后处理全部手写cuda kernel去和opencv硬碰硬。遗憾的是,整个inference还是没有跑起来,当我用尽了我当时力所能及的cuda的debug工具(cuda-gdb,cuda-memcheck,...)最终发现还是败在了模型的多张帧输入没办法做到CPU和GPU上的memory 对齐。就这次偶然的机会,我竟然学会了tensorRT的部署。仗着这个经验,我又把组里其他模型:OCR,简化版超清视频到TX2,NX,AGX,智能相机等设备上,用尽了各种能优化的框架ncnn,mnn (其中包括针对工业级的二阶段的OCR模型,det用tensorRT,reg用mnn的vulkan后端联合开多线程优化在TX2上达到real-time)也熟悉了很多不同的backend和指令集架构。原本以为,我已经掌握了深度学习CV模型落地的要领,直到这几天接到了要在华为的atlas 500板子上部署算法团队自己整的一套faster rcnn的二阶段检测模型以及tracking,几乎所有套件都要从头开始手写c++(借助FFmpeg对RTSP拉流,解码,udp报文传送,前处理,rpn生成proposals,proposal变anchor,anchor到bbox,kalman filter, hungary, track ID筛选 ...),我才发现自己的无知,模型部署真的是个大坑。



以上内容吹逼归吹逼,且当个故事听听就好。


其实我想表达的是 视觉算法的工业部署和落地是没有你想得那么容易的,dirty work(手写c++, cuda各种前后处理) 全靠你对于上层模型算法的理解,以及不同hardware backend设计的深刻认知。如果要利用编译技术,你又得对深度学习编译器中如何在design space中搜optim的值和手写template来达到半自动优化有很好的掌握,你才能真正把一个paper里吹的“天花乱坠”的model部署到一个理论算力能跟得上的设备上( 当然,real-time和power是很重要的指标)


从工业界的角度想要快速出活,真正要自学的话:


  1. 深度学习框架方面,读一读caffe的源码和设计理念,看看其中的cpu/gpu上的op是怎么写的。


  2. 深度学习编译器方面,读一读tvm的源码和设计理念,看看编译器是怎么把一个dl model经过relay IR 再到 tvm IR,再到不同backend的codegen。以及编译器对计算图的常见优化(算子融合,data layout等)


  3. 深度学习模型部署方面,针对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。

    

本文仅做学术分享,如有侵权,请联系删文。

—THE END—
浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报