申云飛,申 飛,李 芳,張 俊*
(1.安徽大學(xué) 物質(zhì)科學(xué)與信息技術(shù)研究院,合肥 230031;2.中國科學(xué)院合肥物質(zhì)科學(xué)研究院 強(qiáng)磁場科學(xué)中心,合肥 230031;3.強(qiáng)磁場安徽省實(shí)驗(yàn)室,合肥 230031)
近年來,隨著深度學(xué)習(xí)技術(shù)的快速發(fā)展與物聯(lián)網(wǎng)邊緣設(shè)備的普及,卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)成功應(yīng)用于圖像檢測與識別[1-2]、語音識別[3-4]、自然語言處理[5-6]等領(lǐng)域,并在自動駕駛、移動支付和公共安全等實(shí)際場景中得到廣泛應(yīng)用?,F(xiàn)有的網(wǎng)絡(luò)模型部署方式主要分為云端部署和終端部署。其中,云端部署方式是將模型部署在云數(shù)據(jù)中心,計(jì)算結(jié)果通過網(wǎng)絡(luò)返回到用戶端,具有推理速度快、對終端設(shè)備算力要求低的特點(diǎn),但同時(shí)也存在數(shù)據(jù)傳輸網(wǎng)絡(luò)延遲、用戶隱私泄露等問題。終端部署方式則是在終端直接實(shí)現(xiàn)模型推理,避免了云端部署存在的問題,但對終端設(shè)備算力、功耗要求較高。
為解決終端部署方式存在的算力與功耗問題,工業(yè)界相繼推出高算力、低功耗的專用芯片(Application Specific Integrated Circuit,ASIC),如華為昇騰910、寒武紀(jì)1H8、華米“黃山1 號”等。專用ASIC 芯片具有開發(fā)成本高、靈活性低、制造周期長等特點(diǎn),適用于芯片需求量大、算法穩(wěn)定的場景。同時(shí),硬件廠商陸續(xù)推出用于硬件設(shè)備優(yōu)化部署的推理引擎,如Intel OpenVINO、Nvidia TensorRT、Google Mediapipe 和百度PaddleLite 等。但上述推理引擎只針對特定硬件,如Nvidia TensorRT 只支持Nvidia GPU、百度PaddleLite 只支持百度Edgeboard 開發(fā)板等。此外,由于ASIC 芯片設(shè)計(jì)固化后無法再調(diào)整,難以滿足模型快速迭代與升級的要求。
現(xiàn)場可編程門陣列(Field-Programmable Gate Array,F(xiàn)PGA)是一種低成本、高性能、可重構(gòu)的可編程邏輯器件[7],填補(bǔ)了ASIC 芯片的空缺,是促進(jìn)模型從理論到落地應(yīng)用的優(yōu)良載體[8]。作為半定制化芯片,F(xiàn)PGA 通常需要對硬件結(jié)構(gòu)進(jìn)行二次設(shè)計(jì),將模型描述轉(zhuǎn)換成FPGA 可執(zhí)行的硬件代碼,并針對推理性能進(jìn)行多種優(yōu)化才能實(shí)現(xiàn)模型在FPGA 上的部署運(yùn)行。在FPGA 上實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Network,DNN)模型的優(yōu)化和部署,需要開發(fā)人員同時(shí)掌握人工智能(Artificial Intelligence,AI)技術(shù)和FPGA 設(shè)計(jì)編程技術(shù),存在準(zhǔn)入門檻較高、開發(fā)效率低下的問題。針對該現(xiàn)狀,部分FPGA 廠商適時(shí)推出了AI 加速平臺,如Xilinx Vitis AI 通過集成模型庫和軟件設(shè)計(jì)工具提供AI 開發(fā)功能,但它的算子覆蓋有限,并且主要應(yīng)用于Xilinx 的高端FPGA 型號。因此,DNN 模型的軟硬件適配、協(xié)同與融合仍是制約AI 技術(shù)大規(guī)模推廣應(yīng)用的關(guān)鍵問題。
針對FPGA 存在的模型優(yōu)化部署問題,本文基于張量虛擬機(jī)(Tensor Virtual Machine,TVM)[9]提出一種DNN 模型在FPGA 上部署與加速的方法,并在PYNQ-Z2 開發(fā)板上實(shí)現(xiàn)了基于殘差網(wǎng)絡(luò)(Residual Network,ResNet)的分心駕駛行為分類算法,并驗(yàn)證了算法的有效性。TVM 是一個(gè)應(yīng)用于深度學(xué)習(xí)領(lǐng)域的端到端自動編譯優(yōu)化器,將不同框架(如PyTorch、TensorFlow、ONNX(Open Neural Network Exchange)等)訓(xùn)練的模型編譯為對應(yīng)目標(biāo)硬件(如CPU、GPU、FPGA、ASIC 等)的可執(zhí)行語言[9]。為更好支持FPGA 類終端設(shè)備,TVM 集成了一個(gè)通用的、可定制的多功能張量加速器(Versatile Tensor Accelerator,VTA)[10]。通過構(gòu)建端到端、以加速器為中心的DNN 編譯平臺,TVM 可實(shí)現(xiàn)硬件跨平臺編譯,并有效降低模型部署難度,同時(shí)保證模型的推理時(shí)間和推理精度,為CNN 在終端設(shè)備上的快速部署提供了新方案。
本文利用TVM 編譯器,實(shí)現(xiàn)基于ResNet 的分心駕駛分類模型在高性價(jià)比FGPA 上的加速計(jì)算,既保證了檢測精度和實(shí)時(shí)性要求,又降低了模型落地成本,為分心駕駛行為分類應(yīng)用的落地提供了新的方案。分心駕駛是指駕駛員將注意力從駕駛上移開,進(jìn)行諸如發(fā)短信、打電話、和乘客聊天等分心駕駛行為。圖像分類任務(wù)廣泛使用的深度卷積神經(jīng)網(wǎng)絡(luò),由于模型參數(shù)量大,在分心駕駛這類移動場景應(yīng)用時(shí)無法滿足實(shí)時(shí)性需求,而現(xiàn)有的輕量化模型如MobileNet 系列,在解決模型參數(shù)問題的同時(shí)也帶來精度下降的問題,經(jīng)驗(yàn)證分析表明它并不適用于分心駕駛行為分類場景。分心駕駛行為分類的落地應(yīng)用,離不開對硬件成本的考量,而現(xiàn)有研究大多集中在提升分心駕駛模型精度方面[11-14],較少關(guān)注模型的快速、低成本部署應(yīng)用。本文聚焦于模型在邊緣端硬件的加速計(jì)算,使用ResNet 實(shí)現(xiàn)分心駕駛行為分類,并選取成本低廉的PYNQ-Z2 開發(fā)板作為搭載硬件,取得較好成效。
當(dāng)前,深度神經(jīng)網(wǎng)絡(luò)(DNN)模型在FPGA 上部署與加速的方法如下:1)使用專用FPGA 加速器,針對FPGA 和DNN模型進(jìn)行優(yōu)化映射,生成高層綜合(High-Level Synthesis,HLS)、Verilog 或硬件描述語言(Very-High-speed integrated circuit hardware Description Language,VHDL),最后生成比特流;2)使用通用FPGA 加速器,將DNN 模型轉(zhuǎn)換為多級中間表示,并針對多級中間表示優(yōu)化編譯,最后生成硬件代碼。
專用型FPGA 加速器根據(jù)體系架構(gòu)分為兩類:流式架構(gòu)FPGA 加速器和處理器架構(gòu)FPGA 加速器。
流式架構(gòu)FPGA 加速器如圖1(a)所示,由多個(gè)不同的硬件塊組成,模型的每一層對應(yīng)生成一個(gè)硬件塊,各硬件塊的性能分別進(jìn)行優(yōu)化,并將所有塊串聯(lián)形成管道,再利用層之間的并行性實(shí)現(xiàn)并發(fā)執(zhí)行。流式架構(gòu)的FPGA 加速器如fpgaConvNet[15]、DeepBurning[16]、Haddoc2[17]和AutoCodeGen[18]。fpgaConvNet 框架利用同步數(shù)據(jù)流模型執(zhí)行設(shè)計(jì)空間搜索,生成可合成的Vivado HLS 硬件設(shè)計(jì),將CNN 模型映射到FPGA 上[15];DeepBurning 根據(jù)網(wǎng)絡(luò)模型數(shù)據(jù)、訪存特性和芯片資源約束,為特定模型自動實(shí)現(xiàn)最優(yōu)FPGA 設(shè)計(jì)[16];Haddoc2 使用直接硬件映射方法實(shí)現(xiàn)CNN,為CNN 自動設(shè)計(jì)基于FPGA 的硬件加速器[17];AutoCodeGen 根據(jù)高級硬件描述語言自動生成Verilog HDL 代碼[18]。流式架構(gòu)FPGA 加速器并發(fā)性較高,但加速器要為每個(gè)模型生成比特流,編譯時(shí)間較長。
圖1 專用型FPGA加速器架構(gòu)Fig.1 Architecture of dedicated FPGA accelerator
處理器架構(gòu)FPGA 加速器如圖1(b)所示,由一個(gè)固定的架構(gòu)模板組成,主要包括處理單元、控制單元和直接存儲器訪問(Direct Memory Access,DMA)三部分,以脈動陣列或矩陣乘法的形式,依次處理CNN 層,基于FPGA 資源進(jìn)行配置和擴(kuò)展,實(shí)現(xiàn)一次編譯生成的比特流對應(yīng)多個(gè)CNN 模型。處理器架構(gòu)的FPGA 加速器如DNN Weaver[19]、Angel-Eye[20]、ALAMO[21]和 FP-DNN(FPGAs-Deep Neural Network)[22]。DNN Weaver 開源框架使用手動優(yōu)化的基于寄存器轉(zhuǎn)換級(Register Transfer Level,RTL)的設(shè)計(jì)模板,為給定的(DNN,F(xiàn)PGA)組合,自動生成高性能可合成的加速器[19];Angel-Eye使用數(shù)據(jù)量化策略將數(shù)據(jù)量化到8 b,并自動生成指令序列描述CNN 執(zhí)行過程[20];ALAMO 兼顧HLS 的靈活、易編程和RTL 的高性能、高能效的特性,自動將模型推理過程映射成FPGA 可執(zhí)行的RTL 代碼[21];FP-DNN 框架以TensorFlow 構(gòu)造的DNN 模型作為輸入,使用RTL-HLS 混合模板自動生成FPGA 硬件設(shè)計(jì),無須人工干預(yù),自動完成DNN 模型到FPGA的映射[22]。處理器架構(gòu)FPGA 加速器靈活、可擴(kuò)展、低定制化,但由于一次編譯生成的比特流對應(yīng)多個(gè)CNN 模型,可能導(dǎo)致加速性能不穩(wěn)定。
通用型FPGA 加速器可分為商用深度學(xué)習(xí)編譯器和開源深度學(xué)習(xí)編譯器兩種。商用深度學(xué)習(xí)編譯器由硬件廠商推出,以庫的方式提供給用戶,將模型中間表示(Intermediate Representation,IR)轉(zhuǎn)換成編譯器內(nèi)部IR,再映射到對應(yīng)硬件的算子實(shí)現(xiàn),最后完成推理計(jì)算。OpenVINO和Vitis AI 是商用深度學(xué)習(xí)編譯器的代表。OpenVINO 是Intel 推出的針對計(jì)算機(jī)視覺加速優(yōu)化的深度學(xué)習(xí)編譯器,支持PyTorch、TensorFlow、ONNX 等前端框架訓(xùn)練的模型,通過模型轉(zhuǎn)換后可實(shí)現(xiàn)在Intel 平臺下的CPU、GPU、FPGA、視頻處理單元(Video Processing Unit,VPU)等硬件環(huán)境上部署,并具有一次寫入、處處部署的特點(diǎn)。Vitis AI 是Xilinx 推出的一款綜合推理開發(fā)平臺,支持最新的深度學(xué)習(xí)模型和主流訓(xùn)練框架,能夠完成各種深度學(xué)習(xí)任務(wù)。商用深度學(xué)習(xí)編譯器可以最大化地提升性能,但存在硬件適配和算子覆蓋率等問題。為解決上述問題,以TVM、nGraph-PlaidML[23]、XLA(Accelerated Linear Algebra)[24]、Glow[25]和 TC(Tensor Comprehensions)[26]為代表的開源深度學(xué)習(xí)編譯器應(yīng)運(yùn)而生。這類編譯器支持根據(jù)模板或自定義IR 實(shí)現(xiàn)算子的自動生成,由此解決算子覆蓋率問題;并支持將輸入模型轉(zhuǎn)換為多級IR 優(yōu)化編譯,實(shí)現(xiàn)不同硬件適配。開源深度學(xué)習(xí)編譯器結(jié)構(gòu)如圖2 所示,支持多前端輸入和多后端部署。前端將不同框架訓(xùn)練的模型描述轉(zhuǎn)換為高級中間表示(High-level IR),并通過實(shí)現(xiàn)與硬件無關(guān)的計(jì)算圖優(yōu)化,以減少計(jì)算圖冗余、提高計(jì)算效率。優(yōu)化后的High-level IR 傳入后端轉(zhuǎn)化為低級中間表示(Low-level IR),并可針對特定硬件進(jìn)行優(yōu)化,優(yōu)化后的Low-level IR 編譯即可生成目標(biāo)硬件可執(zhí)行代碼。
TVM 是一個(gè)開源的端到端的深度學(xué)習(xí)編譯器,將不同框架訓(xùn)練的模型作為輸入,經(jīng)過Relay 執(zhí)行圖級優(yōu)化和算子級優(yōu)化后,生成特定硬件的可執(zhí)行代碼。TVM 中包含一個(gè)多功能可編程張量加速器VTA,VTA 由一個(gè)可參數(shù)化的體系結(jié)構(gòu)、兩級ISA 和一個(gè)即時(shí)編譯器(Just-In-Time compiler,JIT)組成,共同實(shí)現(xiàn)可編程可擴(kuò)展功能。VTA 結(jié)構(gòu)如圖3 所示,包括獲取模塊(fetch)、加載模塊(load)、計(jì)算模塊(compute)和存儲模塊(store)。四個(gè)模塊通過先進(jìn)先出隊(duì)列與片上共享內(nèi)存進(jìn)行模塊間的通信,可在計(jì)算受限和內(nèi)存受限的工作負(fù)載上實(shí)現(xiàn)高計(jì)算資源利用率和高內(nèi)存帶寬利用率。TVMVTA 共同構(gòu)成軟件-硬件堆棧,實(shí)現(xiàn)模型在FPGA 上的部署與加速。
圖3 VTA結(jié)構(gòu)Fig.3 VTA structure
本文基于TVM 深度學(xué)習(xí)編譯器,實(shí)現(xiàn)ResNet 的分心駕駛分類模型在PYNQ-Z2 開發(fā)板上的編譯、優(yōu)化與加速。模型編譯流程如圖4 所示,卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型首先通過前端轉(zhuǎn)換,生成模型計(jì)算圖的高級中間表示Relay IR,再對Relay IR 進(jìn)行優(yōu)化、量化和計(jì)算圖打包操作,接著將Relay IR轉(zhuǎn)換為低級張量中間表示(Tensor Intermediate Representation,TIR),最后生成硬件平臺可執(zhí)行代碼。硬件代碼打包后,通過RPC(Remote Procedure Call)協(xié)議發(fā)送到遠(yuǎn)程目標(biāo)設(shè)備上,即可在目標(biāo)設(shè)備的微處理器(MicroProcessor Unit,MPU)+FPGA 上運(yùn)行,實(shí)現(xiàn)模型推理加速。下面將模型編譯流程分為模型前端轉(zhuǎn)換、模型優(yōu)化和模型硬件代碼生成與部署三個(gè)模塊詳細(xì)介紹。
圖4 模型編譯流程Fig.4 Model compilation flow
TVM 支持多種深度學(xué)習(xí)框架,鑒于PyTorch 框架在學(xué)術(shù)界應(yīng)用相對廣泛,本文以PyTorch 訓(xùn)練的模型為例,介紹TVM 的編譯流程。由于PyTorch 采用動態(tài)圖機(jī)制提供非固定的網(wǎng)絡(luò)結(jié)構(gòu),在性能優(yōu)化時(shí)不利于開展網(wǎng)絡(luò)結(jié)構(gòu)的分析和優(yōu)化,因此PyTorch 模型首先需要通過torch 提供的應(yīng)用程序編程接口(Application Programming Interface,API)轉(zhuǎn)換為TorchScript 格式的計(jì)算圖中間表示(IR),以使模型具備可理解、編譯和序列化能力。其次,TVM 使用前端轉(zhuǎn)換模塊將TorchScript 格式的IR 轉(zhuǎn)換為TVM 的Relay IR。前端轉(zhuǎn)換流程如圖5 所示。
圖5 前端轉(zhuǎn)換流程Fig.5 Front end conversion flow
2.2.1 計(jì)算圖優(yōu)化
計(jì)算圖優(yōu)化通過改變數(shù)據(jù)布局、融合算子結(jié)構(gòu)等方式減小訪存和計(jì)算開銷,提高模型推理速度,提升模型的性能。針對前端轉(zhuǎn)換生成的Realy IR 執(zhí)行計(jì)算圖優(yōu)化,并返回優(yōu)化后的mod 模塊和參數(shù)。計(jì)算圖優(yōu)化流程如圖6 所示:構(gòu)建優(yōu)化上下文(context)用于存儲優(yōu)化信息,查找預(yù)調(diào)整優(yōu)化記錄,執(zhí)行計(jì)算圖優(yōu)化。計(jì)算圖優(yōu)化操作如下:
圖6 計(jì)算圖優(yōu)化流程Fig.6 Computational graph optimization flow
簡化數(shù)據(jù)流圖(SimplifyInference):若模型中存在正則化算子,則將正則化算子拆分為基礎(chǔ)算子(如加減乘除),并在后續(xù)優(yōu)化中與其他算子融合,減少模型計(jì)算量。
剔除冗余函數(shù)(RemoveUnusedFunctions):若存在函數(shù)既沒有引用其他函數(shù),也沒有被其他函數(shù)調(diào)用,則此函數(shù)是冗余函數(shù),可從代碼中剔除此函數(shù)。
消除公共子表達(dá)式(EliminateCommonSubexpr):若表達(dá)式E的計(jì)算結(jié)果為常量C,且E再次出現(xiàn)時(shí)E中所有變量的值都不變,則再次出現(xiàn)的E是公共子表達(dá)式,用常量C代替表達(dá)式E,減小模型的訪存和計(jì)算開銷。
常量折疊(FoldConstant):用具體常量值代替出現(xiàn)在表達(dá)式中的常量參數(shù),減少訪存開銷。
算子融合(FuseOps):將多個(gè)簡單算子融合為一個(gè)算子,如Conv+BN+ReLU 三個(gè)算子融合為一個(gè)CBR 算子,簡化計(jì)算流程,減少訪存開銷。
變換操作布局(AlterOpLayout):根據(jù)硬件特性將數(shù)據(jù)布局轉(zhuǎn)換為硬件友好的布局方式。
2.2.2 量化
量化操作將高精度浮點(diǎn)計(jì)算轉(zhuǎn)換為低精度定點(diǎn)計(jì)算,可有效降低硬件的內(nèi)存消耗,提高模型的推理速度。TVM 編譯模型時(shí),為適配VTA 的低精度數(shù)值類型,將數(shù)值精度從float32 量化為int8。將優(yōu)化后的mod 模塊和參數(shù)輸入到量化模塊中,實(shí)現(xiàn)數(shù)值精度轉(zhuǎn)換,并返回量化后的mod 模塊。量化過程分兩步執(zhí)行:1)配置量化環(huán)境,基于量化配置模塊設(shè)置配置參數(shù),如不執(zhí)行量化操作的卷積層、量化校準(zhǔn)范圍等。2)執(zhí)行量化操作,首先執(zhí)行基礎(chǔ)優(yōu)化(如簡化數(shù)據(jù)流圖、折疊比例軸、常量折疊),再執(zhí)行分割、注釋、校準(zhǔn)和實(shí)現(xiàn)四種量化操作:遍歷計(jì)算圖,分割(partion)操作在預(yù)量化的計(jì)算圖中插入分割節(jié)點(diǎn)(cast_hint、stop_fustion);注釋(annotate)操作在預(yù)量化計(jì)算圖中插入模擬量化算子(simulate_quantize);校準(zhǔn)(calibrate)操作收集存儲量化信息;實(shí)現(xiàn)(realize)操作用基礎(chǔ)算子替換模擬量化算子,完成量化變換。
2.2.3 計(jì)算圖打包
TVM 根據(jù)目標(biāo)硬件特性轉(zhuǎn)換數(shù)據(jù)布局格式,執(zhí)行計(jì)算圖打包,并將矩陣計(jì)算卸載到FPGA 上,實(shí)現(xiàn)模型在目標(biāo)硬件上的推理加速計(jì)算。將量化后的mod 模塊輸入到圖形打包模塊中,設(shè)置圖形打包的起始和結(jié)束的節(jié)點(diǎn)名稱、索引值,返回打包后的mod 模塊。圖形打包模塊從三個(gè)方面實(shí)現(xiàn)計(jì)算圖的數(shù)據(jù)布局轉(zhuǎn)換,使用的參數(shù)bfactor、cfactor 由VTA 配置文件(vta_config.json)中的“LOG_BATCH”“LOG_BLOCK”控制,默認(rèn)bfactor=1,cfactor=16。計(jì)算圖打包流程如圖7 所示:
圖7 計(jì)算圖打包流程Fig.7 Computational graph packaging flow
1)打包權(quán)重,更改權(quán)重參數(shù)布局。首先判斷權(quán)重參數(shù)的第一、二維能否整除cfactor,若不能整除cfactor,則填充權(quán)重參數(shù)形狀,再將權(quán)重維度從4 維擴(kuò)展為6 維,維度擴(kuò)展規(guī)則如表1 所示。
表1 計(jì)算圖打包的維度擴(kuò)展規(guī)則Tab.1 Dimension expansion rules of computational graph packing
2)打包通道,更改通道數(shù)據(jù)布局。首先判斷數(shù)據(jù)通道是否滿足條件:數(shù)據(jù)通道參數(shù)第一維整除bfactor,第二維整除cfactor,若滿足條件,則將通道維度從4 維擴(kuò)展為6 維;若不滿足條件,則計(jì)算圖打包失敗,程序停止運(yùn)行。
3)打包常量,更改常量參數(shù)布局。首先判斷常量參數(shù)第一維能否整除cfactor,若不能整除cfactor,則填充常量參數(shù)形狀,再將常量參數(shù)維度從3 維擴(kuò)展為5 維。
2.3.1 硬件代碼生成
模型在目標(biāo)設(shè)備上部署時(shí)需要將模型描述轉(zhuǎn)化為硬件可執(zhí)行代碼,TVM 基于硬件代碼生成模塊將打包后的mod 模塊編譯為硬件代碼庫,并通過RPC 協(xié)議發(fā)送到遠(yuǎn)程設(shè)備上執(zhí)行。硬件代碼生成流程如圖8 所示:將打包后的mod 模塊輸入到硬件代碼生成模塊中,首先執(zhí)行計(jì)算圖編譯,實(shí)現(xiàn)計(jì)算圖優(yōu)化和圖代碼生成;再將Realy IR 轉(zhuǎn)換為低級張量中間表示TIR,執(zhí)行TIR 優(yōu)化,分離出主機(jī)模塊和目標(biāo)設(shè)備模塊,并分別為主機(jī)端和目標(biāo)設(shè)備端生成代碼;最后將目標(biāo)設(shè)備模塊導(dǎo)入主機(jī)模塊中,生成運(yùn)行時(shí)模塊,返回生成的硬件推理庫文件。
圖8 硬件代碼生成流程Fig.8 Hardware code generation flow
2.3.2 配置硬件參數(shù)與模型計(jì)算
1)配置參數(shù)。在主機(jī)端定義目標(biāo)模型和模型執(zhí)行平臺,當(dāng)目標(biāo)硬件為FPGA 后端時(shí),重新配置FPGA 和JIT 運(yùn)行時(shí)。配置目標(biāo)硬件IP 地址和對應(yīng)端口號,將VTA 配置文件中的設(shè)備目標(biāo)“TARGET”設(shè)置為“pynq”,其余參數(shù)保持不變。連接硬件設(shè)備,在主機(jī)端構(gòu)建完整的TVM 環(huán)境,目標(biāo)設(shè)備端構(gòu)建VTA 運(yùn)行環(huán)境。主機(jī)端連接目標(biāo)設(shè)備,并開啟RPC 服務(wù),完成基于TVM 的RPC 服務(wù)程序構(gòu)建和預(yù)編譯比特流下載,通過RPC 將預(yù)編譯比特流發(fā)送到目標(biāo)設(shè)備上,實(shí)現(xiàn)目標(biāo)設(shè)備上的FPGA 編程和VTA 運(yùn)行時(shí)構(gòu)建,最后發(fā)送可執(zhí)行文件到目標(biāo)硬件上執(zhí)行。
2)運(yùn)行程序。將模型和權(quán)重參數(shù)輸入到主機(jī)端,經(jīng)過TVM 編譯優(yōu)化生成可執(zhí)行代碼,開啟RPC 服務(wù),將代碼發(fā)送到目標(biāo)硬件上執(zhí)行推理,測試模型推理速度和精度,并將結(jié)果返回主機(jī)。
實(shí)驗(yàn)環(huán)境分為模型訓(xùn)練環(huán)境與模型部署環(huán)境,模型部署環(huán)境又包括模型部署主機(jī)端環(huán)境和目標(biāo)硬件環(huán)境。
3.1.1 訓(xùn)練環(huán)境
實(shí)驗(yàn)平臺安裝Ubuntu14.04 操作系統(tǒng),采用PyTorch 1.10.1 框架,以及Python3.6 運(yùn)行環(huán)境,硬件配置為Intel Core i5-10500 CPU@3.10 GHz,采 用NVIDIA GeFore GTX 1080Ti GPUs,內(nèi)存16 GB(3 200 MHz)。訓(xùn)練參數(shù)設(shè)置如下:訓(xùn)練batch size=64,輸入圖片大小為224×224,訓(xùn)練迭代次數(shù)Epoch=100,初始權(quán)重為ImageNet 預(yù)訓(xùn)練權(quán)重,使用隨機(jī)梯度下 降(Stochastic Gradient Descent,SGD)優(yōu)化器,其中:learning rate=0.01,momentum=0.9,weight_decay=5E-4。
3.1.2 部署環(huán)境
本文模型部署時(shí)主機(jī)端的軟件環(huán)境Ubuntu 20.04,TVM版本為0.8,硬件環(huán)境為Intel Core i5-10500 CPU@ 3.10 GHz,內(nèi)存16 GB(3 200 MHz)。
本文模型部署的目標(biāo)硬件為Xilinx 發(fā)布的一款FPGA 開發(fā)板PYNQ-Z2(芯片型號ZYNQ XC7Z020-1CLG400C),如圖9所示,PYNQ-Z2 內(nèi)部資源包括:650 MHz 雙核Cortex-A9 處理器、DDR3 內(nèi)存控制器、高/低帶寬外設(shè)控制器和Artix-7 系列可編程邏輯器件??删幊踢壿嬈骷?3 300 個(gè)邏輯片、630 KB 快速block RAM、4 個(gè)時(shí)鐘管理片和220 個(gè)DSP 切片組成。價(jià)格150~200 $,尺寸87 mm×137 mm,適合用于搭載分心駕駛分類模型。PYNQ-Z2 板鏡像版本為Pynq 官方提供的PYNQ-Z2 v2.5,根據(jù)TVM 官方教程在PYNQ-Z2 板上安裝VTA,一根網(wǎng)線用于數(shù)據(jù)傳輸,一根USB 用于供電。
圖9 PYNQ-Z2開發(fā)板Fig.9 PYNQ-Z2 development board
本文使用了AUC(American University in Cairo)[27]和StateFarm[28]兩個(gè)開源數(shù)據(jù)集訓(xùn)練分心駕駛行為分類模型。
3.2.1 AUC數(shù)據(jù)集
AUC 數(shù)據(jù)集采集了來自7 個(gè)國家的31 名參與者共17 308 張駕駛圖片,圖像尺寸為1 080×1 920,包含c0~c9 共10類分心駕駛行為(如圖10 所示),分別是正常駕駛、右手發(fā)消息、右手打電話、左手發(fā)消息、左手打電話、調(diào)收音機(jī)、喝水、向后取東西、整理頭發(fā)/化妝、和乘客說話。本文將25%(4 331 張)的圖片用于測試,剩余75%(12 977 張)圖片的90%(11 680 張)用于訓(xùn)練,10%(1 297 張)用于驗(yàn)證,數(shù)據(jù)分布情況如圖11 所示,訓(xùn)練時(shí)將圖像尺寸調(diào)整為224×224。
圖10 分心駕駛數(shù)據(jù)集樣例Fig.10 Samples of distracted driving dataset
圖11 AUC和StateFarm數(shù)據(jù)分布Fig.11 AUC and StateFarm data distribution
3.2.2 StateFarm數(shù)據(jù)集
StateFarm 數(shù)據(jù)集是由kaggle 競賽公布的分心駕駛數(shù)據(jù)集,比賽提供了22 424 張已標(biāo)注訓(xùn)練集和79 729 張未標(biāo)注測試集,共有10 個(gè)分類(與AUC 數(shù)據(jù)集分類相同),圖像尺寸為640×480。本文使用22 424 張標(biāo)注圖像用于訓(xùn)練,訓(xùn)練時(shí)將圖像尺寸調(diào)整為224×224。測試和驗(yàn)證數(shù)據(jù)使用文獻(xiàn)[29]中標(biāo)注的8 350 張圖像,其中50%(4 175 張)圖像用于測試,50%(4 175 張)圖像用于驗(yàn)證。
殘差網(wǎng)絡(luò)(ResNet)[30]是為了解決DNN 退化問題而提出的新型網(wǎng)絡(luò)結(jié)構(gòu),引入的殘差結(jié)構(gòu)(Residual Block)如圖12所示。將輸入信息直接通過支路(shortcut)傳到輸出,以緩解傳統(tǒng)卷積層數(shù)據(jù)傳輸時(shí)的信息損失,在模型訓(xùn)練時(shí)只需關(guān)注輸入與輸出間的差異,降低了網(wǎng)絡(luò)學(xué)習(xí)的難度。本文基于ResNet 設(shè)計(jì)分心駕駛行為分類模型,并將模型部署到FPGA 上。
圖12 殘差結(jié)構(gòu)Fig.12 Residual blocks
3.4.1 AUC和StateFarm數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果
ResNet 模型在AUC 和StateFarm 的測試準(zhǔn)確率如表2 所示。ResNet18、34、50 在AUC 數(shù)據(jù)集上的準(zhǔn)確率都達(dá)到了95%以上,說明AUC 數(shù)據(jù)集數(shù)據(jù)量小、數(shù)據(jù)復(fù)雜程度低。ResNet18、34、50 在StateFarm 數(shù)據(jù)集上的表現(xiàn)比在AUC 上差,準(zhǔn)確率分別下降了6.15、5.04 和4.64 個(gè)百分點(diǎn),說明StateFarm 數(shù)據(jù)集數(shù)據(jù)構(gòu)成更復(fù)雜、更具有挑戰(zhàn)性。
表2 ResNet模型在AUC和StateFarm數(shù)據(jù)集上的測試準(zhǔn)確率 單位:%Tab.2 Test accuracies of ResNet models on AUC and StateFarm datasets unit:%
3.4.2 模型推理時(shí)間分析
測試ResNet 模型在VTA 模擬器、PYNQ-Z2 的MPU 和MPU+FPGA 上的推理時(shí)間,batch-size=1,測試過程如下:
VTA 模擬器是TVM 提供的一種硬件模擬環(huán)境,在主機(jī)端構(gòu)建VTA 模擬環(huán)境,更改VTA 配置文件,將“TARGET”設(shè)置為“sim”,將TVM 編譯優(yōu)化和VTA 量化打包的模型部署到VTA 模擬器上,所有TVM 工作負(fù)載都在VTA 模擬器上執(zhí)行;MPU 系統(tǒng),將TVM 編譯優(yōu)化的模型部署到PYNQ-Z2 上,在PYNQ-Z2 的MPU 上執(zhí)行矩陣計(jì)算;MPU+FPGA 系統(tǒng),將TVM編譯優(yōu)化和VTA 量化打包的模型部署到PYNQ-Z2 上,在PYNQ-Z2 的MPU+FPGA 上執(zhí)行矩陣計(jì)算。
測試結(jié)果如表3 所示。模型在PYNQ-Z2 的MPU 上執(zhí)行推理時(shí),所有矩陣計(jì)算都在MPU 上執(zhí)行,由于模型參數(shù)量大且MPU 資源有限,所以模型在PYNQ-Z2 的MPU 上的推理速度最小。模型在VTA 模擬器和PYNQ-Z2 的MPU+FPGA 上執(zhí)行推理時(shí),都使用了量化和計(jì)算圖打包操作,壓縮了模型體積,并分別將卷積計(jì)算卸載到模擬器和FPGA 上執(zhí)行。與MPU 相比,ResNet18、50 在VTA 模擬器上的推理時(shí)間減少了39.15% 和59.66%;在MPU+FPGA 上的推理時(shí)間減少了77.53%和88.63%。與VTA 模擬器相比,ResNet34 在MPU+FPGA 上的推理時(shí)間減少了73.96%。因此,基于TVM 的DNN 模型加速方法能有效減少模型在FPGA 上的推理時(shí)間,加快模型推理。
表3 ResNet模型在不同硬件上的推理時(shí)間對比 單位:msTab.3 Comparison of inference time of ResNet models on different hardware unit:ms
3.4.3 模型推理精度分析
在AUC 和StateFarm 數(shù)據(jù)集上,ResNet 模型在VTA 模擬器、PYNQ-Z2 的MPU 和MPU+FPGA 上的推理精度如表4 所示。當(dāng)模型部署平臺為PYNQ-Z2 的MPU 時(shí),模型的推理精度與在PyTorch 下的精度相同,說明基于TVM 的編譯優(yōu)化不會降低模型的推理精度。當(dāng)模型部署平臺為VTA 模擬器和PYNQ-Z2 的MPU+FPGA 時(shí),由于模型編譯優(yōu)化時(shí)使用了相同的量化和計(jì)算圖打包操作,兩個(gè)部署平臺的模型推理精度下降趨勢一致。與MPU 相比,模型部署平臺為MPU+FPGA時(shí),在AUC 數(shù)據(jù)集上,ResNet50 的top1 和top5 分別下降了0.26、0.03 個(gè)百分點(diǎn);ResNet18 的top1 和top5 分別下降了0.16 和0.04 個(gè)百分點(diǎn)。在StateFarm 數(shù)據(jù)集上,ResNet50 的精度下降趨勢最明顯,top1 和top5 精度分別下降了2.93、0.65 個(gè)百分點(diǎn)。ResNet34 在兩個(gè)數(shù)據(jù)集上的表現(xiàn)最穩(wěn)定。除了StateFarm 數(shù)據(jù)集上的ResNet50,采用本文方法后,ResNet18、34 的推理精度的下降都維持在了1 個(gè)百分點(diǎn)以內(nèi),驗(yàn)證了該方法能夠保持模型在FPGA 上的推理準(zhǔn)確性。
表4 AUC、StateFarm數(shù)據(jù)集訓(xùn)練的ResNet模型在不同硬件上的推理精度對比 單位:%Tab.4 Comparison of inference accuracy of ResNet models trained on AUC and StateFarm datasets on different hardware unit:%
3.4.4 模型優(yōu)化性能分析
本節(jié)將優(yōu)化操作分為3 個(gè)方案:方案1 僅使用計(jì)算圖優(yōu)化操作;方案2 使用計(jì)算圖優(yōu)化和量化操作;方案3 同時(shí)使用計(jì)算圖優(yōu)化、量化和計(jì)算圖打包操作。分別在VTA 模擬器和PYNQ-Z2 的MPU+FPGA 上,測試使用不同優(yōu)化方案的模型的推理時(shí)間和精度情況,并分析實(shí)驗(yàn)結(jié)果。
ResNet 在VTA 模擬器和PYNQ-Z2 的MPU+FPGA 上使用不同優(yōu)化方案的推理時(shí)間如表5 所示。ResNet18、34 和50 在VTA 模擬器上使用方案2 時(shí)推理速度最快,與方案1 相比推理時(shí)間分別減少了27.68%、18.26%和26.36%,這是因?yàn)榱炕僮鲏嚎s了模型的數(shù)據(jù)精度,提升了模型的推理速度。與方案2 相比,雖然方案3 在模型優(yōu)化時(shí)增加了計(jì)算圖打包操作,但由于計(jì)算圖打包操作將數(shù)據(jù)布局由nchw 轉(zhuǎn)換為nchwinic,匹配FPGA 的硬件規(guī)范,轉(zhuǎn)換后的數(shù)據(jù)布局不適用于VTA 模擬器,導(dǎo)致模型的推理速度降低。在MPU+FPGA上使用方案3 時(shí),ResNet18、34 和50 的推理時(shí)間比在VTA 模擬器上減小了63.08%、73.96%和71.82%,驗(yàn)證了在MPU+FPGA 上更適合使用優(yōu)化方案3。
表5 ResNet模型在不同硬件上使用不同優(yōu)化方案的推理時(shí)間對比 單位:msTab.5 Comparison of inference time of ResNet models using different optimization schemes on different hardware unit:ms
在AUC 和StateFarm 數(shù)據(jù)集上,ResNet 在VTA 模擬器和PYNQ-Z2 的MPU+FPGA 上使用不同優(yōu)化方案的推理精度如表6 所示。在VTA 模擬器和PYNQ-Z2 的MPU+FPGA 上分別使用方案2 和方案3 優(yōu)化時(shí),模型在兩個(gè)平臺上的推理精度變化趨勢一致,且同一平臺不同方案推理精度相同,說明計(jì)算圖打包操作不會影響模型精度。在VTA 模擬器上,與方案1 相比,使用方案2 和方案3 的推理精度略有下降,說明量化操作壓縮了模型的數(shù)據(jù)精度,會降低模型的推理精度。
表6 AUC和StateFram數(shù)據(jù)集訓(xùn)練的ResNet模型在不同硬件上使用不同方案的推理精度對比 單位:%Tab.6 Inference accuracy comparison of ResNet models trained on AUC and StateFram datasets using different schemes on different hardwares unit:%
硬件加速平臺Xilinx Vitis AI 支持深度學(xué)習(xí)模型在Xilinx高端FPGA(如ZCU102、ZCU104 和VCK190 等)上推理加速,這些FPGA 的計(jì)算資源豐富但價(jià)格昂貴。通過對比Vitis AI支持的FPGA 與PYNQ-Z2 的硬件價(jià)格、硬件資源和 ResNet50的推理時(shí)間(表7 所示),折中權(quán)衡之下PYNQ-Z2 的性價(jià)比更高,更適合作為分心駕駛行為分類應(yīng)用落地的載體。
表7 Vitis AI支持的FPGA與PYNQ-Z2的硬件價(jià)格、硬件資源數(shù)和ResNet50推理時(shí)間的對比Tab.7 Comparison of hardware price,hardware resources and ResNet50 inference time of Vitis AI-supported FPGA and PYNQ-Z2
本文提出了基于TVM 的深度神經(jīng)網(wǎng)絡(luò)模型加速方法,通過計(jì)算圖優(yōu)化減少模型的計(jì)算和訪存開銷,量化方法壓縮模型的體積,計(jì)算圖打包將復(fù)雜的卷積計(jì)算加載到FPGA 上執(zhí)行。本文以分心駕駛行為分類應(yīng)用為例,在FPGA 上驗(yàn)證了檢測模型的推理速度和精度。利用本文所提加速方法,在AUC 數(shù)據(jù)集上,ResNet50 在PYNQ-Z2 的MPU+FPGA 上的推理時(shí)間相比只使用MPU 減少了88.63%,而推理精度只下降了0.26 個(gè)百分點(diǎn);ResNet18 的推理時(shí)間減少了77.53%,推理一張圖片的時(shí)間減少至355.67 ms,而推理精度只降低了0.16 個(gè)百分點(diǎn)。本文方法可以降低不同訓(xùn)練框架訓(xùn)練的模型在FPGA 上的部署難度,提高模型在FPGA 上的推理速度并保持推理精度,為深度神經(jīng)網(wǎng)絡(luò)模型在FPGA 上的部署提供了新的方案。
本文實(shí)現(xiàn)了ResNet 模型在PYNQ-Z2 上的部署加速,但是ResNet 模型中存在大量冗余參數(shù),不但增加硬件開銷還影響推理速度,下一步擬使用輕量化方法進(jìn)一步減少模型參數(shù)量,進(jìn)而提升模型在硬件上的推理速度。此外,TVM 提供的預(yù)編譯的VTA 比特流(bitstream),并不能良好適用于帶有深度可分離卷積的深度神經(jīng)網(wǎng)絡(luò)模型,下一步擬根據(jù)硬件規(guī)范,更改VTA 配置,生成更高效且適用于深度可分離卷積的VTA 比特流,從而實(shí)現(xiàn)對更多深度學(xué)習(xí)模型的支持。