前言
關于視覺算法部署及落地,知乎上有一個較為熱的話題。本文對相關回答等進行了整理,供大家參考。
最近關注的一個知乎問題:視覺算法的工業部署及落地方面的技術知識,怎么學?
感覺落地這塊坑確實挺多,入職以來一直在做視覺算法落地這一塊的東西,感覺有必要系統的整理一些落地部署相關的資料。
鏈接: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
編輯:黃飛
評論