當前位置:
首頁 > 最新 > 入門NVDLA(下)

入門NVDLA(下)

畫龍仍需點睛……

——子棐

概述

在上篇筆者為各位小夥伴介紹了NVDLA 的硬體結構,其是NVDLA的骨架,而今天要介紹的軟體篇就是NVDLA的血和肉,只有將兩者結合才能承載一個有用的靈魂。

NVDLA擁有一整套的軟體生態予以支撐,就如同前文介紹的一樣,其主要包括了三個方面:

on-device software stack: 與硬體源碼同時發布,提供了模型導入、轉換、執行等功能

TensorRT:提供了將各種模型轉化成支持在NVDLA上運行的格式

NVIDIA GPU和DL軟體:提供了最高校的模型訓練方法

本篇主要會主要介紹兩部分內容,分別是NVDLA的軟體部分以及系統集成模擬工具。

定睛之筆——軟體篇

而與NVDLA密切相關的軟體主要可以根據不同階段分為以下兩個部分:

Compilation Tool: 用於模型轉換

Runtime Environment:用於實時的在NVDLA上載入並執行深度學習應用

整體的系統流程如下圖所示:

Compilation Tool

上圖左側即為Compilation Tool的功能模塊圖,其又包括了兩部分: Parser 和Compiler

Parser主要負責讀取深度學習模型的數據並將其轉化成層級的執行操作,並將這個層級的執行操作序列傳遞給Compiler。目前Parser只支持Caffe模型,未來的Parser將支持所有深度學習框架訓練的模型,包括TensorFlow、Theano等等。Parser並不了解底層DLA的具體硬體信息,但是其可以判斷網路操作是否適用於NVDLA,並予以反饋;與此同時,Parser還可以檢測錯誤的網路結構或者錯誤權值數據信息等等。

Compiler會接受來自於Parser的層級執行操作序列,並根據NVDLA的具體實現將其轉化成硬體執行層。Compiler會把Parsered的網路當作執行圖來解析,其中裡面的每一個節點是網路操作如卷積/池化,而圖的每一條邊為輸入輸出的張量。其主要的工作就是將網路計算操作映射至NVDLA中功能塊以及相應的配置信息。深入了解NVDLA的硬體信息有利於Compile對執行圖進行有效的優化,例如,根據NVDLA實現選擇相應的卷積演算法或者根據Buffer大小將特定操作分隔成幾個子操作等等。這些定製化的優化和操作可以通過參數傳遞至Compiler裡面。

為了有效的執行硬體執行層,Compiler也需要計算每層的內存需求,量化低精度的模型、計算量化信息的內存需求等等,最後Compiler的輸出為一個標準的文件格式——NVDLA Loadable。

對於標準的NVDLA Loadable :

1.每一個硬體執行層都是可以直接運行在NVDLA中的子功能模塊中

2.包含每一個硬體執行層的依賴信息,以及所需的緩存空間

3.包含執行時所需的特殊配置信息

4.包含一個依賴表將所有的硬體層都鏈接在一起,用於執行時調度使用

最重要的是,對於任何NVDLA的硬體實現都可以解析NVDLA Loadable,但並不能保重所有的硬體執行層都可以執行。

Compilation tool 測試工具

./nvdla_compiler [-options] –prototxt

–caffemodel -o

Runtime Enviroment

Runtime Environment由三部分組成,分別是User Mode Driver (UMD)、Kernel Mode Driver (KMD)和DLA HW。UMD和KMD都是以API形式存在並都包括抽象的介面層---portability layer。Portability Layer中包括了所有功能的具體實現以減少在不同平台運行時的區別,因此也必須同時編譯Linux和FreeRTOS以實現完美兼容。

UMD

UMD提供了標準的API用於處理可載入Loadable鏡像,分配輸入輸出的張量單元的內存地址,並提交推理任務至KMD。換句話說就是將存儲目的組織的數據結構轉換成執行流程,並將執行流程作為任務提交給KMD以供執行。

以下是UMD的詳細流程:

創建NVDLA runtime instance

獲取NVDLA設備信息

載入網路數據

獲取輸入輸出張量(特徵矩陣)信息

更新輸入輸出張量(特徵矩陣)信息

為輸入輸出張量(特徵矩陣)分配內存

將內存Handle綁定輸入輸出張量(特徵矩陣)

提交推理任務之KMD

釋放網路資源

KMD

在多進程系統中,KMD會接受了來自於UMD的推理任務,並從多個可執行的任務選擇一個任務提交到核心引擎調度器。核心引擎調度器主要負責硬體傳遞過來的中斷,將硬體執行層調度至每一個功能單元予以執行,並在更新完畢更新執行依賴圖。核心引擎調度器維護一個依賴圖以決定哪些硬體執行層可以被調度執行,這讓編譯器能夠優化整體調度流程並減少不同的KMD帶來的性能差距。

KMD提供了核心引擎調度器介面。KMD的整體流程為:

底層硬體設備初始化

UMD提供需執行任務

寫NVDLA底層寄存器並使能任務執行

接受任務完成的硬體中斷

處理中斷

清理任務和狀態

以上為KMD流程圖,可以看到UMD提交執行任務給KMD,KMD驗證該任務是否是處於HW Layer pending的狀態,如果不是證明已經執行完畢,並傳回UMD。否則會根據不同的pending情況執行相應的操作,例如讀寫的penging、事件的等待等等。對於任務完成底層硬體會傳遞中斷和KMD,KMD會處理中斷並對事件進行處理,如果某個任務也是在等待這個中斷信號,那KMD同時會處理這個等待的任務。事件處理完畢進入HW Layer 完成的狀態。之後還需要回到最開始驗證是否整個任務已經完成,如果完成將提交任務完成信號和UMD。

Runtime 測試工具

完備測試,需要內置輸入數據: ./nvdla_runtime –loadable

網路測試,需要輸入圖片數據: ./nvdla_runtime –loadable –image

服務模式: ./nvdla_runtime -s

裝裱定製——集成篇

常見優化問題

NVDLA該選擇什麼推理精度呢?

在高性能的NVDLA配置中,晶元的大部分面積是用作卷積緩存和MAC單元,因此如何選擇一個好的精度是很重要。對於訓練來所,一般會採用FP32或者混合精度進行訓練,獲得的模型也是FP32的,而在推理時不需要進行反向迭代,可以選擇INT8作為推理精度,而對於某些網路仍然需要選擇FP16精度。

怎麼選擇MAC數量以及所需要的內存帶寬呢?

除了精度以外,另外兩個關鍵的參數是MAC的數量以及內存的帶寬。當配置NVDLA的時候,需要謹慎的配置這兩個參數,因為對於任何神經網路層,其執行的瓶頸無非是計算瓶頸和內存帶寬瓶頸。

MAC數量較為容易確定,例如,卷積層擁有已知的輸入輸出張量大小和Kernel大小。根據這些數據可以計算得出處理該層所需計算力大小。對於一定數量的MAC硬體單元,一層網路所需的總計算性能除以MAC計算單元數即可獲得所需的時鐘周期數。

選擇內存帶寬就比較麻煩了,理想狀態下,其只需要讀取輸入圖片、權重、輸出矩陣一次。最小的總時鐘周期為總的讀寫大小除以帶寬。可是如果卷積緩存太小無法完全緩存前面三部分信息的時候就需要將數據分次讀取,這時候就需要慎重考慮到緩存大小和內存帶寬之間的關係了。

是否需要片上SRAM呢?

如果需要獲得更高的帶寬或者計算性能,可以考慮增加片上SRAM。例如,SRAM可以被認為是二級緩存,它擁有比主內存更高的帶寬。片上SRAM相較卷積層緩存成本更低,但是在系統受限於卷積緩存大小的情況下加上片上SRAM並不能有成倍的性能提升,但是如果是內存帶寬受限的情況下,將整個所需的數據從主內存緩存到SRAM能成倍的提升計算性能。總而言之,增加卷積緩存可以減少帶寬需求,而增加SRAM可以提升總的可用帶寬。

NVDLA常見配置

樣例平台

樣例平台是提供了一個最小的SoC環境以讓用戶觀察、評估和測試NVDLA。 最小的SoC系統配置包括了一個CPU、NVLDA、內存以及中間連接部件。這個平台可以用於軟體開發或者作為一個將NVDLA整合進工業級別SoC的起點。

模擬環境

NVDLA開源包中包括了基於GreenSocs QBox的模擬平台。該平台包括了一個QEMU CPU模型(x86或ARMv8)、NVDLA SystemC 模型,並提供了一個完整的系統以便快速的開發調試軟體。其也包括了基於Linux的KMD和UMD。

FPGA

NVDLA開源包還提供了NVLDA Verilog 模型,其可以導入至FPGA上,是一種在設備中實例化NVDLA的樣例。這個樣例不使用NVDLA SystemC 模型,讀寫操作都是在真實的RTL環境中執行。這為有限的性能評估提供了可能,並可以針對更大、更複雜的網路進行快速的測試。但是FPGA模型僅能用於驗證,並未針對FPGA做任何關於時鐘周期,設計尺寸或者功耗等的優化,因此不可以直接與基於FPGA的深度學習方案進行比較。該模擬樣例是基於Xilinx FPGA,因此可以較為簡單的移植到Vietex系列的設備進行驗證使用。

模型

NVDLA的IP核心設計是基於開放工業標準的,其簡化的設計就是為了方便整合進如何SoC系統之中。如前文樣例平台所說,對於模擬和FPGA環境,其使用不同的模型進行驗證,以下就是這兩種模型的詳細信息。

Verilog模型

提供的是RTL格式的綜合和模擬模型,它包括了四個功能介面:主從介面、中斷匯流排、內部存儲介面、外部存儲介面。主機和內存介面都非常簡單,但是需要外置的匯流排適配器來連接現有的SoC設計,為了方便使用,NVDLA源碼也包括了AXI4和TileLink匯流排適配器。NVDLA源碼中也包括了綜合腳本,為了便於在更複雜的系統或更大型的NVDLA實例上進行物理設計,該設計被分成多個分區,每個分區可以在SoC後端流程中獨立處理。NVDLA內核工作在單個時鐘域; 匯流排適配器可以橫跨內部NVDLA時鐘和匯流排時鐘。NVDLA也是使用單一電源域,並支持粗粒度和細粒度的Power Gating。

模擬模型和驗證套件

NVDLA提供了TLM2 SystemC模擬模型用以軟體開發,系統集成和測試。相較於結合signal-stimulus的RTL模型,這個模型可以運行的更快。SystemC模型是用於Full-Soc模擬環境中,例如Synopsys VDK或者提供的GreenSocs QBox平台,並且可以直接與RTL模型進行比較。不僅如此,SystemC模擬模型可以和NVDLA測試平台和套件一起使用。輕量級的trace-player-based的測試平台適用於簡單綜合以及進行健康驗證,具有單元測試的完整驗證環境將在後續版本中提供。驗證套件用於保證在tape-out前設計的完備性,主要包括了完成編譯的RAMs的驗證,Clock-gating以及scan-chain insertion。未來其還能驗證對NVDLA其他的修改和配置。

路標

以下為NVDLA源碼中已經發布的內容:

2018年前半年即將發布的內容包括:

END

關於NVDLA的介紹到此就告一段落了,上篇主要介紹了NVDLA的硬體以及對外的介面,下篇主要介紹了怎麼驅動NVDLA的硬體以及集成模擬環境。

關於NVDLA的硬體,其對外的介面主要為中斷匯流排、控制匯流排、內/外存儲介面。晶元內部包括了各種不同的硬體單元,每個硬體單元其可以單獨工作亦可以組合工作。

如果需要將一個模型運行到NVDLA上,首先需要使用Parser和編譯器將模型編譯成NVDLA可識別的NVDLA Loadable格式,其中包括所有的硬體執行層,相應的配置信息,層間依賴等等信息,這個NVDLA Loadable是與硬體無關的,因此無論什麼配置的NVDLA都需要能夠讀取該文件(但不一定都能執行)。之後由UMD讀取該Loadable文件,創建執行實例,讀取模型文件數據並將生成的推理任務提交給KMD,這邊提交的是一個執行流程包括了數據,硬體執行層依賴圖等信息。KMD接收到執行任務後,根據執行流程對任務進行調度,通過寫硬體寄存器將任務配置寫入硬體中,並通過使能信號使能硬體執行計算任務,處理硬體完成產生的中斷,在完成整體執行任務後將結果提交給UMD並回溯到上層處理。

如果需要對系統進行模擬和驗證有兩種方式,分別是在FPGA上運行的的Verilog RTL和GreenSocs QBox上運行System C模型。其中前者現提供的是Full-precision RTL,由於太大在獨立的FPGA無法直接使用,如果需要使用得等待後續GA小配置版本的RTL模型。而System C模型相較於RTL運行更快,可以直接模擬模擬使用並可以直接基於它進行軟體開發,同時還提供了驗證套件以保證系統的配置的正確性。

不知道各位小夥伴有什麼想了解的內容,歡迎各位投稿「點文章」喲!!!

以上

子棐


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 子棐之GPGPU 的精彩文章:

TAG:子棐之GPGPU |