過去幾年,最知名、最具備實用價值的ASIC就是TPU了。各類解讀TPU論文內容的文章網上也不少。不過,這些文章更多地是從機器學習或者AI的角度,來說解TPU。算法
上一講,我爲你講解了FPGA和ASIC,講解了FPGA如何實現經過「軟件」來控制「硬件」,以及咱們能夠進一步把FPGA設計出來的電路變成一塊ASIC芯片。編程
不過呢,這些彷佛距離咱們真實的應用場景有點兒遠。咱們怎麼可以設計出來一塊有真實應用場景的ASIC呢?若是要去設計一塊ASIC,咱們應該如何思考和拆解問題呢?今天,我就帶着你一塊兒學習一下,如何設計一塊專用芯片。緩存
黑格爾說,「世上沒有平白無故的愛,也沒有平白無故的恨」。第一代TPU的設計並非異想天開的創新,而是來自於真實的需求。機器學習
從2012年解決計算機視覺問題開始,深度學習一會兒進入了大爆發階段,也一會兒帶火了GPU,NVidia的股價一飛沖天。咱們在第31講講過,GPU天生適合進行海量、函數
並行的矩陣數值計算,因而它被大量用在深度學習的模型訓練上。佈局
不過你有沒有想過,在深度學習熱起來以後,計算量最大的是什麼呢?並非進行深度學習的訓練,而是深度學習的推斷部分。性能
所謂 推斷部分,是指咱們在完成深度學習訓練以後,把訓練完成的模型存儲下來。這個存儲下來的模型,是許許多多個向量組成的參數。而後,咱們根據這些參數,
去計算輸入的數據,最終獲得一個計算結果。這個推斷過程,多是在互聯網廣告領域,去推測某一個用戶是否會點擊特定的廣告;也多是咱們在通過高鐵站的時候,掃一下身份證進行一次人臉識別,判斷一下是否是你本人。學習
雖然訓練一個深度學習的模型須要花的時間很多,可是實際在推斷上花的時間要更多。好比,咱們上面說的高鐵,去年(2018年)一年就有20億人次坐了高鐵,
這也就意味着至少進行了20億次的人臉識別「推斷「工做。優化
因此,第一代的TPU,首先優化的並非深度學習的模型訓練,而是深度學習的模型推斷。這個時候你可能要問了,那模型的訓練和推斷有什麼不一樣呢?主要有三個點。spa
第一點,深度學習的推斷工做更簡單,對靈活性的要求也就更低。
模型推斷的過程,咱們只須要去計算一些矩陣的乘法、加法,調用一些Sigmoid或者RELU這樣的激活函數。這樣的過程可能須要反覆進行不少層,可是也只是這些計算過程的簡單組合。
第二點,深度學習的推斷的性能,首先要保障響應時間的指標。
咱們在第4講講過,計算機關注的性能指標,有響應時間(Response Time)和吞吐率(Throughput)。咱們在模型訓練的時候,只須要考慮吞吐率問題就好了。由於一個模型訓練少則好幾分鐘,
多的話要幾個月。而推斷過程,像互聯網廣告的點擊預測,咱們每每但願能在幾十毫秒乃至幾毫秒以內就完成,而人臉識別也不但願會超過幾秒鐘。很顯然,模型訓練和推斷對於性能的要求是大相徑庭的。
第三點,深度學習的推斷工做,但願在功耗上儘量少一些。
深度學習的訓練,對功耗沒有那麼敏感,只是但願訓練速度可以儘量快,多費點電就多費點兒了。
這是由於,深度學習的推斷,要7×24h地跑在數據中內心面。並且,對應的芯片,要大規模地部署在數據中心。一塊芯片減小5%的功耗,就能節省大量的電費。
而深度學習的訓練工做,大部分狀況下只是少部分算法工程師用少許的機器進行。不少時候,只是作小規模的實驗,儘快獲得結果,節約人力成本。少數幾臺機器多花的電費,
比起算法工程師的工資來講,只能算九牛一毛了。
這三點的差異,也就帶出了第一代TPU的設計目標。那就是,在保障響應時間的狀況下,可以儘量地提升能效比這個指標,也就是進行一樣多數量的推斷工做,花費的總體能源要顯著低於CPU和GPU。
若是你來設計TPU,除了知足上面的深度學習的推斷特性以外,還有什麼是你要重點考慮的呢?你能夠停下來思考一下,而後再繼續往下看。
不知道你的答案是什麼,個人第一反應是,有兩件事情必需要考慮,第一個是TPU要有向前兼容性,第二個是但願TPU可以儘早上線。我下面說說我考慮這兩點的緣由
第一點,向前兼容。在計算機產業界裏,由於沒有考慮向前兼容,慘遭失敗的產品數不勝數。典型的有我在第26講提過的安騰處理器。因此,TPU並無設計成一個獨立的「CPU「,
而是設計成一塊像顯卡同樣,插在主板PCI-E接口上的板卡。
更進一步地,TPU甚至沒有像咱們以前說的現代GPU同樣,設計成本身有對應的取指令的電路,而是經過CPU,向TPU發送須要執行的指令。
這兩個設計,使得咱們的TPU的硬件設計變得簡單了,咱們只須要專心完成一個專用的「計算芯片」就行了。因此,TPU整個芯片的設計上線時間也就縮短到了15個月。
不過,這樣一個TPU,實際上是第26講裏咱們提過的387浮點數計算芯片,是一個像FPU(浮點數處理器)的協處理器(Coprocessor),而不是像CPU和GPU這樣能夠獨立工做的Processor Unit。
明確了TPU總體的設計思路以後,咱們能夠來看一看,TPU內部有哪些芯片和數據處理流程。我在文稿裏面,放了TPU的模塊圖和對應的芯片佈局圖,你能夠對照着看一下
你能夠看到,在芯片模塊圖裏面,有單獨的矩陣乘法單元(Matrix Multiply Unit)、累加器(Accumulators)模塊、激活函數(Activation)模塊和歸一化/池化(Normalization/Pool)模塊。
並且,這些模塊是順序串聯在一塊兒的。
這是由於,一個深度學習的推斷過程,是由不少層的計算組成的。而每個層(Layer)的計算過程,就是先進行矩陣乘法,再進行累加,接着調用激活函數,最後進行歸一化和池化。
這裏的硬件設計呢,就是把整個流程變成一套固定的硬件電路。這也是一個ASIC的典型設計思路,其實就是把肯定的程序指令流程,變成固定的硬件電路。
接着,咱們再來看下面的芯片佈局圖,其中控制電路(Control)只佔了2%。這是由於,TPU的計算過程基本上是一個固定的流程。不像咱們以前講的CPU那樣,有各類複雜的控制功能,好比冒險、分支預測等等。
你能夠看到,超過一半的TPU的面積,都被用來做爲Local Unified Buffer(本地統一緩衝區)(29%)和矩陣乘法單元(Matrix Mutliply Unit)了。
相比於矩陣乘法單元,累加器、實現激活函數和後續的歸一/池化功能的激活管線(Activation Pipeline)也
用得很少。這是由於,在深度學習推斷的過程當中,矩陣乘法的計算量是最大的,計算也更復雜,因此比簡單的累加器和激活函數要佔用更多的晶體管。
而統一緩衝區(Unified Buffer),則由SRAM這樣高速的存儲設備組成。SRAM通常被直接拿來做爲CPU的寄存器或者高速緩存。咱們在後面的存儲器部分會具體講。
SRAM比起內存使用的DRAM速度要快上不少,可是由於電路密度小,因此佔用的空間要大不少。統一緩衝區之因此使用SRAM,是由於在整個的推斷過程當中,它會高頻反覆地被矩陣乘法單元讀寫,來完成計算。
能夠看到,整個TPU裏面,每個組件的設計,徹底是爲了深度學習的推斷過程設計出來的。這也是咱們設計開發ASIC的核心緣由:用特製的硬件,最大化特定任務的運行效率。
除了整個TPU的模塊設計和芯片佈局以外,TPU在各個細節上也充分考慮了本身的應用場景,咱們能夠拿裏面的矩陣乘法單元(Matrix Multiply Unit)來做爲一個例子。
若是你仔細一點看的話,會發現這個矩陣乘法單元,沒有用32 Bits來存放一個浮點數,而是隻用了一個8Bits來存放浮點數。這是由於,在實踐的機器學習應用中,
會對數據作歸一化(Normalization)和正則化(Regularization)的處理。我們畢竟不是一個機器學習課,因此我就不深刻去講什麼是歸一化和正則化了,你只須要知道,這兩個操做呢,會使得咱們在深度學習裏面操做的數據都不會變得太大。一般來講呢,都能控制在-3到3這樣必定的範圍以內。
由於這個數值上的特徵,咱們須要的浮點數的精度也不須要過高了。咱們在第16講講解浮點數的時候說過,32位浮點數的精度,差很少能夠到1/1600萬。
若是咱們用8位或者16位表示浮點數,也能把精度放到2^6或者2^12,也就是1/64或者1/4096。在深度學習裏,經常夠用了。特別是在模型推斷的時候,要求的計算精度,每每能夠比模型訓練低。因此,8 Bits的矩陣乘法器,就能夠放下更多的計算量,使得TPU的推斷速度更快。
那麼,綜合了這麼多優秀設計點的TPU,實際的使用效果怎麼樣呢?無論設計得有多好,最後仍是要拿效果和數聽說話。俗話說,是騾子是馬,總要拿出來溜溜啊。
Google在TPU的論文裏面給出了答案。一方面,在性能上,TPU比如今的CPU、GPU在深度學習的推斷任務上,要快15~30倍。而在能耗比上,更是好出30~80倍。
另外一方面,Google已經用TPU替換了自家數據中內心95%的推斷任務,可謂是拿本身的實際業務作了一個明證。
這一講,我從第一代TPU的設計目標講起,爲你解讀了TPU的設計。你能夠經過這篇文章,回顧咱們過去32講提到的各類知識點。
第一代TPU,是爲了作各類深度學習的推斷而設計出來的,而且但願可以儘早上線。這樣,Google才能節約現有數據中內心面的大量計算資源。
從深度學習的推斷角度來考慮,TPU並不須要太靈活的可編程能力,只要可以迭代完成常見的深度學習推斷過程當中一層的計算過程就行了。因此,TPU的硬件構造裏面,
把矩陣乘法、累加器和激活函數都作成了對應的專門的電路。
爲了知足深度學習推斷功能的響應時間短的需求,TPU設置了很大的使用SRAM的Unified Buffer(UB),就好像一個CPU裏面的寄存器同樣,可以快速響應對於這些數據的反覆讀取。
爲了讓TPU儘量快地部署在數據中內心面,TPU採用了現有的PCI-E接口,能夠和GPU同樣直接插在主板上,而且採用了做爲一個沒有取指令功能的協處理器,就像387之於386同樣,僅僅用來進行須要的各類運算。
在整個電路設計的細節層面,TPU也儘量作到了優化。由於機器學習的推斷功能,一般作了數值的歸一化,因此對於矩陣乘法的計算精度要求有限,
整個矩陣乘法的計算模塊採用了8 Bits來表示浮點數,而不是像Intel CPU裏那樣用上了32 Bits。
最終,綜合了種種硬件設計點以後的TPU,作到了在深度學習的推斷層面更高的能效比。按照Google論文裏面給出的官方數據,它能夠比CPU、GPU快上15~30倍,
能耗比更是能夠高出30~80倍。而TPU,也最終替代了Google本身的數據中內心,95%的深度學習推斷任務。