蘇州做商城網(wǎng)站設(shè)計(jì)快推廣app下載
前言
大家好,我是jiantaoyab,上篇文章講了FPGA和ASIC,講解了 FPGA 如何實(shí)現(xiàn)通過“軟件”來控制“硬件”,以及我們可以進(jìn)一步把 FPGA 設(shè)計(jì)出來的電路變成一塊 ASIC 芯片。今天我們來看看TPU。大家可以點(diǎn)擊這篇文章TPU深入了解TPU。
TPU解決什么問題?
深度學(xué)習(xí)中計(jì)算量最大的過程其實(shí)是推斷的過程。
推斷部分,是指我們在完成深度學(xué)習(xí)訓(xùn)練之后,把訓(xùn)練完成的模型存儲(chǔ)下來。這個(gè)存儲(chǔ)下來的模型,是許許多多個(gè)向量組成的參數(shù)。然后,我們根據(jù)這些參數(shù),去計(jì)算輸入的數(shù)據(jù),最終得到一個(gè)計(jì)算結(jié)果。
這個(gè)推斷過程,可能是在互聯(lián)網(wǎng)廣告領(lǐng)域,去推測某一個(gè)用戶是否會(huì)點(diǎn)擊特定的廣告;也可能是我們在經(jīng)過高鐵站的時(shí)候,掃一下身份證進(jìn)行一次人臉識(shí)別,判斷一下是不是你本人。
第一代的 TPU,首先優(yōu)化的并不是深度學(xué)習(xí)的模型訓(xùn)練,而是深度學(xué)習(xí)的模型推斷。
這個(gè)時(shí)候你可能要問了,那模型的訓(xùn)練和推斷有什么不同呢?主要有三個(gè)點(diǎn)。
第一點(diǎn),深度學(xué)習(xí)的推斷工作更簡單,對靈活性的要求也就更低。模型推斷的過程,我們只需要去計(jì)算一些矩陣的乘法、加法,調(diào)用一些 Sigmoid 或者 RELU 這樣的激活函數(shù)。這樣的過程可能需要反復(fù)進(jìn)行很多層,但是也只是這些計(jì)算過程的簡單組合。
第二點(diǎn),深度學(xué)習(xí)的推斷的性能,首先要保障響應(yīng)時(shí)間的指標(biāo)。計(jì)算機(jī)關(guān)注的性能指標(biāo),有響應(yīng)時(shí)間(Response Time)和吞吐率(Throughput)。我們在模型訓(xùn)練的時(shí)候,只需要考慮吞吐率問題就行了。因?yàn)橐粋€(gè)模型訓(xùn)練少則好幾分鐘,多的話要幾個(gè)月。而推斷過程,像互聯(lián)網(wǎng)廣告的點(diǎn)擊預(yù)測,我們往往希望能在幾十毫秒乃至幾毫秒之內(nèi)就完成,而人臉識(shí)別也不希望會(huì)超過幾秒鐘。很顯然,模型訓(xùn)練和推斷對于性能的要求是截然不同的。
第三點(diǎn),深度學(xué)習(xí)的推斷工作,希望在功耗上盡可能少一些。深度學(xué)習(xí)的訓(xùn)練,對功耗沒有那么敏感,只是希望訓(xùn)練速度能夠盡可能快,多費(fèi)點(diǎn)電就多費(fèi)點(diǎn)兒了。這是因?yàn)?#xff0c;深度學(xué)習(xí)的推斷,要 7×24h 地跑在數(shù)據(jù)中心里面。而且,對應(yīng)的芯片,要大規(guī)模地部署在數(shù)據(jù)中心。一塊芯片減少 5% 的功耗,就能節(jié)省大量的電費(fèi)。而深度學(xué)習(xí)的訓(xùn)練工作,大部分情況下只是少部分算法工程師用少量的機(jī)器進(jìn)行。很多時(shí)候,只是做小規(guī)模的實(shí)驗(yàn),盡快得到結(jié)果,節(jié)約人力成本。少數(shù)幾臺(tái)機(jī)器多花的電費(fèi),比起算法工程師的工資來說,只能算九牛一毛了。
這三點(diǎn)的差別,也就帶出了第一代 TPU 的設(shè)計(jì)目標(biāo)。那就是,在保障響應(yīng)時(shí)間的情況下,能夠盡可能地提高能效比這個(gè)指標(biāo),也就是進(jìn)行同樣多數(shù)量的推斷工作,花費(fèi)的整體能源要顯著低于 CPU 和 GPU。
FPU 的設(shè)計(jì)
專用電路和大量緩存,適應(yīng)推斷的工作流程
TPU并沒有設(shè)計(jì)成一個(gè)獨(dú)立的“CPU“,而是設(shè)計(jì)成一塊像顯卡一樣,插在主板 PCI-E 接口上的板卡。
更進(jìn)一步地,TPU 甚至沒有像我們之前說的現(xiàn)代 GPU 一樣,設(shè)計(jì)成自己有對應(yīng)的取指令的電路,而是通過 CPU向 TPU 發(fā)送需要執(zhí)行的指令。
在芯片模塊圖里面,有單獨(dú)的矩陣乘法單元(Matrix Multiply Unit)、累加器(Accumulators)模塊、激活函數(shù)(Activation)模塊和歸一化 / 池化(Normalization/Pool)模塊。而且,這些模塊是順序串聯(lián)在一起的。
這是因?yàn)?#xff0c;一個(gè)深度學(xué)習(xí)的推斷過程,是由很多層的計(jì)算組成的。而每一個(gè)層(Layer)的計(jì)算過程,就是先進(jìn)行矩陣乘法,再進(jìn)行累加,接著調(diào)用激活函數(shù),最后進(jìn)行歸一化和池化。
硬件的設(shè)計(jì)就是把整個(gè)流程變成一套固定的硬件電路。這也是一個(gè) ASIC 的典型設(shè)計(jì)思路,其實(shí)就是把確定的程序指令流程,變成固定的硬件電路。
控制電路(Control)只占了 2%。這是因?yàn)?#xff0c;TPU 的計(jì)算過程基本上是一個(gè)固定的流程。不像CPU 那樣,有各種復(fù)雜的控制功能,比如冒險(xiǎn)、分支預(yù)測等等。
超過一半的 TPU 的面積,都被用來作為 Local Unified Buffer(本地統(tǒng)一緩沖區(qū))(29%)和矩陣乘法單元(Matrix Mutliply Unit)了。
相比于矩陣乘法單元,累加器、實(shí)現(xiàn)激活函數(shù)和后續(xù)的歸一 / 池化功能的激活管線(Activation Pipeline)也用得不多。
這是因?yàn)?#xff0c;在深度學(xué)習(xí)推斷的過程中,矩陣乘法的計(jì)算量是最大的,計(jì)算也更復(fù)雜,所以比簡單的累加器和激活函數(shù)要占用更多的晶體管。
而統(tǒng)一緩沖區(qū)(Unified Buffer),則由 SRAM 這樣高速的存儲(chǔ)設(shè)備組成。SRAM 一般被直接拿來作為 CPU 的寄存器或者高速緩存。
SRAM 比起內(nèi)存使用的 DRAM 速度要快上很多,但是因?yàn)殡娐访芏刃?#xff0c;所以占用的空間要大很多。統(tǒng)一緩沖區(qū)之所以使用 SRAM,是因?yàn)樵谡麄€(gè)的推斷過程中,它會(huì)高頻反復(fù)地被矩陣乘法單元讀寫,來完成計(jì)算。
在性能上,TPU 比現(xiàn)在的 CPU、GPU 在深度學(xué)習(xí)的推斷任務(wù)上,要快 15~30 倍。而在能耗比上,更是好出 30~80 倍。另一方面,Google 已經(jīng)用 TPU 替換了自家數(shù)據(jù)中心里 95% 的推斷任務(wù)。
30 倍。而在能耗比上,更是好出 30~80 倍。另一方面,Google 已經(jīng)用 TPU 替換了自家數(shù)據(jù)中心里 95% 的推斷任務(wù)。