題圖:2020年5月黃仁勳從自家烤箱中端出“世界上最大的顯卡”——NVIDIA A100。
按語:簡中關于英偉達、加速計算、數據中心、以及CPU/GPU/DPU/TPU各種XPU的内容實在太少了,券商研報大多集中在“遊戲+數據中心雙輪驅動”、“搭建生态”、“研發為體、AI為翼”……之類似是而非的東西。這種知識荒漠的感覺非常令人困惑。這個周末做了不少elaborating,看了大量英文資料,稍微理出來一點。
說實話我也是一名韭菜,前幾年炒币熱和元宇宙熱的時候知道了之家公司,後來元宇宙泡沫破裂,NVDA業績不及預期,我以為就結束了,并沒有真正意識到這家公司的價值。直到今年業績股價雙雙炸裂,才開始重新關注這家公司。我越來越意識到,人類的未來就在這些公司,我們做不了人家做的事,但至少要知道人家在做什麼。
CUDA Core(CUDA核)是被應用于GPU中完成計算任務的一個個最小的單元(Processing Unit)。有些文章說GPU的CUDA核與CPU的核沒有分别。這話大體上沒錯,CUDA core和CPU core本質上是同一個東西,都是運算處理器,即Processing Unit。
而兩者的不同就在于,從設計思想上,GPU的理念是讓每個核去做很簡單的事,并同時有很多個核在做事。這個理念就是大名鼎鼎的并行計算(Parallel Computing)。而CPU的理念是讓每個核做很複雜的事,而同時做事的核數量并不多。
既然這樣,那為什麼不叫CPU核,或者簡單點就叫“核”,而要叫CUDA核?這就要談談CUDA是個什麼東西。
CUDA四個字的意思是Compute Unified Device Architecture,中文意思是“統一的計算設備架構”。
CUDA的精髓其實在于Unified這個字。
CUDA的理念最先于2006年被英偉達提出。在此之前,英偉達于1999年首先推出GPU,即圖像處理器(Graphics Processing Unit),于2003年首先将GPU用于非圖像處理領域,包含蛋白質編碼、股票期權定價、數據庫調用等,提出了通用目的圖像處理器(General Purpose GPU,也叫GPGPU)的理念。
但是這些領域對GPU的使用需要涉及API接口以及算法語言,例如DirectX、OpenGL以及Cg等,因此會造成幾大困難:(1)程序員需要具有相當多的關于API接口和GPU架構的知識才能完成編程;(2)應用領域的具體問題需要被“轉譯”為矩陣坐标、材質、着色等語言才能被GPU所“聽得懂”,因此極大地增加了使用的複雜性;(3)GPU不支持基礎的編程特征,例如随機讀寫等;(4)不支持雙精度導緻了許多科學領域應用無法在GPU上面跑。這些問題使得英偉達在2006年做出創新。
(英偉達GeForce 7900芯片結構,也就是在Tesla架構推出之前的久遠年代的産品形态)2006年,英偉達做了兩件事,第一是推出了“統一”(Unified)的架構“Tesla”,以及具有劃時代意義的顯卡系列G80,具體産品上,最初是GeForce 8800、Quadro FX 5600和Tesla C870。(注意這裡的Tesla是英偉達的架構名稱,不是那個汽車品牌,“架構”的英文是Architecture)第二件事是上線了CUDA平台——這是一個軟硬件結合的架構平台;在CUDA的幫助下,GPU變得更加“可編程”(programmable),也就是可以用相對高級的語言,主要是C、C++、和Fortain。至此極大地降低了程序員為GPU編程的難度和複雜度。而在GPU顯卡中完成簡單計算任務的每一個處理單元(Processing Unit)就被叫做CUDA core。(英偉達基于Tesla架構G80平台GeForce GTX 8800顯卡結構,可以看出與上一幅圖的7900有本質上的不同)第一代Tesla架構(也就是G80系列)顯卡中有多少個CUDA核呢?128個。到2008年,英偉達對Tesla架構進行了一次升級,推出GT200系列,産品層面推出GeForce GTX 280, Quadro FX 5800和Tesla T10,這些顯卡搭載CUDA核的數量提升到240個。到近代推出的顯卡産品中,CUDA核的數量已經成千上萬,例如GeForce RTX 4090這張顯卡上面就集成了16384個CUDA核!伴随着核數的增加,運算速度與運算效率都極大地提升!概括而言,CUDA核與傳統CPU的核沒有本質區别,完成純量計算(Scalar Computing),但是比傳統CPU核的計算任務簡單,以數量取勝。在英偉達的CUDA平台下,開發者可以對其編程,已完成specific的計算任務。(純量計算與張量計算的概念後面介紹)那麼Tensor Core(Tensor核)又是為何物?Tensor是數學概念,叫做“張量”,是線性代數裡面比較難的部分。簡化來講,可以把張量理解為多維空間裡面的矩陣。舉個最實際的例子,股票的K線圖其實就是一個巨大的張量。以天為單位,每天有開高低收四個價格,這就形成了一個四維矩陣,而1年365天每天都有開高低收四個價格,這就加了一個維度,即時間。而不同的股票又增加了一個維度。而每隻股票又有許許多多個期權構成的期權鍊,這又增加了許多維度。而每個因素動一動,所有其它變量都要跟着動,所以這裡涉及的計算量是極大的。當然股票這裡還有分形學的問題,即不同的時間周期都能形成自己的張量,也就是我們常說的分鐘K線,小時K線之類的。這無疑使得問題更加複雜。因此張量計算就是處理N維矩陣之間的計算,而張量核(Tensor Core)的特征就是每次個時鐘周期都完成一次N維矩陣的張量計算。這裡的N可能不止四維五維,有可能是成百上千,甚至是幾萬或幾億。這取決于具體Tensor Core的算力。因此張量核的數據流通量是巨大的,而當初為圖像圖形處理而設計的CUDA核就無法滿足張量計算的龐大工作量。這張圖生動地诠釋了張量計算(Tensor)與純量計算(Scalar)和矢量計算(Vector)之間的差别。圖中第一個Pascal架構純量計算,而後三個是不同精度Tensor Core的Turing架構矢量計算因此,于2017年,英偉達推出第一代Tensor Core,以及基于Tensor Core的架構——Volta和V100産品系列。V100搭載了640個Tensor核,平均計算速度是此前Pascal架構下GPU産品的5倍。(英偉達平均每兩年更新一代架構,因此從2006年到2017年之間經曆了五次架構升級,分别是Tesla、Fermi、Kepler、Maxwell、Pascal。到2017年Volta架構取代Pascal架構。)純量計算的Pascal架構與張量計算的Volta架構2017年至今的6年間,英偉達進行了3次Tensor核架構的換代升級,分别是2018年推出的Turing架構(T100系列)、2020年的Ampere架構(A100系列),以及2022年新鮮熱辣的Hopper架構(H100系列)。最後這些名字大家聽着耳熟能詳,這已經是很近代的事了。當然,基于CUDA核處理純量計算的強大能力,目前遊戲顯卡和筆記本顯卡中依然在使用CUDA核,就像前面提到的比較晚近的産品像RTX 4090中,用到的CUDA核的數量普遍成千上萬。但是在涉及機器學習(Machine Learning)和深度學習(Deep Learning)等領域,則Tensor核的優勢就更加明顯,因而使用也更加廣泛了。例如英偉達為其大型企業客戶提供的使用A100或H100芯片的人工智能計算平台DGX系列,毫無疑問是在用Tensor核。
自Volta起至Hopper架構下各自使用CUDA Core與Tensor Core所支持的計算精度列表最後的一個問題是:英偉達的基于Tensor Core的GPU與Google在早些年(例如2016年AlphaGo)推出的Tensor Processing Unit(TPU)有什麼分别?簡單的理解是這樣的:Google的TPU是一種專用集成電路(Application-Specific Integrated Circuit,ASIC),而英偉達的GPU畢竟還是GPU。GPU的特點最初是擅長圖像處理,後來在英偉達手中被打造成了萬能神器,尤其是配合上編程平台CUDA——而Tensor Core是對最初的CUDA Core的運算速度和運算精度進行了升級。而TPU則是專門為機器學習和深度學習等目的而設計的結構,它在一定程度上降低了計算精度(Precision)的要求,而提升了信息流通量(Throughput),同時TPU的内部帶寬也較GPU有所提升,以便更好地進行高維度張量的計算;相反TPU的内部存儲量則有所降低。總之,GPU是高度靈活的處理器,可以根據使用者的編程去完成多種任務;而TPU是Google公司專門為神經元網絡機器學習的目的而打造的專用集成電路。GPU在一定程度上可以完成TPU的任務,但結果也許不如TPU理想,花費的時間可能也比TPU更長。反過來讓TPU去處理圖形則可能會比較糟糕。Google前兩代TPU(2015-2017年)主要for公司内部使用,自2018年開始推出第三代TPU開始外銷。在這裡可以看到,巨頭之間的競争從來都是很激烈的,彼此之間就差一兩個身位,将來哪天一旦神經元網絡領域搞出什麼落地的類似ChatGPT的東西,Google分分鐘變成一個小英偉達也絕對是情理之中。