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

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

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

    谷歌TPU概述和簡化python

    TPU中的脈動陣列及其實現git

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

    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以後再利用一次乘加計算完成。

相關文章
相關標籤/搜索