<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          視覺算法的工業(yè)部署及落地方面的技術(shù)知識(shí),怎么學(xué)?

          共 7288字,需瀏覽 15分鐘

           ·

          2024-07-26 21:01


          點(diǎn)擊上方新機(jī)器視覺”,選擇加"星標(biāo)"或“置頂”

          重磅干貨,第一時(shí)間送達(dá)

          轉(zhuǎn)自:知乎

          鏈接:https://www.zhihu.com/question/428800593

          聲明:僅做學(xué)術(shù)分享,侵刪

          如題,本人21屆渣渣研三碩士,實(shí)習(xí)、項(xiàng)目和應(yīng)聘方向都是圖像算法,cv算法崗內(nèi)卷程度有目共睹,看了不少業(yè)內(nèi)前輩的建議,說轉(zhuǎn)算法部署落地方向比較好(個(gè)人在實(shí)習(xí)期間也感覺到算法模型部署和落地的重要性),本想趁著春招還沒來趕緊學(xué)習(xí)下,可苦于實(shí)際中接觸不到這方面的前輩或者系統(tǒng)的知識(shí),自學(xué)起來如無頭蒼蠅,無從下手。所以想問問前輩們,如何學(xué)習(xí)這方面的技能知識(shí),需要掌握那哪些工具技能?

          作者:ybai62868
          https://www.zhihu.com/question/428800593/answer/1560594742
          2017年 比你大一屆,本人也是20屆的渣渣碩士,剛剛上研的時(shí)候,和大多數(shù)“內(nèi)卷兒”一樣,我也很幸運(yùn)被老板安排了“計(jì)算機(jī)視覺&圖像處理&模式識(shí)別”的研究方向。屁顛屁顛的開始看cvpr,iccv的paper。

          回想起過去,那時(shí)的我年幼無知,在地平線的一臺(tái)四卡服務(wù)器上非root權(quán)限一步一步的裝好了caffe,開始跑起來了openpose的訓(xùn)練,原本以為我的煉丹生涯就這樣正式開始了,沒想到怎么都復(fù)現(xiàn)不到paper上的精度,當(dāng)時(shí)對(duì)multi-scale的測試看半天還不懂怎么回事。經(jīng)常被leader push進(jìn)度,真心覺得自己菜得扣腳,很多時(shí)候都想放棄煉丹。

          一步一步,在工業(yè)界,從單幀圖像上的目標(biāo)檢測,語義分割,實(shí)例分割,到人體姿態(tài)估計(jì)。再遷移到視頻上的目標(biāo)檢測,語義分割,關(guān)鍵點(diǎn)檢測。以及最后畢業(yè)論文的多目標(biāo)跟蹤。算是把整個(gè)工業(yè)界能用的cv模型都摸了一遍,領(lǐng)域內(nèi)的經(jīng)典paper也能做到信手拈來?起碼,各種開源的檢測框架(商湯的mmdet, Facebook 最早的mask rcnn,detectron1 (caffe2), detectron2 (pytorch), gluonCV)都用過并完成了自定義的項(xiàng)目,其中的源碼也都是“隨心”看過一遍,但是自己太蠢了,寫不到這個(gè)水平的python和cuda代碼,以及每次用完,對(duì)很多細(xì)節(jié)的設(shè)計(jì)只能感慨作者的牛逼。

          2018年一個(gè)偶然的機(jī)會(huì),我開始看mxnet的源碼(當(dāng)時(shí)還是使用的symbol接口),看著看著,覺得這玩意和caffe代碼好像,很多地方都是從caffe那里復(fù)用的,設(shè)計(jì)也比caffe靈活不少,畢竟粒度更細(xì),安裝也更加友好。我一步一步的學(xué)習(xí)mxnet官網(wǎng)上放出來的所有有關(guān)framework設(shè)計(jì)的知識(shí),包括從“怎樣設(shè)計(jì)一個(gè)高效的data loader”,“怎么樣設(shè)計(jì)一個(gè)engine把框架中的所有組件schedule起來”,“以及怎么樣更好的優(yōu)化memory和減少數(shù)據(jù)IO”,“包括怎么樣設(shè)計(jì)一套面向任何等級(jí)用戶都友好的API”。

          原本以為自己掌握了設(shè)計(jì)DL framework的大體奧義,發(fā)現(xiàn)還是想太多了,在面對(duì)讓自己從頭實(shí)現(xiàn)一個(gè)框架的時(shí)候,我也只會(huì)用python定義class 包來包去,性能什么的就別說了,我的菜還是沒辦法改變,最終還是想自己的愚蠢低下了頭。。。

          2019年又一個(gè)偶然的機(jī)會(huì),我開始在大洋彼岸某個(gè)村的CSL做summer research,項(xiàng)目的需求是為他們實(shí)驗(yàn)室的一款深度學(xué)習(xí)編譯器(target為fpga)去寫一套o(hù)pencl的backend。

          什么是編譯器?什么是backend?什么是fpga?什么是opencl?一連串的問題對(duì)傻逼的我來說,一切都是未知。扒開這套編譯器的codebase,我發(fā)現(xiàn)大部分代碼都是從tvm那里借鑒來的, 于是,我又走上了tvm的學(xué)習(xí)之路,從tvm的design到完整的編譯flow,包括底層的c++到與上層的python交互,以及autoTVM(那會(huì)Ansor還沒出來)全部走了一遍。

          對(duì)于一個(gè)根本沒玩過硬件開發(fā)板的我,這一切在當(dāng)時(shí)來看是非常困難的,還好實(shí)驗(yàn)室有給力的Ph.D.們,在他們的配合下,我也成功把基于xilinx和intel fpga的opencl backend全部添加了上去。那會(huì)的我,覺得自己算是掌握了 編譯器的大體奧義??勺罱K我還是想自己的傻逼低下了頭,涉及到傳統(tǒng)編譯器中的llvm的設(shè)計(jì),codegen的很多細(xì)節(jié),我還是一無所知。。。

          回國后,又加入了某條的mlsys組繼續(xù)做編譯器,我隨后又在glow的基礎(chǔ)上,為硬件組的自研芯片MVP開發(fā)profile-guided的quantization工具鏈以及針對(duì)網(wǎng)絡(luò)的每個(gè)layer開發(fā)了方便debug的可視化工具。

          2020年又又一個(gè)偶然的機(jī)會(huì),被安排到了一家創(chuàng)業(yè)公司做intern,剛剛?cè)肼毜谝惶炀鸵笤?080ti上去優(yōu)化一個(gè)超分4k視頻。對(duì)于一行cuda代碼都沒寫過的我來說,那是不敢想象的,項(xiàng)目負(fù)責(zé)人每兩天催一次進(jìn)度,連給我配tensorRT,學(xué)習(xí)如何寫高性能cuda代碼的機(jī)會(huì)都不給。我每天都活在自責(zé)與痛苦中,為什么我這么菜?這么垃圾???待我整完了從pytorch模型到onnx模型轉(zhuǎn)換,再到trt的編譯,以及為各種不支持的operator寫完tensorRT的plugin,再到關(guān)于image的前后處理全部手寫cuda kernel去和opencv硬碰硬。

          遺憾的是,整個(gè)inference還是沒有跑起來,當(dāng)我用盡了我當(dāng)時(shí)力所能及的cuda的debug工具(cuda-gdb,cuda-memcheck,...)最終發(fā)現(xiàn)還是敗在了模型的多張幀輸入沒辦法做到CPU和GPU上的memory 對(duì)齊。就這次偶然的機(jī)會(huì),我竟然學(xué)會(huì)了tensorRT的部署。仗著這個(gè)經(jīng)驗(yàn),我又把組里其他模型:OCR,簡化版超清視頻到TX2,NX,AGX,智能相機(jī)等設(shè)備上,用盡了各種能優(yōu)化的框架ncnn,mnn (其中包括針對(duì)工業(yè)級(jí)的二階段的OCR模型,det用tensorRT,reg用mnn的vulkan后端聯(lián)合開多線程優(yōu)化在TX2上達(dá)到real-time)也熟悉了很多不同的backend和指令集架構(gòu)。

          原本以為,我已經(jīng)掌握了深度學(xué)習(xí)CV模型落地的要領(lǐng),直到這幾天接到了要在華為的atlas 500板子上部署算法團(tuán)隊(duì)自己整的一套faster rcnn的二階段檢測模型以及tracking,幾乎所有套件都要從頭開始手寫c++(借助FFmpeg對(duì)RTSP拉流,解碼,udp報(bào)文傳送,前處理,rpn生成proposals,proposal變anchor,anchor到bbox,kalman filter, hungary, track ID篩選 ...),我才發(fā)現(xiàn)自己的無知,模型部署真的是個(gè)大坑。

          以上內(nèi)容吹逼歸吹逼,且當(dāng)個(gè)故事聽聽就好。

          其實(shí)我想表達(dá)的是 視覺算法的工業(yè)部署和落地是沒有你想得那么容易的,dirty work(手寫c++, cuda各種前后處理) 全靠你對(duì)于上層模型算法的理解,以及不同hardware backend設(shè)計(jì)的深刻認(rèn)知。如果要利用編譯技術(shù),你又得對(duì)深度學(xué)習(xí)編譯器中如何在design space中搜optim的值和手寫template來達(dá)到半自動(dòng)優(yōu)化有很好的掌握,你才能真正把一個(gè)paper里吹的“天花亂墜”的model部署到一個(gè)理論算力能跟得上的設(shè)備上( 當(dāng)然,real-time和power是很重要的指標(biāo))

          從工業(yè)界的角度想要快速出活,真正要自學(xué)的話:

          1. 深度學(xué)習(xí)框架方面,讀一讀caffe的源碼和設(shè)計(jì)理念,看看其中的cpu/gpu上的op是怎么寫的。
          2. 深度學(xué)習(xí)編譯器方面,讀一讀tvm的源碼和設(shè)計(jì)理念,看看編譯器是怎么把一個(gè)dl model經(jīng)過relay IR 再到 tvm IR,再到不同backend的codegen。以及編譯器對(duì)計(jì)算圖的常見優(yōu)化(算子融合,data layout等)

          3. 深度學(xué)習(xí)模型部署方面,針對(duì)nvidia的gpu,看看cuda,tensorRT的document,自己嘗試著把一個(gè)檢測或者分割的模型部署到實(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代碼還不是非常高效,很多東西還是直接寫HDL所帶來的speed up才更直接。這就和很多時(shí)候在arm架構(gòu)的cpu上去優(yōu)化算法,直接手寫匯編所帶來的提升更加直接。

          從提升自己內(nèi)功的角度來看,認(rèn)真啃好:“編譯器,計(jì)算機(jī)體系結(jié)構(gòu),并行計(jì)算,

          編程語言設(shè)計(jì),計(jì)算機(jī)系統(tǒng),計(jì)算機(jī)網(wǎng)絡(luò),C++程序設(shè)計(jì)” 來說是更好不過了。

          當(dāng)然,一切的一切都得來源于你對(duì)上層DL算法都有了深入了解,知道每個(gè)layer是怎么跑的,輸入的feature和輸出的feature都是怎么存的,軟件和算法層面都經(jīng)歷過怎樣的加速,還有哪些加速是需要結(jié)合hardware來進(jìn)行co-design的,你才能更好地把模型中的不同layer合理高效地部署到不同的hardware上。

          給個(gè)結(jié)論:如果要真正想習(xí)得視覺算法的部署和落地,最快捷的方法,首先你需要有一個(gè)極為嚴(yán)格經(jīng)常push你并且還活躍在代碼一線的leader,然后還得有一個(gè)特定的業(yè)務(wù)場景和急迫的ddl。


          作者:Rand Xie
          https://www.zhihu.com/question/428800593/answer/1559994521
          算是有過部署圖像算法到嵌入式設(shè)備的經(jīng)驗(yàn)吧. 個(gè)人經(jīng)驗(yàn)來看, 需要建立起兩個(gè)方面的能力, 一個(gè)是圖像算法的能力, 另一個(gè)則是工程能力 (看著很像廢話).

          圖像算法方面, 需要知道可以怎么優(yōu)化算法去減少運(yùn)算量, 或者在latency budget不夠的情況下, 如何在算法performance和latency之間取舍. 這就要求對(duì)傳統(tǒng)圖像算法和深度學(xué)習(xí)算法都有理解.

          工程方面, 需要掌握一門compiled language, 最好是C++, 因?yàn)槟阈枰フジ捎布男阅? 這里說的掌握C++, 不是說去掌握所有的奇技淫巧, 而是能深入底層原理, 更精確得控制每一行代碼的執(zhí)行. 展開點(diǎn)來說, 這就涉及到計(jì)算機(jī)科學(xué)最基礎(chǔ)的操作系統(tǒng), compiler, 體系結(jié)構(gòu)等等.

          當(dāng)然, 單純學(xué)這些知識(shí)很難堅(jiān)持, 最好是邊做項(xiàng)目邊深入了解. 如果能聯(lián)系到學(xué)校的教授, 參與相關(guān)的課題, 這就最好了. 如果沒有這樣的機(jī)會(huì), 也可以考慮參與一些開源項(xiàng)目, 比如TVM之類的.


          作者:機(jī)器學(xué)習(xí)入坑者
          https://www.zhihu.com/question/428800593/answer/1564651870
          拿到過高通的終端側(cè)人工智能創(chuàng)新獎(jiǎng),主要做的是手機(jī)端的APP。

          大規(guī)模的工業(yè)部署我暫時(shí)沒接觸過,只做過簡單的落地應(yīng)用。

          既然說到怎么學(xué),我覺得首先是在自己的服務(wù)器上打好基礎(chǔ)。如果在訓(xùn)練模型的時(shí)候不知道模型的每一層是什么操作,那么部署的時(shí)候肯定會(huì)出現(xiàn)很多問題,比如端側(cè)不支持某個(gè)算子。

          其次,需要學(xué)習(xí)一些模型壓縮和量化的知識(shí)。在部署的時(shí)候需要考慮模型的計(jì)算量是否滿足部署平臺(tái)的限制,目前很多針對(duì)mobile的論文提到了降低計(jì)算量的網(wǎng)絡(luò)設(shè)計(jì)。

          最后,需要學(xué)習(xí)Java或者c++之類的語言,一般訓(xùn)練模型用python,而部署的時(shí)候需要采用別的語言。pytorch和tensorflow都含有好幾種語言的版本,可以多逛逛官網(wǎng)學(xué)習(xí)一下。


          作者:韓天嘯
          https://www.zhihu.com/question/428800593/answer/1566173600

          核心點(diǎn)

          視覺算法的部署和落地,最一般考慮的"速度"和"精度"的權(quán)衡。下面的部署流程中簡單介紹一些。

          其次,通常的實(shí)際系統(tǒng)具體的情況,比如輸入輸出(攝像頭的分辨率、攝象頭角度變換),是否要處理遮擋,網(wǎng)絡(luò)條件(需不需要本地做控制,還是只需要傳結(jié)果)。

          還有是解決一些bad case,比如過曝、失焦。

          一般流程

          1. 數(shù)據(jù)處理 有無標(biāo)注好的數(shù)據(jù),如果有標(biāo)注數(shù)據(jù),數(shù)據(jù)增廣之后是否可以讓模型很好的收斂;如果沒有標(biāo)注數(shù)據(jù),找一找公開帶標(biāo)注的數(shù)據(jù)集里面有沒有可以遷移學(xué)習(xí)的。
          2. 高效訓(xùn)練 因?yàn)橹竽P蛪嚎s損失精度,就要提前在訓(xùn)練時(shí)盡可能把精度達(dá)到更高、縮短訓(xùn)練時(shí)間。比如大batch size和Linear scaling、warm up、Zero γ 、no bias decay等的方法。同時(shí)優(yōu)先考慮mobilenet等backbone,看精度是否在要求內(nèi)。聽說,有條件的會(huì)搜索一下網(wǎng)絡(luò)結(jié)構(gòu)。

          3. 推理引擎優(yōu)化 使用推理引擎來進(jìn)行優(yōu)化,TVM、Nccn、tensorRT、Tensorflow-lite、Tengine、Xilinx vitis 、Huawei ruyi。各家的流程主要有一些 剪枝、量化、蒸餾等。量化中也會(huì)重新訓(xùn)練一部分矯正數(shù)據(jù)集,達(dá)到更好的效果。但量化訓(xùn)練(量化感知訓(xùn)練)之后的網(wǎng)絡(luò)權(quán)重就和推理引擎耦合起來了,所以放在了推理引擎優(yōu)化來講。但其實(shí)訓(xùn)練后量化不管有沒有經(jīng)過矯正損失精度還是蠻多的。所以知識(shí)蒸餾看起來還是蠻不錯(cuò)的,看到paddle放出來過一個(gè)結(jié)果,8位定點(diǎn)數(shù)量化的學(xué)生模型不僅參數(shù)來下降了70%+,精度還提了1%。

          4. 加速硬件選取 可以看看roofline模型,軟件優(yōu)化的trick之后,硬件的加速也很重要。使用并行加速硬件(GPU、FPGA)或者異構(gòu)計(jì)算(CPU+FPGA、CPU+加速器)可以有效提高推理速度,但成本也增加的比較多。比較實(shí)際的辦法,是復(fù)用這些加速器,一拖多、但帶寬的限制也比較大。看到一些文章在offloading或model partition,希望早日有好的工具release。

               5 .上線前測試評(píng)估  Fuzz測試工具

          在實(shí)際使用過程中因?yàn)橐恍┰?,譬如使用圖像分類應(yīng)用時(shí),當(dāng)鏡頭模糊、光照不足、下雨大霧、拍攝角度等等情況下,實(shí)際輸入的數(shù)據(jù)與訓(xùn)練模型時(shí)的標(biāo)準(zhǔn)數(shù)據(jù)集有一些不同。在這種情況下,模型可能出現(xiàn)模型精度答復(fù)下降。而在某些極端情況下,可能出現(xiàn)未知的推理失誤,引入安全性問題。對(duì)模型的評(píng)估和魯棒性測試,可以有效減少未知的安全風(fēng)險(xiǎn),測試工具通過對(duì)數(shù)據(jù)集進(jìn)行增強(qiáng),如色差、翻轉(zhuǎn)、模糊等,自動(dòng)化產(chǎn)生測試樣例。評(píng)估圖像的覆蓋率指標(biāo)以及精度下降。測試模型出現(xiàn)擾動(dòng)的情況下,模型精度(Accuracy)下降程度以及神經(jīng)元激活程度(Coverage Rate)

          實(shí)踐

          1. FPGA LOW POWER OBJECT DETECTION
          DAC會(huì)議每年會(huì)舉辦一個(gè)system design contest,分為兩個(gè)賽道,分別在FPGA和embedded GPU上處理無人機(jī)拍攝的小目標(biāo)檢測數(shù)據(jù)集。比賽通過分析實(shí)際下板運(yùn)行的速度、精度和功耗三個(gè)指標(biāo)來衡量最后的得分。

          其中的一個(gè)開源項(xiàng)目SpooNN值得一看。SpooNN的作者是由ETH(蘇黎世聯(lián)邦理工學(xué)院)系統(tǒng)組。使用軟硬件聯(lián)合優(yōu)化的方式在FPGA上優(yōu)化了squeezeNet,分別在2018、2019比賽上獲得第二名、第三名。在網(wǎng)絡(luò)結(jié)構(gòu)方面,SpooNN將squeezeNet的fire 模塊改成half fire模塊,少使用一層的卷積層。

          thanks to:DREU at Brown University
          Thanks to:DAC 2019低功耗目標(biāo)檢測系統(tǒng)設(shè)計(jì)挑戰(zhàn)賽:GPU、FPGA組雙冠軍方案解讀
          給出一個(gè)gihub鏈接,大伙可以先自行去看看,由于代碼都是release的,而且可以重新訓(xùn)練,所以相對(duì)有參考價(jià)值。照著我上面講的流程梳理一下~

          作者:范沅
          https://www.zhihu.com/question/428800593/answer/1563707806
          就這么點(diǎn)時(shí)間,看看c++吧,不用學(xué)的太好,知道怎么樣高效處理數(shù)據(jù)流,寫寫前后置處理,指針啊矩陣計(jì)算啊啥的。
          再看看tfx之類的東西吧,看看怎么調(diào)度的。
          優(yōu)化算子啥的,常見模型都跑不好是庫有問題吧,看看老黃的tensorrt吧,大概了解了解。
          看看招啥人吧,有啥要求,面向面試編程。

           End 

          聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)術(shù)交流之目的。文章版權(quán)歸原作者所有。如有不妥,請(qǐng)聯(lián)系刪除。


          瀏覽 86
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩欧美视频清纯中文字幕 | 色婷婷成人做爰A片免费看网站 | 亚洲 日韩 欧美 国产 | 五月丁香色婷婷基地 | 操逼操|