作者 | 方文三
CUDA最初是為科學(xué)計(jì)算領(lǐng)域設(shè)計(jì)的,英偉達(dá)致力于在消費(fèi)級(jí)游戲顯卡之外拓展新的市場機(jī)遇。借助CUDA的發(fā)展,英偉達(dá)成功地在數(shù)據(jù)中心等高性能計(jì)算領(lǐng)域找到了第二個(gè)增長點(diǎn)。
讓英偉達(dá)確立主導(dǎo)地位的并非芯片本身
GPU與CPU在設(shè)計(jì)上存在本質(zhì)差異。
CPU作為處理復(fù)雜任務(wù)的全能型處理器,一次僅能處理有限數(shù)量的任務(wù);
而GPU則如同流水線工人,擅長于同時(shí)執(zhí)行大量簡單且重復(fù)的計(jì)算。
自21世紀(jì)初,研究人員開始意識(shí)到GPU的非凡潛力。
然而,當(dāng)時(shí)GPU編程的復(fù)雜性令人望而卻步。
程序員需借助多種圖形API來引導(dǎo)GPU執(zhí)行非圖形任務(wù),效率極低。
對(duì)此,英偉達(dá)的工程師們深感憂慮。于是,在2006年,英偉達(dá)推出了CUDA。
一個(gè)允許程序員直接使用C語言(后續(xù)還支持Python、Fortran等語言)來控制GPU的平臺(tái)。
從此,GPU的角色不再局限于游戲的[渲染機(jī)器],而是轉(zhuǎn)變?yōu)橐粋€(gè)功能強(qiáng)大的通用計(jì)算引擎。
隨后,英偉達(dá)還推出了CUDA Toolkit,其中集成了調(diào)試工具、優(yōu)化器等,使得編程體驗(yàn)更加流暢。
正是這些創(chuàng)新,使得CUDA從一項(xiàng)技術(shù)演變?yōu)橐粋€(gè)平臺(tái),吸引了眾多開發(fā)者的加入。
這一成就歸功于人工智能的興起,特別是深度學(xué)習(xí)的迅猛發(fā)展。
2012年,深度學(xué)習(xí)模型AlexNet在ImageNet圖像識(shí)別大賽中大放異彩,震驚了科技界。
該模型的訓(xùn)練需要大量的矩陣計(jì)算,而GPU與CUDA正是這類計(jì)算的理想選擇。
這一生態(tài)系統(tǒng)的關(guān)鍵[種子]在2016年播下。
OpenAI接受了英偉達(dá)的捐贈(zèng),標(biāo)志著[世界上首臺(tái)專為人工智能設(shè)計(jì)的超級(jí)計(jì)算機(jī)]的誕生,其核心由8個(gè)基于Volta架構(gòu)的V100 GPU構(gòu)成。
數(shù)年后,隨著GPT系列的成功,行業(yè)標(biāo)準(zhǔn)被納入CUDA的語法之中,訓(xùn)練流程、算子接口、資源調(diào)度均圍繞CUDA構(gòu)建。
OpenAI的成功路徑迅速成為整個(gè)行業(yè)的默認(rèn)選擇。
無論是谷歌的TensorFlow、Facebook的PyTorch,還是后來的Hugging Face transformers,都依賴于CUDA的底層支持。
英偉達(dá)借助這股東風(fēng),在AI崛起的關(guān)鍵時(shí)刻,悄然將CUDA從一個(gè)選項(xiàng)轉(zhuǎn)變?yōu)樾袠I(yè)標(biāo)準(zhǔn)。
CUDA構(gòu)成的三大核心要素
①開發(fā)函數(shù)庫:基于CUDA技術(shù),提供了一系列應(yīng)用開發(fā)庫。
CUDA數(shù)學(xué)庫(包括CUBLAS、CUFFT等)中,CUBLAS是基礎(chǔ)的線性代數(shù)子程序庫,它提供了矩陣乘法、向量運(yùn)算等高性能線性代數(shù)操作函數(shù),顯著提升了線性代數(shù)計(jì)算的效率;
CUFFT則是快速傅里葉變換庫,用于高效計(jì)算離散傅里葉變換及其逆變換,在信號(hào)處理、圖像處理等領(lǐng)域具有廣泛的應(yīng)用。
CUDA深度學(xué)習(xí)庫(CUDNN)專為深度學(xué)習(xí)設(shè)計(jì),提供了卷積、池化、歸一化等深度學(xué)習(xí)常用操作的高性能實(shí)現(xiàn),是深度學(xué)習(xí)框架如TensorFlow、PyTorch等在GPU上高效運(yùn)行的關(guān)鍵支撐。
此外,還有其他實(shí)用庫,CUDA的并行算法庫Thrust,它提供了類似于C++STL的并行算法和數(shù)據(jù)結(jié)構(gòu),包括排序、搜索、規(guī)約等操作。
②CUDA運(yùn)行時(shí)庫:提供了應(yīng)用開發(fā)接口和運(yùn)行期組件,涵蓋了基本數(shù)據(jù)類型的定義以及各類計(jì)算、類型轉(zhuǎn)換、內(nèi)存管理、設(shè)備訪問和執(zhí)行調(diào)度等函數(shù)。
這些函數(shù)用于在主機(jī)(CPU)與設(shè)備(GPU)之間進(jìn)行數(shù)據(jù)傳輸、內(nèi)存管理、內(nèi)核啟動(dòng)等操作。
例如,開發(fā)者可以利用運(yùn)行時(shí)庫函數(shù)將數(shù)據(jù)從主機(jī)內(nèi)存復(fù)制到GPU內(nèi)存,隨后啟動(dòng)GPU內(nèi)核對(duì)這些數(shù)據(jù)進(jìn)行計(jì)算,最終再將計(jì)算結(jié)果從GPU內(nèi)存復(fù)制回主機(jī)內(nèi)存。
③CUDA驅(qū)動(dòng):負(fù)責(zé)與底層GPU硬件通信,將CUDA程序轉(zhuǎn)換為GPU可理解的指令和數(shù)據(jù)格式,并管理GPU資源,如顯存分配、線程調(diào)度等。
它是CUDA程序與GPU硬件之間的橋梁,確保程序能夠在不同型號(hào)的英偉達(dá) GPU 上順利運(yùn)行。
防御壁壘的深度甚至超越了硬件本身
英偉達(dá)的CUDA生態(tài)系統(tǒng)并非單純的軟件工具集合,而是一個(gè)構(gòu)建于[開發(fā)者粘性-工具鏈壟斷-框架綁定-商業(yè)利益]之上的閉環(huán)體系。
①關(guān)于開發(fā)者粘性,CUDA之所以能夠占據(jù)主導(dǎo)地位,得益于其先發(fā)優(yōu)勢和規(guī)模效應(yīng)。
經(jīng)過二十年的積累,眾多開發(fā)者已經(jīng)形成了難以改變的[代碼慣性]。
若試圖將CUDA代碼遷移到其他平臺(tái),很可能需要重寫30%-50%的核心邏輯(例如內(nèi)存管理、并行優(yōu)化),同時(shí)面臨30%-60%的性能損失,遷移成本極為龐大。
②就工具鏈壟斷而言,英偉達(dá)在過去二十年中不斷完善CUDA生態(tài)系統(tǒng),最終實(shí)現(xiàn)了從開發(fā)到部署的[全鏈條捆綁]。
舉例來說,CUDA擁有眾多卓越的深度學(xué)習(xí)加速庫,其底層庫如cuDNN、cuBLAS的優(yōu)化程度遠(yuǎn)超競爭對(duì)手。
在ResNet-50推理任務(wù)中,cuDNN的性能是ROCm的MIOpen的2.3倍,是Intel oneDNN的3.1倍。
再如,CUDA的推理引擎TensorRT能夠?qū)⒛P屯评硌舆t降低至毫秒級(jí)別;
而AMD的MIGraphX在相同精度下的延遲高出55%,華為昇騰的CANN引擎僅支持有限的算子。
③CUDA與主流AI框架的深度耦合,也助其形成了[框架即生態(tài)]的隱形壟斷。
以全球使用率最高的深度學(xué)習(xí)框架PyTorch為例,在其V2.3版本中,85%的算子優(yōu)化代碼僅針對(duì)CUDA實(shí)現(xiàn)。
至于PyTorch的新功能(如動(dòng)態(tài)shape推理)也會(huì)優(yōu)先適配CUDA 12.x版本,而AMD ROCm則需等待社區(qū)貢獻(xiàn)代碼,適配周期平均會(huì)延遲六個(gè)月。
此外,CUDA在框架底層就獲得了英偉達(dá)的獨(dú)家優(yōu)化特權(quán),與其他競品形成了顯著的性能差距。
例如,PyTorch的TorchScript在編譯時(shí)會(huì)自動(dòng)調(diào)用CUDA專屬優(yōu)化(如自動(dòng)內(nèi)核融合);
而ROCm版本則需要開發(fā)者手動(dòng)插入HIP API,這極大地增加了代碼的復(fù)雜性。
④英偉達(dá)通過Inception計(jì)劃,支持了眾多AI初創(chuàng)公司,這些公司被納入[英偉達(dá)生態(tài)]后,被要求優(yōu)先使用CUDA,并將代碼共享至NGC(英偉達(dá)GPU Cloud)模型庫。
從底層邏輯到上層策略的生態(tài)系統(tǒng)
CUDA及其衍生工具(如PTX、Run:AI、Omniverse)所構(gòu)建的,已不僅僅是一套工具鏈,而是一套從底層執(zhí)行邏輯到上層調(diào)度策略的完整操作系統(tǒng)。
一旦采用CUDA,就必須使用其編譯器,并遵循其張量并行模型設(shè)計(jì);
使用Run:AI,就必須在該工具定義的資源調(diào)度規(guī)則中優(yōu)化算力;
使用PTX,就要接受其底層線程分配和執(zhí)行方式。
換言之,從底層硬件編程到上層應(yīng)用開發(fā)、調(diào)試、優(yōu)化以及集群管理的各個(gè)層面,均由英偉達(dá)所定義。
今日之CUDA已不再是一種工具,而是一整套控制結(jié)構(gòu)。
英偉達(dá)所控制的,不僅僅是某個(gè)產(chǎn)品,而是整個(gè)AI工程世界的[運(yùn)行方式]。
在Windows平臺(tái)上運(yùn)行AI框架時(shí),英偉達(dá)實(shí)際上控制著[中間三層],即AI軟件棧中最核心的執(zhí)行與接口層,這與微軟當(dāng)年通過Windows控制PC行業(yè)的情形如出一轍。
你可以更換鍵盤、鼠標(biāo),但無法更換操作系統(tǒng)。同樣,在AI時(shí)代,你可以更換供應(yīng)商,但無法繞過CUDA的接口。
CUDA在英偉達(dá)硬件生態(tài)中的核心地位
①與GPU硬件的深度融合:CUDA與英偉達(dá)GPU硬件之間存在著深度融合的關(guān)系,二者相輔相成,共同為用戶提供強(qiáng)大的計(jì)算能力。
CUDA 能夠充分發(fā)揮英偉達(dá)GPU硬件的性能優(yōu)勢,這得益于其獨(dú)特的設(shè)計(jì)和優(yōu)化。
以深度學(xué)習(xí)中的卷積計(jì)算為例,CUDA通過精心設(shè)計(jì)的線程調(diào)度和內(nèi)存訪問模式,能夠讓GPU的大量CUDA核心同時(shí)參與計(jì)算,極大地提高了卷積計(jì)算的速度。
在硬件加速功能方面,CUDA與英偉達(dá)GPU硬件緊密聯(lián)系,許多硬件加速功能只有通過CUDA才能充分發(fā)揮出來。
例如,英偉達(dá)GPU中的Tensor Core專門用于加速矩陣乘法和累加運(yùn)算。
CUDA提供了相應(yīng)的編程接口,使得開發(fā)者能夠方便地利用Tensor Core的強(qiáng)大性能,在深度學(xué)習(xí)訓(xùn)練中實(shí)現(xiàn)更快的計(jì)算速度和更高的效率。
此外,CUDA對(duì)英偉達(dá)GPU硬件的調(diào)用具有獨(dú)特性,它能夠直接訪問GPU的硬件資源,實(shí)現(xiàn)高效的并行計(jì)算。
這種直接訪問硬件的方式,減少了中間層的開銷,提高了計(jì)算效率,使得CUDA在處理大規(guī)模數(shù)據(jù)和復(fù)雜計(jì)算任務(wù)時(shí)具有明顯的優(yōu)勢。
②推動(dòng)硬件產(chǎn)品的發(fā)展與迭代:CUDA的發(fā)展對(duì)英偉達(dá)硬件產(chǎn)品的更新?lián)Q代起到了重要的推動(dòng)作用。
隨著CUDA功能的不斷增強(qiáng)和應(yīng)用場景的不斷拓展,對(duì)英偉達(dá)GPU硬件的性能和架構(gòu)提出了更高的要求,促使英偉達(dá)不斷優(yōu)化硬件架構(gòu),提升硬件性能,以滿足CUDA的需求。
在硬件架構(gòu)優(yōu)化方面,英偉達(dá)根據(jù)CUDA的并行計(jì)算需求,不斷改進(jìn)GPU的架構(gòu)設(shè)計(jì)。
例如,從早期的Fermi架構(gòu)到后來的Volta、Ampere架構(gòu),英偉達(dá)不斷增加CUDA核心的數(shù)量,優(yōu)化內(nèi)存帶寬和緩存機(jī)制,提高GPU的并行計(jì)算能力和數(shù)據(jù)處理速度。
同時(shí),CUDA的發(fā)展也促使英偉達(dá)不斷推出新的硬件產(chǎn)品,以適應(yīng)不同應(yīng)用場景的需求。
例如,英偉達(dá)推出的A100、H100等高端GPU產(chǎn)品,不僅在硬件性能上有了大幅提升,還針對(duì)CUDA進(jìn)行了深度優(yōu)化,為人工智能、高性能計(jì)算等領(lǐng)域提供了更強(qiáng)大的計(jì)算支持。
這些新的硬件產(chǎn)品,反過來又促進(jìn)了CUDA的發(fā)展和應(yīng)用,形成了良性循環(huán)。
③構(gòu)建完整的硬件生態(tài)系統(tǒng):CUDA在英偉達(dá)的硬件生態(tài)系統(tǒng)中扮演著連接硬件與軟件的關(guān)鍵角色。
它促進(jìn)了基于英偉達(dá)GPU硬件的軟件和應(yīng)用的開發(fā),構(gòu)建了一個(gè)完整的硬件生態(tài)系統(tǒng)。
在這個(gè)生態(tài)系統(tǒng)中,CUDA作為核心平臺(tái),吸引了眾多開發(fā)者基于其進(jìn)行軟件和應(yīng)用的開發(fā)。
從深度學(xué)習(xí)框架到科學(xué)計(jì)算軟件,從數(shù)據(jù)分析工具到圖形圖像處理應(yīng)用,基于CUDA開發(fā)的軟件和應(yīng)用涵蓋了多個(gè)領(lǐng)域,滿足了不同用戶的需求。
以深度學(xué)習(xí)領(lǐng)域?yàn)槔?,TensorFlow、PyTorch等主流深度學(xué)習(xí)框架都對(duì)CUDA提供了良好的支持。
開發(fā)者可以利用這些框架在英偉達(dá)GPU上快速搭建和訓(xùn)練深度學(xué)習(xí)模型,實(shí)現(xiàn)高效的圖像識(shí)別、自然語言處理等任務(wù)。
在科學(xué)計(jì)算領(lǐng)域,諸如Matlab、LAMMPS等軟件也借助CUDA加速計(jì)算過程,提高了科研工作的效率。
結(jié)尾:
經(jīng)濟(jì)學(xué)中有一個(gè)經(jīng)典理論:[當(dāng)一個(gè)生態(tài)系統(tǒng)的遷移成本遠(yuǎn)高于留存成本時(shí),該生態(tài)系統(tǒng)便被鎖定。]
這正是CUDA的厲害之處——它使用戶產(chǎn)生了路徑依賴,而這種依賴不再局限于硬件層面的[兼容性],而是將整個(gè)AI工程師的思維方式納入其結(jié)構(gòu)之中。
無論是OpenCL/OneAPI、TVM/XLA、MLIR,抑或其他一些出發(fā)點(diǎn)良好的項(xiàng)目,我們目睹了眾多旨在構(gòu)建統(tǒng)一AI基礎(chǔ)設(shè)施的有力嘗試。
但遺憾的是,尚未有任何一個(gè)能提供令開發(fā)者完全滿意的結(jié)果。
項(xiàng)目逐漸走向碎片化,承諾未能兌現(xiàn),使用替代硬件的用戶手中的工具往往不盡人意。
現(xiàn)實(shí)情況是:唯有英偉達(dá)真正解決了這一問題。
部分資料參考:InfoQ:《GPU 編程[改朝換代]:英偉達(dá)終為CUDA 添加原生 Python 支持,百萬用戶變千萬?》,科魯叔叔趣說AI:《CUDA:英偉達(dá)的魔法引擎如何改變世界》,Rog3r:《究竟什么是英偉達(dá)的CUDA?真的堅(jiān)不可摧嗎?》,半導(dǎo)體行業(yè)觀察:《如何打破CUDA壟斷?LLVM奠基人長文解讀》,牛山AI公園:《DeepSeek是否真繞開了CUDA?一文搞懂CUDA為何是英偉達(dá)的核心壁壘》