張量處理單元(tensor processing unit, TPU)
/ T-P-U /
當 Google 意識到,如果每個人每天用語音搜尋幾分鐘,他們光是要跟上就得把整支電腦艦隊翻倍時,他們沒有去買更多通用伺服器——而是打造了一顆只做神經網路所需數學、且做得驚人地好的晶片。張量處理單元(TPU)就是那顆晶片:一個從頭設計來跑深度學習工作負載的領域專用加速器(一顆 ASIC),而那些工作負載絕大多數是大型矩陣乘法。
具體來說,TPU 的核心是一個脈動陣列(systolic array):一大格小型乘加單元(第一代 TPU 是 256 乘 256 的網格,共 65,536 個),矩陣乘法的數字以一波有節奏的、管線化的方式流經其中,每個單元在資料行經時把一對值相乘並加進累計總和。為了餵飽這陣列,TPU 使用大型、由軟體管理的暫存記憶體(scratchpad),而非自動快取,並以降低的精度運算——早期 TPU 乘的是 8 位元整數(int8),後來的用 bfloat16——因為神經網路對低精度容忍度很好。省下的電晶體全部投入更多算術單元,所以一顆 TPU 每秒能做數十兆次乘加。
誠實的說法:TPU 是領域專用架構的教科書範例,它示範了每一條準則——利用該領域的平行性(矩陣乘法)、降到該領域容忍的精度(int8/bfloat16)、用暫存記憶體取代快取、把省下的矽花在算術上。但它在深度學習以外毫無用處,而它真正的瓶頸通常不是算術,而是要夠快地把權重與激活值搬進搬出記憶體,好讓那片龐大的陣列保持忙碌。TPU 之所以說得通,正是因為 Google 擁有一個夠大、夠穩定、足以justify設計自訂矽的工作負載。
一層神經網路計算 output = weights times input,是一個帶數百萬次乘加的矩陣乘法。TPU 把權重一次載入它的脈動陣列,然後讓輸入串流穿過;每個乘加單元每個週期都觸發,所以整片陣列源源不絕地產出結果——每瓦的算術量遠多於一顆逐指令走同樣數學的 CPU。
TPU:一片乘加單元的脈動陣列,以低精度從暫存記憶體餵入——一個為矩陣乘法打造的 DSA。
TPU 不是更快的通用 CPU,甚至也不是更快的 GPU——它是一台固定功能的矩陣乘法引擎。它公布的峰值速率在實務中很少達到,因為極限通常在於持續餵資料給陣列,而非單純的乘法。