自動駕駛和機器人對數(shù)據(jù)的處理都要求很強的實時性,因此需要強大的計算能力。而有很多與計算機視覺、深度學習相關(guān)的功能,數(shù)據(jù)量極大,如果采用純CPU的系統(tǒng)架構(gòu),運行時間會很長,達不到期望的處理速度和實時性要求。本文將結(jié)合我們在機器人算法加速上的實踐經(jīng)驗和對自動駕駛運算平臺的了解進行分享。
作者:王文輝【天津最早從事AI算法及創(chuàng)新工作的骨干之一、目前為AI 算法FPGA加速工程師】
一、機器人算法加速實踐
機器人的核心控制單板屬于嵌入式設(shè)備,要求功耗低、面積小,用傳統(tǒng)的CPU+GPU的方案無法滿足要求。因此我們采用了FPGA SOC+HLS的方案,對計算機視覺和深度學習相關(guān)的算法進行加速。不僅利用了FPGA的高并發(fā)性能,也利用了HLS的高效開發(fā)效率,具體包含下述四個方面:
1.高度集成的SOC方案
為了解決單板的體積和功耗問題,選擇xilinx的SOC芯片作為處理主芯片,該芯片包含一片高性能FPGA,相比傳統(tǒng)的CPU+FPGA方案,SOC方案有如下優(yōu)點:
i.功耗
如果采用傳統(tǒng)的CPU(4W)+FPGA(15W)分體式解決方案,整體功耗接近20W。SOC方案按照FPGA資源利用率為80%來計算,典型功耗在10W左右,遠低于CPU+FPGA的方案,這對很多采用電池供電的嵌入式設(shè)備來說,待機時間大大延長了。
ii.BOM面積
高集成的方案大大節(jié)省了單板的PCB面積,進而縮小了整機的體積。
2.HLS快速開發(fā)
CPU需要很強的通用性來處理各種不同的數(shù)據(jù)類型,同時又要邏輯判斷又會引入大量的分支跳轉(zhuǎn)和中斷的處理,這些都使得CPU的內(nèi)部結(jié)構(gòu)異常復(fù)雜,所以,用CPU進行流程控制和調(diào)度時很高效,但如果程序中需要進行大量的復(fù)雜計算,CPU則顯得力不從心。
現(xiàn)在的深度學習和機器視覺領(lǐng)域,恰恰是包含大量的數(shù)學運算,因此需要采用其它擁有大量計算單元的器件進行硬件加速處理,常用的有DSP、GPU和FPGA,主流的架構(gòu)是主控制流程在CPU上運行,DSP、GPU和FPGA做數(shù)據(jù)運算。
由于FPGA內(nèi)部有大量的DSP和可編程模塊,因此是效率最高的選擇,但它的開發(fā)語言(Verilog和VHDL)相對底層,且和DSP、GPU、CPU代碼無法兼容,所以開發(fā)群體相對小眾,編程效率較低,開發(fā)周期長。如下圖:
鑒于此,HLS開發(fā)方式應(yīng)運而生,HLS即高層次描述(High Level Synthesis),之后綜合成可用的網(wǎng)表文件的技術(shù)。這里的“高”指采用C/C++進行編程,而不是傳統(tǒng)的Verilog和VHDL語言。Vivado工具將C程序轉(zhuǎn)換成Verilog代碼后,進行綜合、優(yōu)化、布局布線等操作。開發(fā)流程圖如下:
應(yīng)用了HLS開發(fā)方式后,開發(fā)周期大大縮短,如下圖:
3.高效的驗證環(huán)境
在FPGA開發(fā)過程中,仿真驗證階段占用了70%左右的時間,其中包括了反復(fù)編寫和優(yōu)化激勵、結(jié)果驗證的過程。使用HLS開發(fā)后,這部分工作量會大大縮短,加快開發(fā)進度。
Vivado開發(fā)包括一個Co-Sim的過程,整個過程包括如下幾個步驟,最終完成RTL代碼的仿真。
Co-Sim根據(jù)C語言的testbench建立一個RTL代碼和C語言的testbench之間的通信方式,來傳輸仿真激勵數(shù)據(jù)。
Co-Sim根據(jù)C語言的testbench來生成仿真激勵。
Co-Sim啟動仿真,將激勵灌入并行處理后的RTL代碼,并且驗證輸出是否正確。
整個驗證過程,Co-Sim工具將開發(fā)人員從繁雜的編寫RTL激勵和結(jié)果驗證中解放出來,只需將精力放在如何在C語言層面編寫激勵即可,因此大大提高了開發(fā)效率。
4.HLS的優(yōu)化
整個開發(fā)過程中,如何寫出適合HLS高效綜合的C語言代碼,貫穿整個HLS開發(fā)主線,也是難點所在。主要的優(yōu)化方式有如下幾點,供大家參考:
i. 吞吐量優(yōu)化
數(shù)據(jù)吞吐量定義為單位時間內(nèi)模塊處理數(shù)據(jù)的數(shù)量,是衡量加速算法的一個重要指標,F(xiàn)PGA內(nèi)改進數(shù)據(jù)吞吐量的方法有Pipeline和Dataflow兩種。
下圖A是沒有進行Pipeline處理的代碼,只有當RD、CMP和WR整個處理過程完成后,才會進行下一組數(shù)據(jù)的處理,即處理一組數(shù)據(jù)需要3個時鐘周期。圖B是進行Pipeline優(yōu)化后的代碼,每個時鐘周期都有數(shù)據(jù)輸入并被處理,所以吞吐量是圖A的3倍。
Dataflow是另外一種在函數(shù)之間進行并行優(yōu)化的方式。下圖是沒有進行Dataflow并行計算優(yōu)化的模塊,函數(shù)間依次處理一組數(shù)據(jù),所有處理流程結(jié)束后,input接口才會允許進行下一組數(shù)據(jù)。
采用Dataflow方式后如下圖,會在函數(shù)間增加Channel,這是一個用于緩存中間數(shù)據(jù)的buffer,當一級function處理完數(shù)據(jù)后將其存入緩存,function可以繼續(xù)處理下一組數(shù)據(jù),而不用等待所有流程處理完畢后再繼續(xù)工作。
Pipeline和Dataflow都是增加并行處理的有效手段。
ii. Latency優(yōu)化
Latency是處理一組數(shù)據(jù)的時間,這是體現(xiàn)算法實時性的重要指標。HLS可以通過設(shè)置編譯選項來設(shè)置一個函數(shù)的Latency,優(yōu)化函數(shù)處理時間。另外,還可以通過合并loop來優(yōu)化Latency,因為每個C語言的loop都會被綜合成一個或多個狀態(tài)機,而多個狀態(tài)機級聯(lián)的時候一定會增加額外的處理延遲。我們可以使用merge指令來合并多個狀態(tài)機,優(yōu)化整體處理Latency。
iii. 面積優(yōu)化
在FPGA上實現(xiàn)一個算法,除了速度和吞吐量,算法占用的資源也是重要的考量指標。一個占用資源過多的算法是不可行的,或者說是代價昂貴的,可以通過優(yōu)化數(shù)據(jù)的bit位寬來優(yōu)化占用的資源。
在C語言中通常我們只會使用char/int/float等固定長度的數(shù)據(jù)類型,而在FPGA中,由于高度可編程,我們可以隨意定義自己想要使用的數(shù)據(jù)類型的寬度,例如我們可以根據(jù)需要,使用12/11/10bit位寬的整型數(shù)據(jù),這樣大大減少了資源使用數(shù)量。
當C語言中有很多小的Array時會消耗大量FPGA中的RAM資源,HLS支持RAM合并的功能,即將很多小的Array合并放入一個RAM塊中,減少RAM消耗的數(shù)量。
二、效益和收益
HLS是一個橋接硬件和軟件開發(fā)領(lǐng)域的工具,給FPGA開發(fā)提供了很多好處,主要有:
由于可以在更高抽象語言的基礎(chǔ)上進行開發(fā),極大的提高了硬件開發(fā)人員的生產(chǎn)力。
降低了FPGA開發(fā)門檻,使軟件開發(fā)人員可以快速的介入FPGA開發(fā)。
以下面四個算法加速為例,從開發(fā)速度和工作量上來看HLS帶來的收益。
1.開發(fā)時間大大縮短
開發(fā)時間是體現(xiàn)效率、快速推出版本的一個重要指標,通過使用HLS開發(fā)方式,會使整個團隊在視覺圖像處理算法和CNN上很大提升。
下表是兩種開發(fā)方式下的人力對比,其中RTL開發(fā)方式?jīng)]有實際做,是根據(jù)算法的復(fù)雜度進行預(yù)估的。從對比來看,HLS開發(fā)效率至少是RTL的3倍。
2. 代碼行數(shù)減少
代碼行數(shù)是體現(xiàn)工作量,尤其是后期維護工作量的一個重要指標。HLS后期維護的是C語言代碼,無論從代碼量還是可讀性來說,都遠遠優(yōu)于Verilog。
下表是兩種開發(fā)方式下的代碼行數(shù)對比,其中RTL方式?jīng)]有實際編碼,但是從以前的開發(fā)經(jīng)驗和算法復(fù)雜度來看,每個算法至少是50000行以上的代碼規(guī)模,與HLS方式相比相差了不止一個數(shù)量級。
HLS開發(fā)方式下,代碼的維護變得相當簡單,且對于初學者來說,理解整個算法的流程框架也更容易,但比較難的點是理解編譯選項的含義和開發(fā)方式。
在算法實現(xiàn)上,HLS是一個高效的工具,但由于C語言還是要變成可綜合的Verilog,所以C語言的寫法還是要遵循特定的可綜合的規(guī)則。
三、自動駕駛運算平臺
自動駕駛所需的運算能力體現(xiàn)在車端和云端兩個方面:
1.車端
車端運算平臺一般放在汽車后備箱,主要負責通過傳感器數(shù)據(jù)感知周圍的環(huán)境,用高精度地圖實時定位,并按照算法模型做出駕駛決策。
2.云端
云端則需要一臺數(shù)據(jù)處理能力超強的數(shù)據(jù)中心,所有與云端連接的車輛都會將自己的行駛數(shù)據(jù)上傳到這里。云端利用這些數(shù)據(jù),通過深度/增強學習訓(xùn)練決策和感知的算法模型。經(jīng)過訓(xùn)練優(yōu)化的算法模型在經(jīng)過穩(wěn)定性驗證后將會被重新更新到各個車輛終端中,這是未來自動駕駛所使用的自我優(yōu)化體系。
車端對于安全性和實時性要求很高,需要對周圍環(huán)境迅速做出決策;云端數(shù)據(jù)量龐大,所有這些都對運算能力提出了很高的要求。
目前車端和云端運算平臺采用較多的處理器是GPU,GPU有數(shù)量眾多的計算單元,可以并行運行同時處理很多相對簡單但具有大量數(shù)據(jù)的任務(wù)。
2016年NVIDIA推出的專門針對自動駕駛的 Drive PX2平臺在車端應(yīng)用比較廣泛,Drive PX2中使用了兩個Tegra Parker,以及多個Pascal架構(gòu)的GPU,每秒能夠執(zhí)行24萬億次操作。Drive PX2配合云端數(shù)據(jù)中心的NVIDIA Tesla GPU,可在更短的時間內(nèi)創(chuàng)建和更新適用于自動駕駛汽車的精細地圖,過去要花幾周時間才能完成的過程現(xiàn)在幾乎可以實時完成。
下圖為NVIDIA的端到端完整自動駕駛計算平臺:
Drive PX2已經(jīng)搭載在 Tesla 的量產(chǎn)車型 Model S 以及 Model X 上,大部分已公布的使用 NVIDIA 方案的測試車基本上都搭載的 Drive PX2,如奧迪、沃爾沃和 ZF 等。
百度的自動駕駛Apollo車端為了實現(xiàn)高性能穩(wěn)定的計算,采用的是工業(yè)級PC作為運算單元,配置6th-Gen Intel Core i7/i5 LGA1151 CPU 和NVIDIA GeForce GTX1050* GPU。
雖然GPU的應(yīng)用比較廣泛,但它在深度學習方面也存在著一些局限性,如下:
由于FPGA的計算構(gòu)架可以全定制,功耗低,其并行處理資源可擴展性和靈活性較好,所以它在很大程度上克服了GPU的弱點?,F(xiàn)在FPGA被越來越多的公司關(guān)注,其可編程特性可以滿足專有計算構(gòu)架的需求,微軟、Intel等公司都在大量部署基于FPGA的系統(tǒng)。
FPGA在ADAS(高級駕駛輔助系統(tǒng))方面的出貨量也在迅速增加,去年的出貨量應(yīng)該不會低于3Mu。
【地平線】
2017年初,地平線公司發(fā)布了基于FPGA-BPU的ADAS系統(tǒng),預(yù)計其成本和功耗都將比現(xiàn)有GPU低一個數(shù)量級。從xilinx工程師那了解到,地平線采用的FPGA芯片,和前面介紹的機器人算法加速實踐選擇的是同一款,據(jù)說該系統(tǒng)已被比亞迪自動駕駛汽車采用。
【寶馬&Intel】
去年,寶馬集團攜手Intel共同研發(fā)全自動駕駛解決方案,全新發(fā)布的Intel GO無人駕駛解決方案提供世界級處理器和FPGA技術(shù),以最高效的方式平衡了性能和功耗,同時滿足汽車行業(yè)對散熱和安全性的苛刻要求。
車端:
Intel GO為關(guān)鍵功能提供了可拓展的開發(fā)和計算平臺,包括傳感器聚合、駕駛策略、環(huán)境建模、路徑規(guī)劃和決策。
云端:
Intel GO提供廣泛的技術(shù),包括處理器、FPGA、固態(tài)硬盤和Nervana人工智能平臺等,為無人駕駛行業(yè)所需的機器學習和深度學習提供了強大的訓(xùn)練和模擬基礎(chǔ)設(shè)施。
當然FPGA做深度學習或其它算法加速也有一些問題,比如產(chǎn)品本身迭代比較慢,成本較高等。
四、結(jié)語
回顧過去自動駕駛所使用的計算平臺,可以看到由最開始使用CPU,到后來的GPU,到現(xiàn)在GPU和FPGA的組合使用。機器人領(lǐng)域?qū)μ幚砥鞯倪x擇也基本是這個路線,相信未來算法和芯片會協(xié)同進化,更好的支撐人工智能各領(lǐng)域的發(fā)展。