神經網絡加速器應用實例:圖像分類


深度學習飛速發展過程中,人們發現原有的處理器無法滿足神經網絡這種特定的大量計算,大量的開始針對這一應用進行專用芯片的設計。谷歌的張量處理單元(Tensor Processing Unit,后文簡稱TPU)是完成較早,具有代表性的一類設計,基於脈動陣列設計的矩陣計算加速單元,可以很好的加速神經網絡的計算。本系列文章將利用公開的TPU V1相關資料,對其進行一定的簡化、推測和修改,來實際編寫一個簡單版本的谷歌TPU,以更確切的了解TPU的優勢和局限性。

動手寫一個神經網絡加速器系列目錄

    谷歌TPU概述和簡化

    TPU中的脈動陣列及其實現

    神經網絡中的歸一化和池化的硬件實現

    TPU中的指令並行和數據並行

    Simple TPU的設計和性能評估

    SimpleTPU實例:圖像分類

    拓展

    TPU的邊界(規划中)

    重新審視深度神經網絡中的並行(規划中)

 

1. 不僅僅是硬件的AI Inference

    在Simple TPU的設計和性能評估中,一個神經網絡加速器的硬件雛形已經搭建完成了;在https://github.com/cea-wind/SimpleTPU上給出了相應的代碼,和RTL仿真結果。在TPU中的脈動陣列及其實現神經網絡中的歸一化和池化的硬件實現中,針對硬件實現中的關鍵模塊也進行了仿真分析。但是,最終並沒有給出一個可以實際運行的例子。這意味着,即使將這一部分代碼應用到FPGA上,或者是實現在ASIC上后,也只有紙面性能卻並不可用。

    和很多其他的硬件設計不同,以Xilinx的AI Inference 解決方案為例(即之前的深鑒科技),用於AI Inference的設計需要考慮神經網絡計算中的多樣性,神經網絡加速器是一個軟件+硬件的解決方案。Xilinx敘述如下圖(原始鏈接:https://www.xilinx.com/products/design-tools/ai-inference.html)。

image

    從上往下看,這一套解決方案包括

  •     主流的神經網絡的框架的支持,包括caffe、Tensorflow和mxnet
  •     提供模型壓縮和優化的工具,以期在硬件上又更好的效能
  •     提供模型量化的功能,使得浮點模型轉化為定點模型
  •     提供了Compiler,將模型映射為二進制指令序列
  •     和Compiler相結合的Hardware

     這意味着想真正使用之前設計的神經網絡加速器——SimpleTPU,還需要軟件的配合。即便模型壓縮不在考慮范圍內,也需要將模型量化為int8精度(SimpleTPU只支持int8乘法),同時利用Compiler生成指令序列。受限於個人能力,由於配套軟件的缺失,下面的例子中的量化和指令均由手工生成。也正是由於這一原因,網絡結構會盡可能簡單,僅以保證本系列文章完整性為目的。

2. MLP分類實例

    利用MLP對MNIST數據集進行手寫數字分類的網絡結構定義如下

class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.hidden = nn.Linear(784,64)
        self.fc = nn.Linear(64,10)

    def forward(self, x):
        x = x.view(-1,784)
        x = self.hidden(x)
        x = self.fc(x)
        return F.log_softmax(x, dim=1)

    生成指令后將其作為SimpleTPU的輸入,並對其進行RTL仿真(testbench已經寫好,直接運行即可),仿真結果如下圖所示

result

    前16張圖的分類結果如下圖所示

result

    根據計算結果,可以分析得到其效率為84%。(去除了13K個用於讀取圖片和寫回結果的時間,實際應用中,這一事件也會被計算時間覆蓋)

LOC Layers Nonlinear function Weights Batch Size % of Deployed
2 2 FC Relu 5M 512 16%

    作為參考,谷歌TPU中的數值為(盡管Simple TPU效率較高,但由於規模不同,無法直接對比效率;由於SimpleTPU完全按TPU設計,實際性能不可能高於TPU

image

3. MLP運行分析

    通過仿真波形,可以更直觀的看出SimpleTPU的運行狀態。下圖中,讀取Weight、乘加運算單元和Pooling共同工作可以反應TPU中的指令並行和數據並行中提到的指令並行。(由上倒下的ap_start分別是MXU,POOL,LOAD WEIGHT和INSTR FETCH的工作指示信號,同時拉高代表同時工作)

    觀察MXU內部的信號,可以看到計算過程中的數據並行(一條指令控制多組數據,且一個周期完成多組計算)。MXU每個周期都輸出psum取值,一共有32個psum,計算一個psum需要32次乘加計算。

 

    SimpleTPU為什么不夠快(效率並沒有接近100%)?這一問題可有下面的仿真波形看出(每次MXU啟動前后都有若干個周期沒有輸出有效結果)

    由於每次MXU執行一條向量計算指令會又若干個空閑的周期(超過64個周期,損失了10%以上的性能),導致了SimpleTPU在這一個網絡上性能只有84%。MXU在啟動之前需要32個周期來填滿整個脈動陣列,而在輸入結束后還需要32個周期來輸出最后的結果。當采用HLS編寫代碼是,難以以這一控制力度來優化MXU的性能。如果采用Verilog HDL或者VHDL,可以采用指令之間的流水設計來消除這一延時。

4. CNN

    由於手工對神經網絡進行量化和layer間融合以及生成指令的復雜性,基於CNN的圖像分類/分割網絡的運行實例被無限期暫停了。

    但是一個卷積計算的實例已經在TPU中的脈動陣列及其實現中給出,證明了SimpleTPU計算卷積的能力。

    根據Simple TPU的設計和性能評估給出的特性,SimpleTPU可以高效支持絕大多數Operator,完成計算機視覺中的多種任務。當然,最大的缺陷在於SimpleTPU不顯式支持ResNet,無法直接計算residual connection中的加法;只能進行channel concatenate之后再利用一次乘加計算完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM