葉亞峰,王 昕,寇金橋,李墈婧
(中國航天科工集團第二研究院 七〇六所,北京 100854)
人工智能算法模型在實際的應用場景中對算力的需求呈指數級增長,相比之下,硬件平臺的發展受摩根定律的約束和限制,其性能優化的速度遠遠跟不上需求的增長。邊緣計算(edge computing)[1,2]是一種新型的網絡計算模型,它將原有依賴于服務器的計算與存儲資源部署遷移到互聯網的邊緣,緊鄰終端設備和數據采集單元,擁有更快的時間響應速率,更高的數據處理效率。邊緣計算集網絡、計算和存儲為一體,對于低延時、高帶寬、高可靠性應用場景有很大的優勢。
隨著國產化芯片的不斷發展,出現了很多,如華為昇騰、百度昆侖、寒武紀、瑞星微等人工智能算法推理加速的邊緣計算設備。相對于云端服務器,邊緣計算設備存在著算力不足、數據存儲量小(內存資源少、處理器性能不高、功耗受限)等缺點,為了讓深度學習算法可以部署到邊緣計算設備并高效運行,研究人員從不同的角度進行研究。比如輕量化網格結構[3,4],在保持模型精度,不影響其性能的基礎上減少模型參數的數量和復雜度,對神經網絡輕量化和小型化處理;模型壓縮[5]是另一種維度,其方法包括量化、剪枝、知識蒸餾、低秩分解等[6-8]。
針對邊緣計算中國產化異構智能加速硬件種類繁多,算法模型在不同硬件平臺上運行環境的部署過程繁瑣、上手難度大等問題,本文設計并實現了一種智能算法模型轉換工具,可以將開源框架下訓練的深度學習算法模型快速轉換為國產化智能加速硬件平臺支持的模型文件,實現算法模型快速部署和高效運行。
人工智能算法的應用包括訓練和推理兩部分,訓練框架囊括深度神經網絡(deep neural networks,DNN)訓練所需要的基礎庫和工具,深度學習框架簡化了模型訓練的過程,但不同的深度學習框架訓練出來的模型格式各不相同。TensorFlow框架訓練得到的算法模型的文件格式是.pb[9],Caffe框架訓練后的算法模型的文件包括模型文件.prototxt和參數文件.caffemodel,MXNet框架訓練得到的算法模型文件格式是模型參數文件.params和模型結構文件.json,PyTorch框架訓練得到的算法模型文件格式是.pth等。不同硬件加速平臺所支持的模型也不盡相同,比如百度昆侖芯片需要將算法模型轉換為model.pdmodel/model.pdparams格式文件進行推理加速,華為昇騰芯片需要將算法模型轉換為.om格式文件進行推理加速[10],國產FPGA需要將算法模型轉化為.bin格式文件進行推理加速等。
針對以上問題,相關學者做了以下研究:文獻[11]將基于開源框架訓練的YOLO v4算法模型,通過昇騰310提供的模型轉換工具-昇騰張量編譯器(ascend tensor compiler,ATC),實現模型轉換,將轉換后的.om離線模型直接部署到昇騰310處理器上進行邊緣計算,實現了電力視覺巡檢;文獻[12]設計并實現了一種基于Hi35XX SoC的智能處理系統,其中AI加速模塊(neural network infe-rence engine,NNIE)是海思芯片專門針對神經網絡特別是深度學習卷積神經網絡進行加速處理的硬件單元,但NNIE配套軟件僅支持Caffe框架,因此在其它深度學習框架訓練的算法模型需要轉化為Caffe框架支持的模型;文獻[13]針對智能算法模型之間差異大導致的部署效率低的問題,設計并實現了一種基于Docker的輕量級智能算法模型部署平臺,將算法模型打包為Docker鏡像,并利用鏡像倉庫托管鏡像,數據庫管理模型部署信息,實驗驗證了其平臺的可行性和高效性;文獻[14]針對因算法模型和硬件平臺分離使算法模型部署復雜度高的問題,設計了一種以矩陣運算為核心的神經網絡加速器,與CPU結合構成了一個SoC系統,并實現了一套快速部署工具鏈,包括系統初始化、加速器驅動和內存管理等API,為SoC提供了軟件支持,在ResNet18的測試中,能效比大大提高。
綜上所述,針對不同的智能加速平臺所支持的算法模型文件格式不盡相同的問題,研究學者給出了相應的解決方案,但仍存在功能單一、適配性能差的問題。本文設計并實現的智能算法模型轉換工具,可以將主流算法模型轉換為om文件、pdmodel/pdparams文件、bin文件等,實現在華為昇騰CANN、百度飛槳(PaddlePaddle)和國產FPGA不同硬件平臺上的推理加速。
智能算法模型轉換工具基于QT實現界面化設計,重點針對主流的Tensorflow、Pytorch、Caffe等框架的智能算法模型進行轉換,得到可以在國產嵌入式異構加速硬件平臺(如華為昇騰、百度昆侖、國產FPGA等)運行的模型,從而實現算法模型在不同硬件平臺下的統一化部署和推理加速。
智能算法模型轉換工具的設計與實現主要包括界面設計和接口設計兩部分,其中界面設計包括:硬件平臺選擇、參數設置、開始轉換、結果顯示4個模塊;接口設計包括:模型轉換參數傳輸、模型轉換、結果回傳3個模塊。模型轉換工具是開放的,留有可擴展接口,可根據實際需求進行功能擴展,其設計框架如圖1所示。

圖1 智能算法模型轉換工具設計框架
界面設計使用基于C++&QT開源圖形框架實現,通過QT內置的槽函數機制,將界面組件(按鈕、文本框、下欄菜單等)與后臺功能形成映射關系,為用戶提供外部接口以對軟件進行操作。
接口設計中模型轉換參數傳輸模塊將用于設置的參數傳輸到后端,模型轉換模塊根據用戶定義的參數基于相應異構平臺模型轉換程序將開源框架訓練的模型文件轉為目標平臺支持的模型文件,通過多線程和線程交互技術實現界面交互和數據傳輸,將轉換結果回傳到界面顯示。
模型轉換工具的用戶界面包括一個主界面和3個不同的子界面,主界面上半部分由一個選擇下拉窗口和兩個按鈕組成,下半部分為一個文本顯示框,如圖2所示。“目標平臺選擇”按鈕可通過下拉窗口選定不同的目標平臺,本文設計了3個目標平臺分別是華為CANN平臺、百度PaddlePaddle平臺和國產FPGA平臺。“模型轉換參數輸入”按鈕可以根據用戶需求選擇目標平臺彈出對應的子窗口,供用戶完成模型轉換參數的設定;“開始轉換”按鈕可以執行模型的轉換;“轉換結果顯示”文本框將顯示模型轉換的進程信息和最終的轉換結果。

圖2 智能算法模型轉換工具界面
其具體的設計過程如下:
主界面設計如圖2(a)所示,目標平臺選擇使用了QComboBox實現平臺類型的選擇;模型轉換參數輸入和開始轉換均使用QPushButton作為按鈕控件,使用時點擊按鈕便可觸發相關功能;轉換結果顯示使用了QTextEdit顯示模型轉換過程的信息。
華為CANN平臺子界面設計如圖2(b)所示,輸入模型路徑和輸出名使用QTextEdit作為顯示窗口顯示相關信息;輸入類型、輸入名、寬、高、batch_size、通道數以及輸出節點信息使用QLineEdit控件以輸入相關信息;模型選擇和參數保存使用QPushButton按鈕控件進行點擊操作,使用時點擊按鈕便可觸發相關功能;芯片類型選擇則是使用QComboBox以選擇對應的芯片種類。
百度PaddlePaddle平臺子界面設計如圖2(c)所示,輸入模型路徑和選擇輸出路徑使用QTextEdit作為顯示窗口顯示相關信息;源模型類型使用QComboBox以選擇對應的源模型種類;選擇和保存使用QPushButton按鈕控件進行點擊操作,使用時點擊按鈕便可觸發相關功能。
國產FPGA平臺子界面設計如圖2(d)所示,轉換模式使用QComboBox以選擇對應的轉換;選擇輸入模型和選擇輸出路徑使用QTextEdit作為顯示窗口顯示相關信息;保存使用QPushButton按鈕控件進行點擊操作。
(1)華為昇騰平臺
本文設計的華為昇騰平臺模型轉換功能是基于華為公司針對AI場景推出的異構計算架構體系(compute architecture for neural networks,CANN)下昇騰張量編譯器(ascend tensor compiler,ATC)實現的,它可以將開源框架的網絡模型轉換為昇騰AI處理器支持的.om格式離線模型[15],其功能框架如圖3所示,在模型轉換過程中,ATC工具會將在開源深度學習框架下訓練好的網絡模型轉化為統一中間圖IR Graph,然后通過Graph Optmizer實現圖準備、圖拆分、圖優化、圖編譯等操作,對原始的深度學習模型進行進一步的調優,得到離線模型.om文件,從而實現算法模型在華為平臺下的快速部署、高效運行。

圖3 華為CANN模型轉換工具功能結構
1)模型轉換流程
模型轉換流程如下:①安裝CANN軟件包,獲取相關路徑下的ATC工具;②將準備好待轉換的算法模型,保存在任意路徑下;③配置模型轉換參數及輸出節點信息并保存;④調用編譯器程序,生成華為昇騰平臺支持的.om文件。
2)模型轉換參數說明
模型轉換參數說明如下:
輸入模型路徑:選擇待轉換的通用框架模型;
輸出名:存放轉換后的離線模型的路徑以及文件名;
輸入類型:選擇模型輸入數據排列方式,一般Caffe默認為NCHW,TensorFlow默認為NHWC;
芯片類型:模型轉換時指定芯片版本,如昇騰310、昇騰910;
輸入名:模型訓練時的輸入名稱(字符串類型);
Batch_size:模型推理時的數據批處理量;
寬和高:設置輸入圖片的動態分辨率參數,用于執行推理時,每次處理圖片寬和高不固定的場景;
通道數:輸入圖片的通道數;
輸出節點信息:指定輸出節點。
(2)百度飛槳平臺
本文設計的百度平臺模型轉換功能是基于是飛槳(PaddlePaddle)生態下的模型轉換工具X2 Paddle實現的,它用于將開源深度學習框架的模型遷移至飛槳框架,支持開源框架訓練的模型一鍵轉為飛槳的預測模型,并可以使用PaddleInference、PaddleLite進行CPU、GPU、NPU和ARM等設備的部署[16]。X2 Paddle支持Caffe、TensorFlow、ONNX等模型直接轉化為Paddle Fluid可加載的預測模型,考慮到不同訓練框架得到的模型文件API、預測方式的差異,X2 Paddle還提供三大主流框架API的差異比較,通過深入了解API實現方式降低模型遷移帶來的損失,其功能結構如圖4所示。

圖4 百度PaddlePaddle模型轉換工具功能結構
1)模型轉換流程
模型轉換流程如下:①安裝依賴環境,導入“x2paddle.convert”模塊;②準備好待轉換的開源深度學習框架模型;③輸入待轉換模型路徑和轉換后的模型保存路徑;④運行x2 Paddle轉換工具得到model.pdmodel/model.pdparams模型文件。
2)模型轉換參數說明[17]
模型轉換參數說明如下:
framework:源模型類型 (TensorFlow、Caffe、onnx);
prototxt:當framework為Caffe時,該參數指定caffe模型的proto文件路徑;
weight:當framework為Caffe時,該參數指定caffe模型的參數文件路徑;
save_dir:指定轉換后的模型保存目錄路徑;
model:當framework為TensorFlow/onnx時,該參數指定TensorFlow的pb模型文件或onnx模型路徑;
caffe_proto(可選):由caffe.proto編譯成caffe_pb2.py文件的存放路徑,當存在自定義Layer時使用,默認為None。
(3)國產FPGA平臺
本文設計的國產FPGA模型轉換工具是基于IP2工具鏈實現的,它可以將代碼編譯過程和運行過程解耦,硬件后端只需要輕量級的運行文件,通過過程調用即可在后端實現前向推理,并完成硬件性能的自動調優,解決了主流深度學習框架不支持FPGA的問題。
國產FPGA模型轉換工具包含用戶模式和測試模式,其功能結構如圖5所示。用戶模式是給用戶使用開啟的,在用戶模式下,onnx解析工具可以將用戶模型(.onnx)文件進行解析生成和編譯得到的輸入文件和模型數據,編譯器輸入變量解析腳本,通過IP2編譯器得到國產FPGA平臺可以支持的權重文件Weights.bin和模型文件Parameters.bin。測試模型在對IP核進行測試的過程中使用的,在測試模式下,onnx解析工具對模型文件進行解析的同時,隨機比對數據生成工具會產生測試數據和.prototxt文件,工具會自動生成golden模型,然后生成測試IP核 的比對文件。

圖5 國產FPGA模型轉換工具功能結構
其中onnx解析過程是國產FPGA模型轉換工具的核心,主要功能:通過onnx的圖機制遍歷模型的各個節點,獲得節點的算子類型(op),可以得到該層節點的參數,各層節點參數組合成prototxt文件;通過卷積、BN(或全連接)節點的Tensor,可以得到存儲的weight和bias文件,生成對應的.mat文件;通過Tensor的GetQuanParam方法可以得到各節點的量化參數信息,依次得到各節點的bias、input、output、weight這4個Tensor的位寬和小數位。
1)模型轉換流程
模型轉換流程如下:①onnx模型解析工具讀取用戶的onnx模型結構和權重(已量化),生成編譯器需要的模型結構文件(.prototxt文件)、模型參數文件(.mat文件)和模型配置文件;②調用編譯器程序,完成模型的.hex文件生成和.bin文件轉換。
2)模型轉換參數說明
模型轉換參數說明如下:
轉換模式:可選res18_imagenet、YOLOv3、ResNet50等模型類型;
選擇輸入模型:輸入待轉換的模型文件所在路徑,一般為.onnx類型;
選擇輸出路徑:輸出轉換后的模型文件。
模型轉換軟件內部接口設計為該轉換工具重要部分,外部接口主要基于內部接口進行封裝,用于用戶與軟件的交互,內部接口設計包括對應平臺模型轉換參數傳輸函數設計、對應平臺模型轉換函數設計、模型轉換結果回傳函數設計。
對應平臺模型轉換參數傳輸函數set_args是對應平臺模型轉換參數傳輸接口,輸入/輸出數據元素包括:string modelpath、string modelname、string parameters。打開模型轉換軟件,手動輸入對應參數,將參數在進程之間傳輸,輸入正確的轉換參數,成功后會將用戶設定的轉換參數,傳給異構平臺的模型轉換或編譯工具,錯誤返回ERROR。其局部數據元素的數據類型和數據表示形式見表1。

表1 模型轉換參數傳輸函數局部數據元素
對應平臺模型轉換函數model_convert是對應平臺模型轉換接口,輸入輸出數據元素是待轉換的模型和轉換后對應平臺的模型,手動輸入對應參數后,點擊模型轉換按鈕調用模型轉換程序,成功后在指定路徑下生成轉換好的模型文件,錯誤返回ERROR。其局部數據元素的數據類型和數據表示形式見表2。

表2 對應平臺模型轉換函數局部數據元素
模型轉換結果回傳函數send_res是模型轉換結果回傳接口,模型轉換開啟后,模型轉換過程中自動觸發該函數,模型轉換成功后在主界面“轉換結果顯示”窗口中輸出模型轉換命令行的打印信息。其局部數據元素的數據類型和數據表示形式見表3。

表3 模型轉換結果回傳函數局部數據元素
多線程技術一方面可以優化程序的設計邏輯,另一方面可以提高系統的響應速率,為了充分利用系統資源,提高系統的并行度,本文在模型轉換工具的設計中引入多線程技術。在模型轉換工具中,主要包括模型轉換和界面程序兩個任務,模型轉換模塊是在界面程序外部獨立運行的,即模型轉換過程和界面程序實際是運行在兩個不同的進程中的,因此需要將模型轉換進程和界面交互進程建立連接,并使其可以進行數據通信。其設計框架如圖6所示。

圖6 模型轉換工具多線程設計框架
本文設計的模型轉換工具界面包括主界面和多個子界面組成,模型轉換的過程中,計算機CPU和內存占用率大,多線程技術可以保證主界面和每個子界面可以流程運行,每個模型轉換模塊可以在不同的線程中同時進行,這些線程互相獨立,互不干擾。
在模型轉換過程中,該工具會先根據需要通過主線程使用QThread建立若干個子線程,然后把用戶設置好的模型轉換參數和算法模型文件數據同步給子線程,在子線程中通過QProcess函數開啟外部獨立的模型轉換進程如ATC轉換進程、X2paddle轉換進程、FPGA模型編譯進程等,轉換完成后,外部進程會將所有過程信息傳回給子線程,子線程通過主線程進行結果顯示。
在PyTorch框架下得到訓練好的ResNet50算法模型,并導出onnx格式的模型文件resnet50.onnx,通過本文設計的模型轉換工具將模型分別轉換為華為昇騰平臺可以運行的resnet50.om模型文件,百度昆侖平臺可以運行的model.pdmodel/model.pdparams模型文件以及國產FPGA平臺可以運行的parameters.bin/weights.bin模型文件,驗證了該工具的可行性。以艦船目標識別為例驗證了模型轉換工具的性能,結果顯示算法模型轉換前后識別精度誤差不超過1%。
本實驗環境所涉及硬件、軟件的名稱及版本號如下:
硬件環境:飛騰D2000/8核CPU,32 GB內存,1 TB存儲,麒麟V10操作系統;
軟件環境:gcc 7.3.0,g++ 7.3.0,python 3.7,paddlepaddle 2.1.1,x2paddle 1.2.3,qt 5.11.2,qmake 3.11.3,Ascend-tooklit 5.0.2,國產FPGA 模型編譯工具1.3.0。
(1)華為昇騰平臺
將通用框架模型resnet50.onnx放到已安裝本軟件且具備軟件運行環境的機器上,路徑無特殊要求。打開模型轉換工具,在主界面選定“昇騰平臺”,然后點擊“模型轉換參數輸入”按鈕,進入到該子界面,輸入相應模型轉換參數:輸入模型路徑:/root/ksbs/model_shift/resnet50.onnx、輸出模型名稱:resnet50、輸入類型:NCHW、芯片類型:Ascend310、輸入名:input、batch_size:1、通道數:3、寬:224、高:224等,然后點擊“保存”按鈕。在主界面點擊“模型轉換”按鈕便可以在新的線程內,開啟新的模型轉換進程,此時可以通過下面的“轉換結果顯示”窗口查看模型轉換進程的實時打印信息。當模型轉換完成后,在“轉換結果顯示”窗口顯示:“ATC run success,welcome to the next use”,便可到相應路徑下找到轉換完成后的模型“resnet50.om”,其轉換過程如圖7所示。

圖7 華為CANN平臺模型轉換
(2)百度昆侖平臺
將通用框架模型resnet50.onnx放到已安裝本軟件且具備軟件運行環境的機器上,路徑無特殊要求。打開模型轉換工具,在主界面選定“百度平臺”,然后點擊“模型轉換參數輸入”按鈕,進入到該子界面,輸入相應模型轉換參數:輸入模型路徑:/root/ksbs/model_shift/resnet50.onnx,選擇輸出路徑:/root/projects/resnet/interence_model,源模型類型:onnx,然后點擊“保存”按鈕。在主界面點擊“模型轉換”按鈕便可以在新的線程內,開啟新的模型轉換進程,此時可以通過下面的“轉換結果顯示”窗口查看模型轉換進程的實時打印信息。當模型轉換完成后,在“轉換結果顯示”窗口顯示:“Exporting inference model from python code”,便可到相應路徑下找到轉換完成后的模型“model.pdmodel”和“model.pdparam”,其轉換過程如圖8所示。

圖8 百度PaddlePaddle平臺模型轉換
(3)國產FPGA平臺
將通用框架模型yolov3.onnx放到已安裝本軟件且具備軟件運行環境的機器上,路徑無特殊要求。打開模型轉換工具,在主界面選定“FPGA平臺”,然后點擊“模型轉換參數輸入”按鈕,進入到該子界面,輸入相應模型轉換參數:轉換模式:res50_imagenet,選擇輸入模型:/root/ksbs/model/resnet50.onnx,選擇輸出路徑:/root/ksbs/mo-del,然后點擊“保存”按鈕。在主界面點擊“模型轉換”按鈕便可以在新的線程內,開啟新的模型轉換進程,此時可以通過下面的“轉換結果顯示”窗口查看模型轉換進程的實時打印信息。當模型轉換完成后,在“轉換結果顯示”窗口顯示:“Generate output/Weights.bin”和“Generate output/Parameters.bin”,便可到相應路徑下找到轉換完成后的模型“Weights.bin”和“Parameters.bin”,其轉換過程如圖9所示。

圖9 國產FPGA模型轉換
以艦船目標識別為例,測試集收集包括艦船、艦體、艦島等目標的測試集1350張。
將基于Pytorch框架訓練好的模型ResNet50.pt保存到x86服務器的指定路徑下,并將測試集數據放到同級目錄,啟動模型精度測試程序,加載保存的模型和測試集數據并執行推理,運行結果如圖10(a)所示,識別準確率約為93.48%。

圖10 模型轉換前后識別精度對比
將ResNet50.pt模型導出為ResNet50.onnx模型并拷貝到已安裝模型轉換工具的國產設備上,啟動模型轉換工具,加載ResNet50.onnx模型文件并輸入轉換參數,轉換為ResNet50.om模型,并將其部署到Atlas 200DK推理加速設備的指定路徑下,同時將測試數據集放到同級目錄下,啟動Atlas 200DK上的模型精度測試程序并執行推理,加載保存的模型和測試集數據,運行結果如圖10(b)所示,識別準確率約為92.52%,從而計算出模型部署前后精度誤差約為0.96%。
針對智能算法異構加速硬件的多元化帶來的模型應用與轉換過程繁瑣、冗余的問題,本文設計并實現了一種智能算法模型轉換工具,該工具可以將開源框架下訓練的智能算法模型一鍵轉換為不同硬件加速平臺支持的模型文件,使得智能算法模型轉換功能集成化和統一化。
其主要創新點和貢獻如下:
(1)該工具內嵌華為CANN平臺ATC轉換工具、百度PaddlePaddle平臺X2 Paddle轉換工具以及自研國產FPGA平臺轉換工具,可以將resnet50.onnx/yolov3.onnx模型文件轉換為om文件、pdmodel/pdparams文件、bin文件,在不同硬件平臺上實現智能算法推理加速,且功能可擴展,支持多種異構加速平臺;
(2)該工具基于QT開源圖形框架實現的界面化設計,并在基礎的模型轉換工具上進行上層封裝,為用戶提供簡便直接的操作和交互方式,使得模型轉換操作簡單易懂,無上手門檻。同時可以支持YOLOv3、ResNet50、VGG16等多種智能算法模型和參數設置,多線程和進程通信技術支持多種模型同時轉換,互不干擾,保證了工具的流暢運行。
由于時間原因本文研發的模型轉換工具只涉及到常見的幾種硬件加速平臺、主流的深度學習框架和算法模型,對于其它設備和算法模型仍需要適配和驗證;本文分別通過模型轉換和目標識別算法測試了該工具的有效性和誤差精度,其魯棒性和兼容性也是下一步的工作重點。