整理|核子可樂、冬梅
編者按:
最近,在 NVIDIA 的一次內(nèi)部對話中,英偉達(dá)的三位員工 Nader、Stephen 和 Carter 三位員工分享了他們對 CUDA 技術(shù)的發(fā)展歷程及其在計(jì)算科學(xué)和 AI 領(lǐng)域的應(yīng)用的見解。Stephen,作為 CUDA 架構(gòu)師之一,回顧了 CUDA 的早期發(fā)展,包括團(tuán)隊(duì)如何在初期面對圖形團(tuán)隊(duì)的質(zhì)疑和挑戰(zhàn)。他講述了 CUDA 如何從一個內(nèi)部初創(chuàng)項(xiàng)目發(fā)展成為推動圖形和計(jì)算領(lǐng)域創(chuàng)新的關(guān)鍵技術(shù)。
Stephen 還解釋了在 CUDA 之前,開發(fā)者如何通過 OpenGL 和 DirectX 等技術(shù)與 GPU 交互,以及 CUDA 的出現(xiàn)如何改變了游戲開發(fā)和視覺效果的實(shí)現(xiàn)方式。
此外,Stephen 還提到了英偉達(dá)在并行計(jì)算方面的前瞻性,早在 90 年代,英偉達(dá) CEO 黃仁勛(Jensen)就預(yù)見到了并行化的潛力。他解釋了當(dāng)時(shí)圖形架構(gòu)的競爭,以及英偉達(dá)如何通過專用芯片提高性能,最終形成了如今的多線程機(jī)器。
Carter,物理學(xué)背景出身,分享了 CUDA 如何幫助物理學(xué)家突破計(jì)算極限,特別是在天氣預(yù)報(bào)和計(jì)算生物學(xué)等領(lǐng)域。他提到,盡管最初物理學(xué)家對 CUDA 的多線程設(shè)計(jì)持保留態(tài)度,但隨著計(jì)算需求的增長,他們逐漸接受了這一技術(shù)。
在這場談話中,Nader、Carter 和 Stephen 深入探討了英偉達(dá)的技術(shù)發(fā)展、CUDA 的演進(jìn)以及公司在計(jì)算科學(xué)和 AI 芯片領(lǐng)域的主導(dǎo)地位。但在他們的談話,InfoQ 讀到了他們透露出來的另一個訊號,也是黃仁勛曾在公開場合反復(fù)提到的:英偉達(dá)現(xiàn)在是一家以軟件為核心的公司。
事實(shí)上,英偉達(dá)的加速計(jì)算組(Accelerated Computing Group)負(fù)責(zé)人 Dave Salvator 去年曾在公開場合提到過,英偉達(dá)的代碼工程師人數(shù)是其硬件工程師人數(shù)的兩倍。
以下內(nèi)容為 InfoQ 根據(jù)視頻采訪實(shí)錄翻譯整理,經(jīng)編輯:
Nader:我們是來自英偉達(dá)公司的 Nader、Stephen 和 Carter。在英偉達(dá)工作的最大收獲,就是有機(jī)會結(jié)識 Stephen 這樣出色的人物。這個系列節(jié)目的標(biāo)題是“英偉達(dá)是家軟件公司”,希望強(qiáng)調(diào)我們軟硬件工程結(jié)合的身份。
Stephen: 是的,我們現(xiàn)在有最多的軟件工程師和硬件工程師。 我記得幾年之前 CEO 黃仁勛曾經(jīng)說過,“英偉達(dá)不再是一家硬件公司,而是一家軟件公司”。 這話一點(diǎn)沒錯。
Nader:相信大家都聽說過 CUDA,還有它對開發(fā)人員的重要意義。Stephen,你是 CUDA 團(tuán)隊(duì)的一員吧?
Stephen:沒錯,我是 CUDA 團(tuán)隊(duì)的架構(gòu)師,而且從 2008 年開始就參與這個項(xiàng)目了。最初團(tuán)隊(duì)里只有 12 個人,那段經(jīng)歷非常有趣。
記得我當(dāng)初就是隨機(jī)加入了英偉達(dá)內(nèi)部的團(tuán)隊(duì),當(dāng)時(shí)大家的工作就是用顯卡 GPU 做計(jì)算。結(jié)果剛一入職,我就發(fā)現(xiàn)大家都?xì)夂艉舻摹!罢Φ牧诉@是?”我完全搞不清狀況。后來才知道,當(dāng)時(shí)所有人都會用 3D Mark 基準(zhǔn)測試來給硬件跑分,而 CUDA 會占用掉 10% 的 GPU 資源。所有圖形開發(fā)同事都說“它讓 3D Mark 得分低了 10%”,而且為此惱怒不已。我真的沒想到自己也會被卷進(jìn)來。
但諷刺的是,如今的 GPU 保持著 90% 可編程、10% 固定功能的設(shè)計(jì)比例,相當(dāng)于跟當(dāng)初的情況完全顛倒了。我們在 CUDA 身上傾注的心血,最終在游戲等各類用例下都在發(fā)揮作用。
CUDA 曾因占用 10% 內(nèi)存被嫌棄
Nader:那在 CUDA 出現(xiàn)之前,GPU 是什么樣的?人們怎樣與之交互,游戲開發(fā)者又在其中扮演什么角色?
Stephen:當(dāng)時(shí)有 OpenGL 和 DirectX,它們誕生于 2000 年左右。雖然我不是圖形專家,但大致上開發(fā)者會構(gòu)建容納 3D 對象的場景并進(jìn)行沉浸。OpenGL 就是構(gòu)造這些場景、實(shí)現(xiàn)矩陣旋轉(zhuǎn)的工具。之后 OpenGL 開始提供一些可編程的小腳本,這樣開發(fā)者就能實(shí)現(xiàn)幾何體變形之類的效果。這種可編程性當(dāng)時(shí)被稱為可編程著色器,是 GPU 上最早的無固定功能硬件——也可以說是后來可編程設(shè)計(jì)的起源。
CUDA 的發(fā)明者是斯坦福大學(xué)的 Ian Buck,他想出了如何將普通編譯器映射為可編程形式。他在英偉達(dá)實(shí)習(xí)時(shí)說服了 Jensen,強(qiáng)調(diào)這只會占用芯片 10% 的資源。但正因?yàn)槿绱耍聜儾盘貏e不爽。但現(xiàn)在回想起來,這不就是圖形開發(fā)人員強(qiáng)調(diào)的“動態(tài)可編程著色、幾何圖形能創(chuàng)造出更好的游戲畫面,更好的視覺效果”嗎?總之我們開始像設(shè)計(jì)計(jì)算系統(tǒng)那樣設(shè)計(jì)圖形系統(tǒng),包含函數(shù)、循環(huán)、變量和 C 編譯器。
一切的開始源于固定函數(shù)渲染。固定函數(shù)渲染代表我們可以將網(wǎng)格傳遞到硬件,由硬件中的機(jī)制處理這些三角形并顯示在屏幕上。但在傳遞給硬件之前,這些函數(shù)大半都存放在軟件當(dāng)中。正因?yàn)槿绱耍琌penGL 和 DirectX 的驅(qū)動程序才特別復(fù)雜。各種東西中都需要內(nèi)置編譯器,確保硬件本身始終以最高速度顯示出最多的三角形。
如今,我們已經(jīng)可以使用著色器和內(nèi)核來管理并控制幾何圖形的變形和移動了。所以,固定函數(shù)渲染的作用就是說明“這是個三角形,這是一張紋理圖,把它們顯示在屏幕上”。這是一份巨大的清單,能夠?qū)崿F(xiàn)很多效果。但隨著技術(shù)發(fā)展,開發(fā)者們希望增強(qiáng)控制能力或者添加一些光源之類的效果,而最終成果就是可編程設(shè)計(jì)。
幾乎所有這些都可以在 GPU 中以高度輕量化的線程形式存在,它們可以執(zhí)行最基本的代碼。過去我們沒辦法使用 for 循環(huán),一切內(nèi)容都需要注冊,而且不能執(zhí)行函數(shù)。那時(shí)候一切真的非常基礎(chǔ),但至少可以獲取一些變量,把它們相加以得到另一個變量,再開平方等等。總之,這一點(diǎn)點(diǎn)計(jì)算量成就了更強(qiáng)的控制能力。
于是我們下定決心,哪怕圖形顯示還不需要 CUDA,我們也要借此實(shí)現(xiàn)可編程性。事實(shí)證明我們是對的。但現(xiàn)在的情況又不一樣了,我們在圖形方面看到的不少重大進(jìn)步,其實(shí)是來自基于 AI 的著色器、神經(jīng)網(wǎng)絡(luò)著色器等,比如機(jī)器學(xué)習(xí) RTX。光線追蹤的技術(shù)原理雖然特殊,但 RTX 使其能夠嵌入微小的機(jī)器學(xué)習(xí)算法,再以程序化方式生成結(jié)果,且速度比普通軟件算法要快得多。
CUDA 的“護(hù)城河”是并行化能力
Nader:那這一切是發(fā)生在 CUDA 之上的單獨(dú)層,還是就在 CUDA 當(dāng)中?
Stephen:CUDA 其實(shí)是一套集合。很多朋友在說起 CUDA 時(shí),首先想到的是 CUDA C++ 語言。但不止于此,它包含一系列類似于 C++ 的庫,可以通過特定方式編寫并更好地發(fā)揮對應(yīng)硬件的性能。它可以調(diào)用 cuDNN 的 PyTorch 框架,比如調(diào)用 cuBLAS、調(diào)用 cuTENSOR 乃至編譯器。PyTorch 下面的這一切都是 CUDA。甚至 CUDA 代碼本身也代表著英偉達(dá)為 PyTorch 代碼庫做出的貢獻(xiàn)。
所以說,CUDA 就是一套完整的技術(shù)棧。畢竟沒人愿意直接編寫匯編代碼,也幾乎不想編寫 C++ 這類低級代碼,這就需要一套庫或者封裝的 SDK 幫大家解決需求。CUDA 有 10 個層,最底層是編譯器,負(fù)責(zé)獲取最終代碼并將其映射至 GPU 線程。
DirectX 就是一個 SDK,是微軟打造的 API。其中是一組定義如何設(shè)置圖形的函數(shù)。大家在 Windows 上玩的任何游戲幾乎都要依賴 DirectX。OpenGL 也差不多,只是有點(diǎn)跟不上時(shí)代了。Vulkan 取代了它的地位。如果大家在 Linux 上玩游戲,那就要用到 Vulkan。這些都是標(biāo)準(zhǔn)圖形 SDK。雖然不一定能完全互換,但從功能上講,它們有很多共性。
Nader:那你為什么會決定對 DirectX 進(jìn)行分叉?
Stephen:DirectX 是微軟的 API 規(guī)范,定義了圖形的設(shè)置方式。也就是說,英偉達(dá) GPU 或者其他顯卡只要實(shí)現(xiàn)了 DirectX API 和 Vulkan API,就能讓游戲跟它們通信。有些程序在英偉達(dá) GPU 上運(yùn)行效果更好,但 DirectX 永遠(yuǎn)存在。Vulkan 則可以添加擴(kuò)展及其他廠商特定的驅(qū)動程序,借此支持某些核心硬件。
在 CUDA 項(xiàng)目期間,我們一直在努力達(dá)成的一個目標(biāo),就是讓同樣使用匯編語言的圖形管道和 CUDA 通用軟件開發(fā)管道保持互操作性。這也是 AI 在圖形領(lǐng)域的意義所在。機(jī)器學(xué)習(xí)模型及其執(zhí)行、推理都是由 CUDA C++ 編寫而成。換言之,AI 內(nèi)核、圖形內(nèi)核和著色器可以共存并相互調(diào)用。
另外一個重點(diǎn)在于功率。我的筆記本電腦只有 150 瓦,臺式機(jī)則有 1.5 千瓦。而哪怕是功率達(dá)到 20 兆瓦的數(shù)據(jù)中心,它的容納上限也是明確的。因此除非摩爾定律持續(xù)起效、晶體管數(shù)量不斷增加,否則缺少能效提升空間的晶體管總會耗盡我們的功率配額。因此,降低運(yùn)行功率以維持相同或者更多芯片的運(yùn)行,就成了一大核心目標(biāo)。
能效的意義也得到了歷史的證明。隨著晶體管的縮小,啟動它們所需要的電量也在降低。直到 2006 年英特爾酷睿 2 發(fā)布之前,這種思路都非常有效。但奔騰 4 第一次出現(xiàn)了功率問題,漏電子流效應(yīng)意味著電子會逃離晶體管。這跟電阻無關(guān),單純是量子力學(xué)所決定。這些電子會傳送到其他東西上,進(jìn)而導(dǎo)致能量損失。
芯片開關(guān)的速度越快,能量損失的速度也會越快,進(jìn)而拉低主頻。正因?yàn)槿绱耍?006 年到 2007 年左右出現(xiàn)了一系列主頻很低的 CPU。它們的出現(xiàn),打破了“主頻就是性能”的固有認(rèn)知。
后來我們又遇到了單核功率瓶頸。我們發(fā)現(xiàn)如果繼續(xù)縮小晶體管,那么其功耗將會翻倍,導(dǎo)致電壓不足以正常實(shí)現(xiàn)狀態(tài)切換。結(jié)果就是當(dāng)時(shí)的芯片主頻從 3、4 GHz 下降至 1.5 GHz,但雙核、四核和八核芯片逐漸誕生。如今某些 AMD 芯片甚至有 128 個核心。
核心數(shù)量的增加其實(shí)是種妥協(xié)性質(zhì)的障眼法,是在掩飾半導(dǎo)體廠商已經(jīng)無法繼續(xù)提高主頻的問題。這樣設(shè)計(jì)出來的芯片雖然理論上擁有雙倍性能,但也只有兩個核心全部滿負(fù)荷運(yùn)轉(zhuǎn)時(shí)才成立,而當(dāng)時(shí)絕大多數(shù)軟件根本不支持多線程。
所以如果觀察摩爾定律曲線,就會發(fā)現(xiàn) CPU 的晶體管密度已經(jīng)提高了 20 倍,但單線程、單核心性能卻僅僅提高了幾倍。所以除非采用并行處理,否則自 2006 年以來,后續(xù)發(fā)布的 CPU 根本就沒什么顛覆性的性能提升。
總之,我們已經(jīng)在單核設(shè)計(jì)上窮盡了一切手段。繼續(xù)縮小晶體管的唯一好處,就是實(shí)現(xiàn)并行化。并行化是軟件領(lǐng)域的必要能力,GPU 就完全是在執(zhí)行并行計(jì)算。當(dāng)前的 GPU 大約可提供 25 萬個線程,這在過去簡直無法想象。
Nader:那這要怎樣編程?你又如何看待這樣的設(shè)計(jì)?
Stephen:CUDA 所關(guān)注的就不是單線程編程場景。我們在 CUDA 立項(xiàng)早期就確定了并行性的規(guī)劃方針。比如是把這種機(jī)制藏起來、公開出去,還是允許用戶思考并參與進(jìn)來。
我們實(shí)際是把它分成了兩個部分,即粗粒度與細(xì)粒度。首先要明確一點(diǎn),沒人能同時(shí)運(yùn)行這 25 萬個線程。這世界上有兩種并行類型,其一是數(shù)據(jù)并行,即用戶擁有大量數(shù)據(jù),比如需要渲染屏幕上的每一個像素。這時(shí)候可以把任務(wù)拆分并展開,也就是分而治之的處理思路。
另外一種是任務(wù)并行,即場景中有多個對象,游戲就是典型案例。你可能需要為多個對象改變幾何形狀、執(zhí)行程序紋理、設(shè)置光源等等。這時(shí)候要做的就不是拿 25 萬個線程渲染同一個對象,而是要同時(shí)渲染 100 個對象,把這些對象分配給多個線程。
在 CUDA 之前,很多編程模型都只支持一種并行類型,即數(shù)據(jù)并行或者任務(wù)并行。但有了幾十萬個線程,我們覺得劃分應(yīng)該更明確一些。比如根據(jù)實(shí)際需求把數(shù)據(jù)或者任務(wù)拆分成多個獨(dú)立部分,再各自分配 1000 個線程來處理。
我們讓這種拆分過程透明可見,這也更貼合 GPU 的實(shí)際運(yùn)行狀態(tài)。CUDA 的一大原則,就是盡可能貼近硬件以實(shí)現(xiàn)最佳性能。GPU 內(nèi)部的硬件擁有我們稱為流式多處理器(SM)的核心。當(dāng)前的 GPU 擁有約 150 個這樣的核心,它使用這些核心進(jìn)行程序分配,且每核心可運(yùn)行 2000 個線程。
這就讓硬件擁有了自然拆分任務(wù)和數(shù)據(jù)的能力。比如先將 GPU 資源拆分成 150 個獨(dú)立的部分,接下來既可以把它們組合起來解決同一個問題,也可以指揮特定部分所對應(yīng)的線程分別處理問題中的圖形或者算法等具體環(huán)節(jié)。
這就是 CUDA 得以迅速發(fā)展的原因。隨著芯片越做越大并迎來流式多處理器,這種任務(wù)拆分自然會讓計(jì)算性能得到提升。這跟 CPU 完全不同——CPU 始終強(qiáng)調(diào)單線程,因此增加核心數(shù)量對于實(shí)際性能的貢獻(xiàn)往往比較有限。
CUDA 的挑戰(zhàn)在于
讓程序員能同時(shí)控制兩種計(jì)算類型
Nader:人類的思維是有連續(xù)性的。那在展示這種全新范式時(shí),有沒有遇到過抵觸情緒和溝通障礙?對于這樣一種不同于以往的編程和問題解決方式,市場的采用曲線又是怎樣的?
Carter:我是學(xué)物理學(xué)出身,編程設(shè)計(jì)方面的事我不太有發(fā)言權(quán),但這種范式變化確實(shí)給了我很大幫助。比如在 AI 爆發(fā)之前,CUDA 的第一個目標(biāo)就是計(jì)算科學(xué),希望優(yōu)化天氣預(yù)報(bào)和計(jì)算生物學(xué)等的處理性能。
物理學(xué)家跟程序員不同,他們可以窮盡一生去探究物理世界的秘密。正是因?yàn)槲野l(fā)現(xiàn)自己缺少那樣極致的天賦,最終才決定投身計(jì)算機(jī)。我曾在大學(xué)物理實(shí)驗(yàn)室工作過,那里會把角色分得很開——有科學(xué)家、也有程序員,大家各司其職共同協(xié)作。物理學(xué)家不知道如何最大限度運(yùn)用計(jì)算機(jī),而程序員就出面解決這類需求。這種強(qiáng)強(qiáng)聯(lián)手的方式非常成功。
我們專門去找過這些物理學(xué)家,向他們介紹 CUDA 和多線程設(shè)計(jì)。他們剛開始確實(shí)會拒絕,因?yàn)檫@不是他們慣常的計(jì)算實(shí)現(xiàn)思路,沒想過怎樣把任務(wù)映射到大量線程上。但這種習(xí)慣思維意味著更大的問題必須由更大的計(jì)算機(jī)來解決,總有一天計(jì)算機(jī)會不夠大,這時(shí)工作就卡住了。
2000 年初那段時(shí)間,人們總覺得算力的提升是無上限的。但物理學(xué)家的態(tài)度更靈活,畢竟只要算力能再強(qiáng)哪怕一點(diǎn)點(diǎn),結(jié)果都可能完全不同。所以他們對任何能幫助自己跨越新邊界的技術(shù),都比較愿意接受。
就比如說 2D 圖形到 3D 圖像的轉(zhuǎn)換,后者對于供電和內(nèi)存的需求百倍、千倍于前者。但大家都希望能盡早實(shí)現(xiàn),而不是坐等摩爾定律帶來足夠強(qiáng)大的單臺計(jì)算機(jī)。
所以哪怕在 CUDA 之前,就有很多博士生在編寫新算法,努力在更小的機(jī)器上解決更大的難題。我對這方面探索很感興趣,因此經(jīng)常會出席超級計(jì)算會議,跟其他與會者交流心得。
讓我印象深刻的是,2019 年時(shí)大家都對 AI 嗤之以鼻,覺得這東西根本就不存在。但短短幾年的疫情之后,如今每個人都在聊 AI,比如“我把 AI 加入了自己的生物算法”。
機(jī)器學(xué)習(xí)的強(qiáng)大之處,在于我們可以訓(xùn)練它來生成一條復(fù)雜的函數(shù),從而簡單快速地解決問題——哪怕我們并不完全理解它的基本原理。仍然以天氣預(yù)報(bào)為例,由于蝴蝶效應(yīng),地球上某個區(qū)域的微小變化會極大影響其他區(qū)域的天氣。
照傳統(tǒng)方法,我們需要對整個星球進(jìn)行預(yù)測,采集國家氣象局的行星模擬數(shù)據(jù)。然而,世界上最大的計(jì)算機(jī)也只能以約 10 公里的分辨率模擬行星。雖然從星球的角度來看,10 公里這個單位并不算大,但常規(guī)云團(tuán)的直徑也就是 1 公里,且足以決定特定區(qū)域的天氣。換句話說,老辦法根本不可能準(zhǔn)確生成整個星球的天氣預(yù)報(bào)。
幾年之前,人們發(fā)現(xiàn)可以使用機(jī)器學(xué)習(xí)模型來填補(bǔ)空白,而且效果比傳統(tǒng)云團(tuán)模型好得多。海洋模型和云團(tuán)模型都是極其復(fù)雜的系統(tǒng),但通過填充這些邊長 10 公里的正方形塊,它們能夠有效實(shí)現(xiàn) 1 公里的分辨率。所以過去幾年間,天氣預(yù)報(bào)的預(yù)測范圍已經(jīng)從 5 天延長到了 7 天甚至是 10 天。
在 AI 的幫助下,天氣預(yù)報(bào)突然就“支楞”起來了,這是因?yàn)闄C(jī)器學(xué)習(xí)算法讓我們得到了更好的結(jié)果。
之所以能把天氣預(yù)報(bào)的范圍延長到 10 天,是因?yàn)闄C(jī)器學(xué)習(xí)算法能夠?qū)崿F(xiàn)原本難以做到的事情,比如處理近似非線性議程。簡單來講,AI 可以將上百萬個維度上的無數(shù)個點(diǎn)擬合成一條曲線。在訓(xùn)練過程中,它會逐漸把握住這條與數(shù)據(jù)最貼近的曲線,并在之后的推理期間用曲線核查真實(shí)采集到的點(diǎn)。也正因?yàn)槿绱耍评淼乃俣炔艜h(yuǎn)遠(yuǎn)快于訓(xùn)練。
這樣的 AI 填充技術(shù)不僅適用于天氣預(yù)報(bào),也適用于其他場景。AI 算法對極其復(fù)雜的蛋白質(zhì)模型進(jìn)行推理,徹底改變了計(jì)算生物學(xué)。但這里又要說回功率的問題。晶體管越小,電子損失越嚴(yán)重。因此隨著我們不斷增加晶體管數(shù)量,能效并不能隨之倍增。畢竟我們常用的筆記本電腦就只有 150 瓦,臺式機(jī)是 1.5 千瓦,它們能容納的晶體管總量是有限的。
但 AI 算法能把評估成本降低至百分之一甚至千分之一。比如在圖形渲染中,AI 可以生成幾乎看不出區(qū)別的近似幀,同時(shí)保證不超過筆記本電腦的功率上限。這雖然不是真正的精確渲染,但卻可以讓每像素的生成成本都滿足預(yù)算范圍,這在以往根本不可能實(shí)現(xiàn)。
因此我們才特別需要新的 AI 算法,作為替代方案,它們能夠適應(yīng)功率預(yù)算且繼續(xù)提供良好的計(jì)算結(jié)果。
雖然在圖形渲染中,AI 有時(shí)候可能生成偽影,比如當(dāng)游戲中的對象快速移動時(shí),AI 仍在根據(jù)上一幀生成下一幀,因此顯示效果和正確效果間會有輕微差異。但總體來講,AI 還是能比傳統(tǒng)方法更好地呈現(xiàn)運(yùn)動曲線。
計(jì)算的歷史一直由馮·諾依曼計(jì)算架構(gòu)所主導(dǎo),其強(qiáng)調(diào)的是可重復(fù)、精確且合乎邏輯。但如今我們正進(jìn)入神經(jīng)計(jì)算的新時(shí)代,其中的計(jì)算并不精確。我們輸入同樣的數(shù)據(jù),有可能會得到略有不同的輸出,這是因?yàn)閱栴}中的變量太多。神經(jīng)計(jì)算具有容錯性,不會像馮·諾依曼計(jì)算那樣因錯誤而崩潰。
神經(jīng)算法為高度復(fù)雜的問題找到了非常簡單的解決辦法,唯一的代價(jià)就是得到的是近似結(jié)果、而非精確結(jié)果。但這對人類來說已經(jīng)夠好了。當(dāng)然,我們在某些場景下不想用 AI,比如說報(bào)稅——報(bào)稅過程絕對不能有幻覺。但 AI 在數(shù)學(xué)問題上的表現(xiàn)令人震驚,所以我相信很快我就能把所有日常事務(wù)都交給它了。
未來,馮·諾依曼計(jì)算和 AI 計(jì)算將攜手共存,可能還要再加上量子計(jì)算等其他計(jì)算類型。CUDA 的挑戰(zhàn),在于找到一種方法讓程序員同時(shí)控制這兩種計(jì)算類型。作為異構(gòu)系統(tǒng),GPU 中包含多種不同用途的不同硬件,而 CUDA 需要將它們統(tǒng)一起來,提供一套能夠與之交互的通用平臺。
隨著市面上的硬件越來越多,我們也越來越難以為開發(fā)者提供一套簡潔、無縫的編程模型。時(shí)至今日,我們?nèi)圆磺宄撊绾伟焉窠?jīng)算法、馮·諾依曼算法和量子計(jì)算融合起來。我們在英偉達(dá)的一大工作重點(diǎn),就是讓 Python 成為 CUDA 平臺中的重要部分,確保平臺中的各個部分,包括庫、SDK 和編譯器都能跟 Python 順暢交互。
我剛加入英偉達(dá)時(shí),當(dāng)時(shí)的芯片大約有 3 萬個線程。硬件在運(yùn)行時(shí)會將這些線程組合成塊,再由 GPU 使用 SIMT(單指令、多線程)實(shí)現(xiàn)并行計(jì)算。其中大多數(shù)線程會保持獨(dú)立運(yùn)行,允許每個線程在必要時(shí)執(zhí)行不同的操作。
另外,將數(shù)據(jù)映射至線程對于機(jī)器學(xué)習(xí)算法的效率和性能同樣至關(guān)重要。機(jī)器學(xué)習(xí)面臨著諸多挑戰(zhàn),例如軟件棧太深以及如何將數(shù)據(jù)有效映射至硬件等。
現(xiàn)在 AI 領(lǐng)域中即時(shí)編譯正逐漸成為主流。只要獲得了問題的參數(shù),就能針對其做代碼優(yōu)化。CUDA 則始終提供編譯器層,確保開發(fā)者能夠插入自己的語言和內(nèi)容。現(xiàn)在通過在線運(yùn)行即時(shí)編譯,我們希望人們能夠在各類場景下使用編譯器,借此縮短編譯時(shí)間并優(yōu)化代碼,讓用戶更快獲取大模型輸出的 token。
這種依靠極端復(fù)雜軟件實(shí)現(xiàn)最快推理速度的目標(biāo)不易達(dá)成,必須從中尋求平衡。比如說某些算法雖然生成速度更快、首次推理時(shí)間更短,但算法本身卻是錯的。總之這類場景下沒有完美答案,真正的關(guān)鍵在于映射結(jié)果,同時(shí)輔以延遲和效率。
Nader:早在上世紀(jì) 90 年代時(shí),Jensen 就預(yù)見到了并行化的巨大威力,而當(dāng)時(shí)大多數(shù) CPU 還是單核的。這樣的前瞻性令人印象深刻。那 90 年代初的并行化是什么樣子?
Stephen:當(dāng)時(shí),不同的圖形架構(gòu)之間存在著廣泛競爭,各家廠商都在嘗試自己的思路。英偉達(dá)也有自己的方案,而且被證明效果相當(dāng)出色。
而且這些并不能算 GPU,只是其他類型的圖形芯片。英偉達(dá)于 1993 年開始制造圖形芯片,剛開始只是用來加速某些渲染工作。當(dāng)時(shí) GL 已經(jīng)出現(xiàn),大家都想給這個問題找到答案。其中一種方式,就是放棄提升單一線程性能、加快其逐像素處理能力,而是讓多個線程并行運(yùn)行。但注意,當(dāng)時(shí)的線程跟我們現(xiàn)在說的計(jì)算線程并不是一碼事。
比如說,光柵化器會獲取屏幕上某個位置的斜三角形,并確定哪些像素有光照、它們在邊界上的亮度參數(shù)。光柵化器隨后將三角形轉(zhuǎn)換成像素,而這是個非常簡單的操作。只要能夠復(fù)制多個邏輯門,我們就能一次性渲染多個像素,保證光柵化器飛快運(yùn)行。從本質(zhì)上講,這并不屬于可編程設(shè)計(jì),畢竟只是在按晶體管和邏輯門的序列來決定像素顯示還是不顯示。但效果仍然不錯,我們確實(shí)能在每個時(shí)鐘周期內(nèi)渲染出更多像素。
而這也現(xiàn)在現(xiàn)代并行性設(shè)計(jì)的起點(diǎn),人們開始嘗試通過專用芯片盡量提高性能。克隆所有邏輯門以便一次處理更多像素的想法,逐漸演變成了可編程性理論,最終形成了如今規(guī)模極大的多線程機(jī)器。
另外需要關(guān)注的是,盡管從 CUDA 的角度來看,GPU 本身就是一臺大規(guī)模并行機(jī)器,但它卻并不擅長運(yùn)行 Linux 這類串行問題。這類任務(wù)還是要交給 CPU 才行。
而我認(rèn)為理想的異構(gòu)機(jī)器應(yīng)該是 CPU 與 GPU 的結(jié)合——也正因?yàn)槿绱耍也盘貏e贊賞英偉達(dá)的 Grace Hopper 硬件。其中采用了 Hopper GPU 并配合基于 ARM 架構(gòu)的 Grace CPU(服務(wù)器級 CPU),以調(diào)整內(nèi)存將二者連接起來以實(shí)現(xiàn)數(shù)據(jù)共享。它的獨(dú)特之處,不止于通過總線連接起兩臺計(jì)算設(shè)備,而更多體現(xiàn)為一種共享緩存系統(tǒng)的協(xié)同關(guān)系。在這樣的混合設(shè)備上,我們能夠以不同于以往純 CPU 或純 GPU 的方式對其進(jìn)行編程。在這樣的設(shè)備上,我們可以讓 CPU 專門運(yùn)行 Linux,讓 GPU 專門運(yùn)行并行編程。
https://www.youtube.com/watch?v=dNUMNifgExs
https://www.networkcomputing.com/data-center-networking/nvidia-ai-updates-blackwell-platform-nim-agent-blueprints-and-mlperf
聲明:本文為 AI 前線整理,不代表平臺觀點(diǎn),未經(jīng)許可禁止轉(zhuǎn)載。
會議推薦
AICon 2025 強(qiáng)勢來襲,5 月上海站、6 月北京站,雙城聯(lián)動,全覽 AI 技術(shù)前沿和行業(yè)落地。大會聚焦技術(shù)與應(yīng)用深度融合,匯聚 AI Agent、多模態(tài)、場景應(yīng)用、大模型架構(gòu)創(chuàng)新、智能數(shù)據(jù)基建、AI 產(chǎn)品設(shè)計(jì)和出海策略等話題。即刻掃碼購票,一同探索 AI 應(yīng)用邊界!
今日薦文
你也「在看」嗎?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.