關(guān)于視覺(jué)算法工業(yè)部署及優(yōu)化學(xué)習(xí)路線的探討

極市導(dǎo)讀
?CV算法崗內(nèi)卷程度有目共睹,因而算法部署落地成為了一個(gè)較好的方向。那么,學(xué)習(xí)這方面的技能知識(shí),需要掌握那哪些工具技能?本文精選了三個(gè)知乎高質(zhì)量回答,希望能為你帶來(lái)幫助。>>加入極市CV技術(shù)交流群,走在計(jì)算機(jī)視覺(jué)的最前沿
作者丨ybai62868
深度學(xué)習(xí)框架方面,讀一讀caffe的源碼和設(shè)計(jì)理念,看看其中的cpu/gpu上的op是怎么寫(xiě)的。 深度學(xué)習(xí)編譯器方面,讀一讀tvm的源碼和設(shè)計(jì)理念,看看編譯器是怎么把一個(gè)dl model經(jīng)過(guò)relay IR 再到 tvm IR,再到不同backend的codegen。以及編譯器對(duì)計(jì)算圖的常見(jiàn)優(yōu)化(算子融合,data layout等) 深度學(xué)習(xí)模型部署方面,針對(duì)nvidia的gpu,看看cuda,tensorRT的document,自己嘗試著把一個(gè)檢測(cè)或者分割的模型部署到實(shí)驗(yàn)室的機(jī)器上。針對(duì)移動(dòng)端的cpu,gpu,看看mnn,學(xué)習(xí)下mnn的code design。很多非常好的profiling,可視化工具。針對(duì)fpga設(shè)備,可以看看hls,opencl,verilog。畢竟直接拿現(xiàn)成的tool把model中的op翻譯成hls,opencl代碼還不是非常高效,很多東西還是直接寫(xiě)HDL所帶來(lái)的speed up才更直接。這就和很多時(shí)候在arm架構(gòu)的cpu上去優(yōu)化算法,直接手寫(xiě)匯編所帶來(lái)的提升更加直接。
作者丨BBuf
謝邀,我是19年開(kāi)始逐漸接觸CV中的一些算法部署,在NCNN,TensorRT,OpenVINO,NNIE和華為Atlas系列的各個(gè)框架上都有一些部署經(jīng)歷。另外目前作為一個(gè)新的小型Pytorch推理框架MsnhNet的核心開(kāi)發(fā)者之一,感覺(jué)自己是比較適合回答這個(gè)問(wèn)題的。我個(gè)人將從兩個(gè)方面回答這個(gè)問(wèn)題,第一個(gè)是怎么學(xué)的問(wèn)題,第二個(gè)是怎么學(xué)得更好的問(wèn)題。
算法落地部署怎么學(xué)?
我這里就以Hisi 3519A嵌入式開(kāi)發(fā)版(AI硬件和工具鏈叫NNIE)為例,描述一下我的學(xué)習(xí)經(jīng)歷。
首先,拿到一塊開(kāi)發(fā)版我們做CV相關(guān)算法部署的人員最關(guān)注的應(yīng)該就是它的CPU以及AI硬件的浮點(diǎn)峰值,這可以讓我們后面在部署我們某個(gè)算法,某個(gè)網(wǎng)絡(luò)的時(shí)候做到心中有數(shù),具體怎么算或者怎么查看可以參考:高洋:浮點(diǎn)峰值那些事兒。實(shí)際上,各個(gè)廠家的開(kāi)發(fā)板都會(huì)提供對(duì)應(yīng)的工具鏈和一些Benchmark數(shù)據(jù)。例如最近接觸到的地平線旭日開(kāi)發(fā)板就提供了包括Mobilenetv1/2/3,Yolov3/4/5,F(xiàn)CN/SegNet等常見(jiàn)視覺(jué)場(chǎng)景用到的網(wǎng)絡(luò)的Benchmark數(shù)據(jù),通過(guò)這些數(shù)據(jù)我們可以清楚的看到對(duì)于某個(gè)分辨率的圖像跑特定網(wǎng)絡(luò)的fps以及內(nèi)存消耗等等。上面介紹的這些是我在拿到一個(gè)開(kāi)發(fā)板進(jìn)行部署之前關(guān)注的。
然后,在了解了硬件的一些關(guān)鍵信息之后,我們就可以花幾天熟悉一下開(kāi)發(fā)版對(duì)應(yīng)工具鏈(也就是開(kāi)發(fā)板的前向推理框架)和官方示例。一般來(lái)說(shuō)特定的開(kāi)發(fā)板使用廠商提供的推理框架性能應(yīng)該是最高的,因?yàn)樗炙鼈兊腁I芯片如NNIE一些通用框架(比如NCNN,MNN,Tegine等)是沒(méi)有相關(guān)的底層加速實(shí)現(xiàn)的,例如nvida的顯卡部署我們首選TensorRT,Intel的CPU首選OpenVINO,arm的cpu選NCNN或者M(jìn)NN。一般來(lái)說(shuō)特定開(kāi)發(fā)版官方示例都提供了一些經(jīng)典的視覺(jué)任務(wù)比如分類(lèi),檢測(cè)使用它們的工具鏈進(jìn)行部署的例子,我們要熟悉這些例子,特別關(guān)注一下如何Debug,內(nèi)存釋放等等。
再然后,我們就可以針對(duì)我們的某個(gè)任務(wù)在我們想要的硬件平臺(tái)進(jìn)行部署了。例如我要部署一個(gè)DeepSort框架到Hisi 3519A開(kāi)發(fā)板上,首先我要保證我能在CPU上正常運(yùn)行我們的DeepSort代碼。然后將我們的DeepSort代碼拆分成檢測(cè),Reid,卡爾曼濾波,幀匹配各個(gè)過(guò)程利用開(kāi)發(fā)版的推理框架分別編碼。我建議在部署一個(gè)工程的時(shí)候最好進(jìn)行子任務(wù)的拆分,因?yàn)檫@樣更容易讓我們編碼完成之后進(jìn)行Debug的時(shí)候更容易找到是哪部分出了問(wèn)題,不至于調(diào)試時(shí)長(zhǎng)時(shí)間卡頓,降低工作效率。
最后,在我們部署完一個(gè)工程或者視覺(jué)任務(wù)以后我們最好再評(píng)估一下我們的網(wǎng)絡(luò)耗時(shí)和Benchmark提供的數(shù)據(jù)是否能對(duì)應(yīng)上,如果我們的某個(gè)網(wǎng)絡(luò)性能明顯低于Benchmark數(shù)據(jù)需要查看是否AI硬件被使用了,是否網(wǎng)絡(luò)細(xì)節(jié)設(shè)計(jì)不合理等等。只有我們部署的項(xiàng)目的精度和速度在上線之后經(jīng)過(guò)了大量數(shù)據(jù)驗(yàn)證,我們才能算完成了一個(gè)部署任務(wù)。
所以,我將自己部署一個(gè)工程的思路分享出來(lái),這里面都是我認(rèn)為應(yīng)該學(xué)習(xí)的比較關(guān)鍵的點(diǎn)。希望能幫助到你。
算法落地部署怎么學(xué)得更好?
上面說(shuō)了怎么學(xué),這個(gè)只是基于一些已有的開(kāi)源推理框架或者開(kāi)發(fā)板對(duì)應(yīng)的工具鏈進(jìn)行開(kāi)發(fā)。如果你想學(xué)得更好,我就不班門(mén)弄斧了。如果感興趣可以搜索一下知乎的 AI移動(dòng)端優(yōu)化 這個(gè)專(zhuān)欄,從里面圈圈蟲(chóng),章小龍,白牛,梁德澎等做優(yōu)化部署的大佬們的文章可以看出,想要學(xué)得更好得嘗試自己去做一些算法優(yōu)化的活。
因?yàn)椋惴ú渴鹩玫降母鱾€(gè)框架的核心技術(shù)就是針對(duì)特定硬件平臺(tái)的底層優(yōu)化,例如NCNN針對(duì)Arm平臺(tái)使用Neon匯編優(yōu)化,針對(duì)X86使用SSE/AVX2優(yōu)化,針對(duì)GPU使用Vulkan優(yōu)化等等。當(dāng)然我知道一個(gè)人的能力是有限的,如果你僅僅是感興趣而已,那么你可以選擇只學(xué)習(xí)某個(gè)平臺(tái)比如Arm ?CPU的優(yōu)化技術(shù)。
我也是處于一邊學(xué),一邊做的狀態(tài)。個(gè)人認(rèn)為NCNN是這個(gè)世界上最好的優(yōu)化框架,如果你基礎(chǔ)已經(jīng)夠了(例如你了解了Neon匯編,知道卷積的計(jì)算過(guò)程)可以參考NCNN源碼進(jìn)行學(xué)習(xí),如果你不太了解可以參考上面那個(gè)專(zhuān)欄或者在GiantPandaCV的AI移動(dòng)端優(yōu)化專(zhuān)欄學(xué)習(xí)一些基礎(chǔ)知識(shí),先入門(mén)然后我們一起學(xué)得更好。
雖然我是GiantPandaCV的運(yùn)營(yíng)者,但這個(gè)回答真不是為了打廣告,另外非常感謝其它回答提到了本公眾號(hào),受寵若驚。
再留一個(gè)我們正在建設(shè)的知識(shí)網(wǎng)站吧,地址:http://www.giantpandacv.com/
作者丨OLDPAN
一看這個(gè)題目的關(guān)鍵字“部署”和“落地”就深深吸引到了我 。想想當(dāng)年(去年)秋招,神仙打架諸神黃昏的CV崗,大神們的簡(jiǎn)歷上都是充滿頂會(huì)比賽top1等等,我不擅長(zhǎng)算法(雖然我是算法工程師),簡(jiǎn)歷上也就只能簡(jiǎn)單水水top10的比賽,寫(xiě)一些水水的項(xiàng)目。唯一感覺(jué)和大佬們簡(jiǎn)歷稍微不同的也就落地和部署這塊了。看了前面幾位大佬的回答,感觸頗深,所以我也來(lái)簡(jiǎn)單聊聊(大部分其他回答已經(jīng)說(shuō)了,我再補(bǔ)充些吧)。
個(gè)人認(rèn)為算法部署落地這個(gè)方向是比較踏實(shí)務(wù)實(shí)的方向,相比“設(shè)計(jì)模型提出新算法”,對(duì)于咱們這種并不天賦異稟來(lái)說(shuō),只要你肯付出,收獲是肯定有的(不像設(shè)計(jì)模型,那些巧妙的結(jié)果設(shè)計(jì)不出來(lái)就是設(shè)計(jì)不出來(lái)你氣不氣)。其實(shí)算法部署也算是開(kāi)發(fā)了,不僅需要和訓(xùn)練好的模型打交道,有時(shí)候也會(huì)干一些粗活累活(也就是dirty work),自己用C++、cuda寫(xiě)算子(預(yù)處理、op、后處理等等)去實(shí)現(xiàn)一些獨(dú)特的算子。算法部署最常用的語(yǔ)言是啥,當(dāng)然是C++了,C++雖然復(fù)雜,但是由于優(yōu)異的性能和各種特性(類(lèi)對(duì)象、元編程等),被很多推理框架作為backbone的語(yǔ)言。
如果你想要自學(xué)但不知道學(xué)哪個(gè),無(wú)從下手,哈哈恭喜你和當(dāng)初的我一毛一樣。不過(guò)你現(xiàn)在要是問(wèn),我還是不知道應(yīng)該跟你怎么說(shuō),因?yàn)椴渴鹇涞剡@方面你需要學(xué)習(xí)需要做的事情還是蠻多的。最好還是以項(xiàng)目作為驅(qū)動(dòng),或者找一些開(kāi)源的推理部署框架練練手,找一兩個(gè)開(kāi)源項(xiàng)目玩玩,找找感覺(jué),自己也就逐漸有方向了。
前面幾位大佬提到的NCNN(優(yōu)秀)、MNN(牛逼)等框架(還有很多框架這里不一一列舉了額),是針對(duì)移動(dòng)端進(jìn)行部署進(jìn)行優(yōu)化的推理引擎,對(duì)ARM核進(jìn)行了優(yōu)化,如果你想做和移動(dòng)端或者嵌入式端有關(guān)系的,可以看看這兩個(gè)框架的源碼,跑一兩個(gè)demo找找感覺(jué),另外還有Openvino和TensorRT,分別是對(duì)應(yīng)cpu和gpu端的首推框架(想詳細(xì)了解可以參考我之前的文章),可以找相關(guān)的項(xiàng)目去做做。
部署的流程一般就是:
訓(xùn)練一個(gè)模型,也可以是拿一個(gè)別人訓(xùn)練好的模型
針對(duì)不同平臺(tái)生成的模型進(jìn)行轉(zhuǎn)換,也就是俗稱(chēng)的parse、convert,前端解釋器
針對(duì)轉(zhuǎn)化后的模型進(jìn)行優(yōu)化,這一步很重要,涉及到很多優(yōu)化的步驟
將轉(zhuǎn)化好的模型運(yùn)行在特定的平臺(tái)(嵌入端或者服務(wù)端)
需要掌握什么技術(shù),學(xué)好C++很重要,起碼能看懂各種關(guān)于部署精巧設(shè)計(jì)的框架(再列一遍:Caffe、libtorch、ncnn、mnn、tvm、openvino、tensorrt,不完全統(tǒng)計(jì),我就列過(guò)我用過(guò)的)。當(dāng)然并行計(jì)算編程語(yǔ)言也可以學(xué)一個(gè),針對(duì)不同的平臺(tái)而不同,可以先學(xué)學(xué)cuda,資料更多一些,熟悉熟悉并行計(jì)算的原理,對(duì)以后學(xué)習(xí)其他并行語(yǔ)言都有幫助。
部署和落地的重要性...當(dāng)然是很重要呃,對(duì)于硬件公司來(lái)說(shuō),需要將深度學(xué)習(xí)算法部署到性能低到離譜的開(kāi)發(fā)板上,因?yàn)槌杀灸苁【褪。@時(shí)就需要部署了。在算法層面優(yōu)化模型是一方面,但更重要的是從底層優(yōu)化這個(gè)模型,這就涉及到部署落地方面的各個(gè)知識(shí)(手寫(xiě)匯編算子加速、算子融合等等);對(duì)于軟件公司來(lái)說(shuō),我們往往需要將算法運(yùn)行到服務(wù)器上,當(dāng)然服務(wù)器可以是布滿2080TI的高性能CPU機(jī)器,但是如果QPS請(qǐng)求足夠高的話,需要的服務(wù)器數(shù)量也是相當(dāng)之大的。這個(gè)要緊關(guān)頭,如果我們的模型運(yùn)行的足夠快...可以省機(jī)器又可以騰一些buffer上新模型豈不很爽,這個(gè)時(shí)候也就需要優(yōu)化模型了,其實(shí)優(yōu)化手段也都差不多,只不過(guò)平臺(tái)從arm等嵌入式端變?yōu)間pu等桌面端了。
系統(tǒng)的知識(shí)嘛,有是有,不過(guò)實(shí)際中都是用到啥再看啥,有項(xiàng)目在push你,個(gè)人建議直接上手項(xiàng)目,沒(méi)有自己找找,按需學(xué)習(xí)。
這里簡(jiǎn)單總結(jié)下可以選擇上手:
好用的開(kāi)源推理框架:caffe NCNN、MNN、TVM
好用的不開(kāi)源推理框架:Openvino、TensorRT
好用的開(kāi)源服務(wù)器框架:triton-server
好用又不好用的編程語(yǔ)言:C++、CUDA、python
基礎(chǔ)知識(shí):計(jì)算機(jī)原理 編譯原理等
最近在搞triton server,將TensorRT作為inference后qps很夸張(這個(gè)是服務(wù)端部署),有興趣可以找我一塊交流。
回答鏈接:
https://www.zhihu.com/question/428800593/answer/1560898134
推薦閱讀

