引言
如何做AI視覺應用的嵌入式部署分為硬件選型,軟件框架和優化的選擇,模型算法的設計三大板塊。
AI視覺應用云端部署VS嵌入式端部署
大家其實對于AI深度學習已經很熟悉了,我們在服務器上就可以用GPU或者Tensorflow來做訓練,訓練完之后要做推理計算。推理最簡單的一個方法就是放在云端,用云端推理的板卡比如NVIDIA的T4或者國產NPU做推理計算。在云端,推理計算是廣泛使用的。百度的API或者Face++等云端API是在前端探測數據,把視頻圖像傳回云端,云端做完處理返回結果,這就是云端的部署。
嵌入式部署其實和云端部署很相似,只不過是在最后把模型發送到了嵌入式設備上(手機和無人機),那它是在手機和無人機上來做推理計算,這就是我們認為嵌入式部署的AI使用模型情況。
1.1
嵌入式視覺典型應用
列舉幾個典型的嵌入式視覺應用。
第一個是輔助駕駛或者自動駕駛,在駕駛的車上會有AI處理加速的模塊,應用了AI算法。在這種場景下做AI的嵌入式部署主要是為了環境的感知、目標的檢測追蹤或者在無人機上可能會做視覺或激光的SLAM,為了在嵌入式端實現高實時性。
第二個是手機的美顏和AR。預覽和編輯操作都是在手機本地完成的,它其實是完成了更好的交互性,給用戶的體驗性更好。從另一方面對于手機APP公司來說,是更加節省成本的,比如你編輯一段視頻,這里的AR操作返回給服務器來做,成本是很高的。
第三個是邊緣智能化盒子,優勢是兼容了已有的攝像頭。在安防場景和智能社區里已有很多傳統的攝像頭,但使用邊緣智能化盒子,能夠處理多路且兼容已有攝像頭,從節省成本上來說也是一個好的選擇。
嵌入式AI硬件選型
2.1
嵌入式AI的硬件是怎么選型的?
第一個常見的類型是工控機,用X86的CPU加上NVIDIA的GPU,這種好處就是生態分層成熟。如果是純CPU的應用,深度學習一類的應用算力可能會偏弱。
第二個是NVIDIA的TX2和Nano系列,NVIDIA對于嵌入式的AI有專門的這種SoC的芯片,也出了很多板卡,相對成本低,算力也比服務器低。GPU支持了FP16和FP32的精度,對于嵌入式部署是很有幫助的,意味著模型精度和服務器上訓練的精度幾乎能保持一致。
服務器都是用32位做訓練,如果說其他的NPU轉換成Int8的話,必然會造成精度的損失。唯一的弱點就是主CPU偏弱,就只是ARM Cortex-A57的四核或多核。如果放在無人機上使用,無人機應用很多是很復雜的,不是深度學習或GPU就能加速的,這里用ARM Cortex-A57可能就會存在問題。這實際上是NVIDIA的嵌入式系列面臨的一些挑戰,主要是要評估組合性能是不是好。
2.2
AMD APU
目前AMD的處理器用的偏少。它的CPU比較好,能夠對標到i7主屏比較高的CPU ,GPU也不錯,比TX2的性能要提高2倍,整體性能還可以,也可以利用X86上面的生態,存在的問題是它的編程需要OpenCL,這比CUDA要弱,就是它存在深度學習的部署門檻。另外就是它這款盒子的功耗偏高,比NVIADA的TX2或Nano高一倍,但性能加強了。利用AMD的APU盒子放在駕校車上是比較好用的。
2.3
主流嵌入式AI開發板
大家也知道具備NPU的SoC芯片其實是越來越多的,之前是以加速卡的形式來存在,比如一個USB的NPU加速棒插在已有設備上。如果你是做嵌入式的部署,不要選擇這種分離式的USB加速設備,因為它穩定性較差,另外數據傳輸比較麻煩。盡量選擇集成在一起的帶NPU的SoC,這是第一選擇。目前帶NPU的SoC也是越來越多的,廠商也越來越多。在華為芯片被禁之前,市面上主要的選擇都是華為系列,大概有四款帶NPU的,從低端的0.5T-1T算力,2T-4T算力都有覆蓋。它的好處是成本相比較低,比NVIDIA的同樣算力成本要低很多;第二個是它的ISP挑的比較好。下面的都是可以替換華為系列的,可以選擇瑞芯微的RK3399、RK1808、RK3588或者全志等。
目前的NPU基本都是8bit量化,在8bit量化下模型精度是如何保證的,工具鏈的成熟度是一個問題,除此之外就是算力的選擇。如果說想替換華為芯片,要求其他選型是性能超過2T算力,ISP不錯,性價比不錯的SoC選擇目前是比較少的,至少在去年底來看還沒有。
第三塊常見的開發板工作是用FPGA來做AI計算,主要用在工業場景下,實時性更好。比如在野外、工業級的無人機或者研究所機構會要求國產FPGA達到毫秒級左右的實時性。這部分的FPGA基本上是要自研AI的加速軟核。圖中是我們自研的一個AI加速軟核,它已經支持了很多常見的FPGA,AI加速軟盒基本上結構都是這樣。
這部分IP是一個軟核的IP,部署在FPGA資源上,核心部分有一個計算陣列,完成卷積操作。
如果NPU公司卷積只做一個3x3,就意味著這NPU是用不了的,雖然核心部分加速的很快,但是其他部分必須也是搬到NPU上才能整體的做嵌入式的部署和加速,所以就會需要有相應的部署模塊緩沖數據。
數據搬運需要把它從內存搬運到芯片的緩存上,控制邏輯相當于發指令的,控制調度、計算部件是怎么執行的,基本上NPU都是這幾個部件組成的,具體的差別是在于并行度的方式不同,可能加了不同的加速部件來得到更好的性能。對于NPU來說第一個要考查是卷積性能到底怎么樣,第二個算子是不是能支持的更多,支持的算子更多意味著在CPU端所跑的算子相對少一些而且支持的模型更多。
這個是我們實際用FPGA做了一些項目,做無人機,檢測情況和可見光的處理,都是比較常用的。
在IoT級別的AI操作,我舉的例子是法國的一家叫Greenwave公司,做的是無人機的一個自主的飛行控制。在性能方面差很多,基本上只能做到每秒18幀的處理速度,計算在100M Hz的功耗頻率和6.5fps下整體的功耗是40mW,是非常低的功耗了。IoT級別還會使用在做智能門鈴的場景下,以前的門鈴只是用紅外線檢查是否有人過來,這個準確度不高。如果是加一個智能喚醒模塊在門鈴上,就可以提高判斷的準確性,這是IoT級別的智能識別圖像。
嵌入式AI軟件性能優化
3.1
前向推理框架
實際上在軟件的推理框架上已經有非常多的選擇了,有NVIDIA的TensorRT,Tensorflow lite,騰訊的NCNN,TNN,阿里MNN等等。圖中是Tensorflow lite整體的圖,從訓練后的Tensorflow lite的網絡模型中間會有一個轉換步驟,轉換到Tensorflow lite支持的網絡結構,然后再嵌入到手機APP里。
前后推理框架的核心觀點有五個。第一個是設備管理,比如現在的嵌入式SoC有GPU或者NPU,推理框架能支持這些設備。第二個是模型管理,單模型和多模型是不同的管理方式。第三個是內存管理和儲存格式,要考慮是以優化內存占用優先還是以性能優先。第四個是層級融合,Barch Norm層可以和卷積層合并,當算子層中之間融合的越多,節省仿存的操作來發揮更多的效率。第五個是實現方法選擇,這塊需要框架要來處理,根據不同的輸入特性來選擇不同的實現算子優化的方法,來達到最高的效率。
3.2
性能評價
看一下這個性能對比的例子,從算子優化上其實就可以做到不少的性能提升,在算子上針對卷積算子做了優化,在同樣的一個嵌入式的平臺,獲得了一倍的性能提升,硬件是完全相同的,就靠軟件來做。
以目前來說,性能差距已經非常低了。圖中數據柱狀線代表的是時間,測了很多不同的模型。比如ARM Cortex-A76和ARM Cortex-A55,可以看到差距非常小。
我的結論是如果AI部署是用ARM的CPU,對于小模型哪個方便用哪個,對于大模型實際上是有NPU存在,可以直接用NPU來做,跟推理框架的成熟度關系不大。
3.3
NPU的性能優化
NPU的部署應該怎么做或者NPU的性能優化能做什么,現在的NPU公司存在兩類情況,一類是完全封死的狀態,通過Caffe做模型轉化,很多算子不支持,要回到CPU來做。
這種情況的轉化模型成本很高,遇到一個新的模型需要算法工程師進行手動切分,很少有工具去劃分哪些算子是NPU支持的,轉化起來就比較麻煩。另一類是類似GPU編程接口,就是提供一個基礎的加速部件,可以做算子的定制化,好處是網絡進展較快。當出現特殊算子的時候,不用再放回CPU來做,可以在加速卡NPU上做,這是一個比較好的趨勢。
嵌入式AI算法模型
4.1
深度學習模型
針對嵌入式AI的深度學習模型大概有四塊,包含ARM Soc CPU、lnt8量化、模型剪枝和新的網絡結構。ARM Soc CPU來跑深度學習模型,卷積在10層卷積或以下,就是小模型才能流暢的跑視覺應用。
4.2
Int8量化精度
不管是在CPU還是NPU都要跑量化的模型,發揮著很重要的速度作用。量化的基本原理是如何用定點數來表示浮點數,或者更高的效率表示浮點數。基本的公式是整數值減去零點值得出的值乘以刻度值,得出一個浮點數,簡單的量化就是這樣處理的。
在處理量化的時候需要注意,第一個轉化成量化是Per layer量化還是Per Channel量化,Per layer量化代表著輸出的全部用一個量化參數,Per Channel量化代表著每一個Channel都是不同的,量化的系數也是不同的。目前來說如果想達到Int8量化比較好的精度,要求模型的權重參數要做Per Channel量化。Feature map一般都是用Per layer量化,成本相對較低,硬件實現也更容易。
第二個需要注意的是刻度值怎么選擇,一種是支持2的冪,轉化的乘法通過定點數的移位操作當成浮點,硬件容易實現,但精度值差。另一種就是支持任意浮點數,精度值高。
第三個注意的是對稱量化和非對稱量化,是和零點值相關的。對稱量化的零點是不能動的,好處是更容易實現,壞處是數據分布有問題。
第四個注意的是QAT,量化感知的訓練。實際上就是把量化數據過程加入進去,讓權重參數和Feature map的浮點數來更容易被量化。
最后一個就是有些模型的量化精度是很難做,需要看大家對于量化精度調點的要求。不同意調點的就需要做混合來保證精度。
4.3
模型壓縮技術-剪枝法
模型壓縮有兩種常用的,一種是非結構化的模型壓縮,靈活程度和稀疏度更高,目前的NPU、FPGA或者加速卡沒辦法去識別權重的零值。結構化的剪枝就是去除Channel或layer,需要識別出哪些是重要的通道,哪些是不重要的。
當剪枝和量化綜合在一起時可能會遇到新的問題。lnt8的量化是進一步的信息壓縮,從浮點到定點再到信息損失;剪枝是去除Channel或layer,也是對信息進行壓縮,當兩部分結合時,有效信息被去除很多,導致精度大幅下降,有可能最后直接崩掉。在實際做的過程中,剪枝和量化需要迭代分開做,這樣才能保證精度。
總結
整體上在AI的嵌入式應用里需要硬件的選型,軟件框架和優化的選擇,模型算法的設計,剪枝和量化的綜合來處理完成,還需要考慮不同的AI部署應用有不同的模型需求。
以上,感謝澎峰科技創始人張先軼在2021全球機器學習技術大會上的主題分享。
轉載自 | 博覽Boolan
編輯:jq
-
嵌入式
+關注
關注
5092文章
19176瀏覽量
307595 -
cpu
+關注
關注
68文章
10901瀏覽量
212962 -
AI
+關注
關注
87文章
31494瀏覽量
270258 -
NPU
+關注
關注
2文章
290瀏覽量
18773
原文標題:談談嵌入式視覺的幾個典型應用
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論