深度學習飛速發展過程當中,人們發現原有的處理器沒法知足神經網絡這種特定的大量計算,大量的開始針對這一應用進行專用芯片的設計。谷歌的張量處理單元(Tensor Processing Unit,後文簡稱TPU)是完成較早,具備表明性的一類設計,基於脈動陣列設計的矩陣計算加速單元,能夠很好的加速神經網絡的計算。本系列文章將利用公開的TPU V1相關資料,對其進行必定的簡化、推測和修改,來實際編寫一個簡單版本的谷歌TPU,以更確切的瞭解TPU的優點和侷限性。html
谷歌TPU概述和簡化python
神經網絡中的歸一化和池化的硬件實現github
拓展性能
TPU的邊界(規劃中)學習
從新審視深度神經網絡中的並行(規劃中)優化
在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)。
從上往下看,這一套解決方案包括
這意味着想真正使用以前設計的神經網絡加速器——SimpleTPU,還須要軟件的配合。即使模型壓縮不在考慮範圍內,也須要將模型量化爲int8精度(SimpleTPU只支持int8乘法),同時利用Compiler生成指令序列。受限於我的能力,因爲配套軟件的缺失,下面的例子中的量化和指令均由手工生成。也正是因爲這一緣由,網絡結構會盡量簡單,僅以保證本系列文章完整性爲目的。
利用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已經寫好,直接運行便可),仿真結果以下圖所示
前16張圖的分類結果以下圖所示
根據計算結果,能夠分析獲得其效率爲84%。(去除了13K個用於讀取圖片和寫回結果的時間,實際應用中,這一事件也會被計算時間覆蓋)
LOC | Layers | Nonlinear function | Weights | Batch Size | % of Deployed |
2 | 2 FC | Relu | 5M | 512 | 16% |
做爲參考,谷歌TPU中的數值爲(儘管Simple TPU效率較高,但因爲規模不一樣,沒法直接對比效率;因爲SimpleTPU徹底按TPU設計,實際性能不可能高於TPU)
經過仿真波形,能夠更直觀的看出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,能夠採用指令之間的流水設計來消除這一延時。
因爲手工對神經網絡進行量化和layer間融合以及生成指令的複雜性,基於CNN的圖像分類/分割網絡的運行實例被無限期暫停了。
可是一個卷積計算的實例已經在TPU中的脈動陣列及其實現中給出,證實了SimpleTPU計算卷積的能力。
根據Simple TPU的設計和性能評估給出的特性,SimpleTPU能夠高效支持絕大多數Operator,完成計算機視覺中的多種任務。固然,最大的缺陷在於SimpleTPU不顯式支持ResNet,沒法直接計算residual connection中的加法;只能進行channel concatenate以後再利用一次乘加計算完成。