SNPE分析與評測 (2)

一、AIP Runtime

AIP (AI Processor) Runtime是Q6、HVX和HTA三者在執行模型時候的一層軟件抽象。
1、部署前提條件,讓模型在AIP上執行的前提條件:
1)看硬件設備是否支持(查看前文中支持SNPE處理器的硬件列表);
2)量化模型如caffe轉DLC格式時,需模型量化命令中帶–enable_hta參數(–enable_partitions參數可選,表示一部分即subnet在HTA上執行,一部分即subnet在HNN上執行,調度通過Q6。具體見下文)。 相比量化,這個過程會調用HTA編譯器,將編譯好的AIP執行部分以二進制形式嵌入到DLC中。
在設備上使用DSP和AIP(也是DSP)的runtime是動態加載的,從而實現SNPE與AIP runtime的通訊。如安卓需要將對應DSP的庫文件上傳到對應路徑,並export導入相關動態庫和設備位置的環境變量ADSP_LIBRARY_PATH,ADSP或CDSP(即無論DSP或AIP runtime)都需要該環境變量。

2 內部調度
SNPE在用AIP計算時,會通過加載DSP的動態庫從而與AIP runtime通訊,但調度管理器我想應該是Q6,通過Q6去管理使用HTA和HNN,下圖的結構描述可以看到Q6是Hexagon DSP上的一部分,Q6這部分應該都是軟件層面。
模型調用AIP執行過程中,SNPE Runtime上的AIP runtime會調用DSP執行器(executor,位於DSP動態庫中),DSP執行器來調用HTA和HVX來管理模型的執行:
• 當DSP executor遇到HTA模型(部分),會通過HTA Driver調用HTA來執行模型該部分subnet;
• 當DSP executor遇到HVX模型(部分),會通過Hexagon NN來調用HVX執行該部分subnet。
不同部分在DLC量化過程中將相應的描述信息寫到了量化後的DLC文件中,DSP executor遇到對應描述信息從而選擇對應硬件驅動調用執行。

3 模型執行
因量化時可以選是否啓用–hta_partitions以及對應的層數,若啓用得到的模型會包含subnet。在執行過程中遇到subnet會被AIP runtime打斷,根據subnet描述信息調用不同的硬件設備執行。
• HTA subnets:模型部分由HTA Compiler編譯,位於DLC文件得到HTA部分;
• HNN subnets : 模型剩餘部分可在DSP上調用Hexagon NN庫完成計算。
目前,AIP只支持單獨的HTA subnet + 單獨的HNN subnet。此外,Adding HTA sections小節中還提到其它限制:HTA和HNN subnets只支持層的單一輸入與輸出;HTA subnet需要從第一層開始。
根據HTA、HNN subnets的分片,可將模型執行分爲如下幾種情況:
1)HTA subnet:runtime識別出DLC中描述信息整個網絡都是HTA網絡,完成計算後,如有必要先做計算結果的轉換和反量化,再將輸出結果返回給ARM CPU;
2)HTA subnet + HNN subnet:根據量化時的參數選擇,模型的0-3層在HTA上計算,後面在HNN上計算。HTA subnet的輸出交給HNN subnet作爲輸入,最後將結果給ARM CPU(同樣,如有必要則需要反量化或轉換操作);
3)TA subnet + HNN subnet + CPU subnet:這部分不同在於,前兩個子網絡在AIP上計算,最後幾層交給ARM CPU完成計算。

二、SNPE性能與精度

下面是SNPE在小米MIX2上3個Runtime上做的benchmark。
• MIX2的SOC是驍龍835
• CPU:8核的大小核架構,1.9GHz+2.45GHz,大小核均爲 Kryo280架構;
◦ 大核心頻率2.45GHz,其大核心簇帶有2MB的L2 Cache;
◦ 小核心頻率1.9GHz,其小核心簇帶有1MB的L2 Cache;
• GPU爲Adreno 540@670MHz;
• DSP:Hexagon 690 DSP;
• AIP:無。
benchmark的4個模型有:AlexNet,GoogleNet,MobileNetV1/V2,SqueezeNetV1.1。一切參數根據CaffeModel和Prototxt基於SNPE提供的轉換或量化工具而來。
1、 AlexNet
在這裏插入圖片描述
• 正確性驗證,根據./models/alexnet/scripts/show_alexnet_classifications.py下的腳本,通過圖像真實類別與網絡分類類別比對,並非逐個featuremap單個元素值比較;
• fxp前綴:是使用snpe-dlc-quantize量化過的模型, 其量化策略採用8 bit的Tensorflow方式編碼(下面相同),使用snpe的默認量化方式(snpe提供兩種量化方式)。
2、GoogleNet
在這裏插入圖片描述
3、 MobileNetV1
在這裏插入圖片描述
4、 MobileNetV2
在這裏插入圖片描述
5、SqueezeNetV1.1
在這裏插入圖片描述
可以看出:
• 大模型DSP更有優勢,小模型GPU和DSP差不多。但不能忽略的是DSP跑的都是int8量化的模型,若非量化模型,可能執行前DSP會自動量化模型初始化會佔用一部分可被忽略的時間。
• 整體而言,GPU和DSP性能差不多,但GPU是float32或者float16,精度比只能跑int8的DSP要高一些,對檢測、分割(如超分辨率)任務應該GPU(能加載原始非量化的模型)表現更好。GPU跑相同模型,float32和float16的推理時間差別不大,而且本身float16也能滿足計算需要,在GPU情況下,可能選float32的模型更好;
• 高通對CPU的優化力度有限,畢竟DSP和GPU就是用來卸載CPU負載的,CPU與GPU/DSP相比,推理時間上慢了1到2個數量級;
• int8量化精度低。mobilenetv1和v2對於量化模型,無論是離線通過腳本轉換,或者DSP直接加載float32模型做的int8定點量化,分類模型的計算結果全都錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章