在最近的一場 "AI Everywhere" 發布會上,Intel 的 CEO Pat Gelsinger 炮轟 Nvidia 的 CUDA 生态護城河并不深,而且已經成爲行業的衆矢之的。
Gelsinger 稱," 整個行業都希望能幹掉 CUDA,包括 Google、OpenAI 等公司都在想方設法讓人工智能訓練更加開放。我們認爲 CUDA 的護城河既淺又窄。"
Gelsinger 的這番話确實道出了整個人工智能行業對于 Nvidia 的 CUDA 又愛又恨的情緒。一方面,由于有了 CUDA 生态,人工智能算法的訓練和部署從硬件層角度變得容易,人工智能工程師無需成爲芯片專家,也能夠讓人工智能訓練高效地運行在 Nvidia 的 GPU 上。
而從另一個角度,整個業界也過于依賴 CUDA,以至于不少主打人工智能公司都對于 CUDA 的過度依賴産生了警惕性,這也就是 Gelsinger 所說的 Google、OpenAI 等公司都在設法研制自己的相應解決方案(例如 OpenAI 的 Triton)。
本文将深入分析 CUDA 的強勢到底來源于哪裏,以及究竟誰能打破 CUDA 壟斷。
什麽是 CUDA?
首先,我們先分析一下 CUDA 的來龍去脈。當我們在談論 "CUDA" 的時候,我們究竟在談論什麽?事實上,我們認爲,CUDA 包含三個層次。
首先,CUDA 是一套編程語言。最初,3D 圖像加速卡的主要任務是加速 3D 圖像的渲染,其用途相當專一。在本世紀初,Nvidia 推出了 GPU 的概念,以允許用戶使用圖像加速卡去做通用計算,并且在大約十五年前推出了相應的 CUDA 編程語言,其主要任務是提供 GPU 的編程模型,從而實現通用 GPU 編程。
在 CUDA 編程語言中,Nvidia 提供了 GPU 的各種硬件抽象,例如基于線程的并行計算、内存存取等概念,從而爲 GPU 編程提供了方便。
除了編程語言之外,CUDA 的第二層含義是一套高性能編譯系統。在使用 CUDA 編程之後,還需要把用 CUDA 語言編寫的程序使用 CUDA 編譯器針對相應硬件優化,并且映射到更底層的硬件指令(對于 Nvidia 顯卡來說就是 PTX)。CUDA 的編譯器和 GPU 硬件的整合效率相當高,因此能編譯出非常高效的底層指令,這也是 CUDA 的另一個核心組成部分。
最後,CUDA 的第三層含義是Nvidia 基于 CUDA 語言的一系列高性能函數庫,以及人工智能 / 高性能計算社區基于 CUDA 語言開發的一系列代碼庫。例如,CUDA 的常用高性能函數庫包括用于線性計算的 cuBLAS 和 CUTLASS,用于稀疏矩陣計算的 cuSPARSE,用于傅立葉變換的 cuFFT,用于數值求解的 cuSOLVER 等。這些函數庫的發展至今已經曆經了十餘年的努力,其優化幾乎已經做到了極緻。另外,人工智能社區也有大量基于 CUDA 開發的代碼庫,例如 Pytorch 的默認後端就是 CUDA。
CUDA 每個層面的護城河
如上分析可知,CUDA 其實包含了三個層面:編程語言,編譯器和生态。那麽,CUDA 這三個層面的護城河究竟有多高?
首先,從編程語言的角度,事實上一直有 OpenCL 等社區開源語言試圖去實現類似(甚至更加廣泛的功能;OpenCL 針對的不隻是 GPU 編程,還包括了 FPGA 等異構計算體系)的功能,AMD 的 ROCm 平台也是試圖做到與 CUDA 語言等價。從編程語言角度,CUDA 并非不可取代。
其次,從編譯器的角度來看,CUDA 提供的高性能編譯器确實是一個很高的護城河。編譯器的性能從很大程度上決定了用戶編寫的程序在 GPU 上執行的效率;或者換句話說,對于人工智能應用來說,一個很直觀的衡量标準就是用戶編寫的人工智能算法,能在多大程度上利用 GPU 的峰值算力?大多數情況下,峰值算力平均利用率不到 50%。
另外,編譯器的性能還牽扯到了用戶調優的過程。如果用戶是 GPU 專家,通過在編寫 GPU 程序時進行調優(例如使用某種特定的方式去編寫語句),也可以很大程度上彌補編譯器的不足(因爲編譯器的一個重要功能就是對編寫的程序做優化,那麽如果編寫的程序已經比較優化了那麽對編譯器優化能力的要求就可以低一些)。
但是,這就牽扯到了用戶的門檻,如果編譯器性能不夠好,需要用戶是專家才能實現高效率的 GPU 程序,就會大大提高用戶門檻,即隻有擁有一支精英 GPU 編程專家團隊的公司才能充分發揮出 GPU 的性能;相反如果編譯器性能夠好,那麽就可以降低用戶門檻,讓更多公司和個人也可以使用 GPU 高性能運行算法。從這個角度來說,經過十多年的積累,CUDA 的編譯器(NVCC)已經達到了相當高的水平。
最近的另一個新聞也從側面印證了編譯器性能的重要性:AMD 在 12 月初的發布會上宣布新的 MI300X 平台在運行 Llama2-70B 模型的推理任務時,比起 Nvidia H100 HGX 的性能要強 1.4 倍;一周後,Nvidia 回應稱 AMD 在編譯測試時并沒有使用合理的設置,在使用正确設置後 H100 HGX 的性能事實上比 MI300X 要強 1.5 倍。由此可見,一個好的編譯器優化對于充分利用 GPU 的性能可以說是至關重要。
然而,編譯器的護城河也并不是高不可破。例如,OpenAI 的開源 Triton 編譯器可以同時兼容 Nvidia 和 AMD 以及更多平台,支持把用戶使用 Python 編寫的程序直接優化編譯到底層硬件指令語言,并且在 Nvidia 的成熟 GPU 上實現和 CUDA 接近的執行效率。如果 Triton 這樣的開源編譯器獲得成功的話,至少從某種角度上可以省去其他人工智能芯片公司花數年精力去開發自己的編譯器的需求。
第三個層面是生态。目前,CUDA 在生态領域可以說是遙遙領先,因爲 CUDA 有着十多年的高性能程序庫的積累,以及基于這些程序庫上面社區開發的各種高性能框架代碼。生态的積累首先需要能提供一個領先的解決方案——如果其他公司也能提供一個高性能的編程語言和編譯器方案的話,自然會有社區去基于它開發代碼,而經過長期不懈的積累之後,生态自然也會趕上。
例如,人工智能領域最流行的框架 PyTorch 從這兩年開始也對于 AMD 的 ROCm 提供了支持,這就是生态領域的一個例子。換句話說,隻要給足夠的時間和與 CUDA 語言 / 編譯器性能接近的方案,生态自然會慢慢趕上。
誰能打破 CUDA 的護城河?
之前我們分析了 CUDA 從三個層面的護城河,我們可以發現,Nvidia 的 CUDA 從三個層面分别來看,編譯器和生态的護城河比較高,但也不是不可超越。我們看到,軟件科技公司之間正在試圖超越這條護城河,例如 OpenAI 的 Triton 編譯器能提供幾乎比肩 CUDA 的性能,而人工智能編程框架 PyTorch 的最新版本已經在後端集成了 Triton,可望在 Nvidia 已經推出的成熟 GPU 上能實現很高的性能。
然而,Nvidia CUDA 最強的護城河事實上在于軟件 - 芯片協同設計。如前所述,在 Nvidia 的 GPU 推出一段時間之後(例如半年或一年),第三方的軟件公司的方案(例如 OpenAI 的 Triton)在研究透徹這款 GPU 之後,可以讓自己的方案做到比肩 CUDA 的水平。這意味着兩點:
首先,第三方軟件公司開發編譯器去嘗試匹配 CUDA 的性能永遠是一個追趕的過程,Nvidia 發布新的 GPU 和相應 CUDA 版本之後,需要半年到一年的時間才能實現性能基本匹配,但是基本難以到達 Nvidia 新 GPU 發布就立刻實現性能匹配甚至領先。
其次,芯片公司如果被動等待第三方軟件公司的編譯器去适配自己的人工智能加速硬件以追趕 Nvidia 的話,永遠無法打破 Nvidia CUDA 的領先地位。原因是,第三方軟件公司适配新的人工智能加速硬件需要時間;而在一年後等到第三方軟件公司的方案達到接近 CUDA 的水平的時候,Nvidia 已經發布下一代 GPU 了。這就陷入了永遠在追趕過程中的陷阱,難以打破 CUDA 護城河并實現領先。
因此,能真正打破 CUDA 護城河的,必須是有芯片 - 軟件協同設計能力的團隊,而不僅僅是一個軟件公司。這個團隊可以是一家擁有強大軟件能力的芯片公司(例如,Nvidia 就是這樣的一個擁有強大芯片 - 軟件協同設計能力的芯片公司的例子),或者是芯片和科技公司的結合。隻有在芯片設計過程中就開始編譯器和軟件生态的适配,才能夠在芯片發布的初期就能推出芯片性能和軟件性能同時都比肩 Nvidia GPU +CUDA 的産品,從而真正打破 CUDA 的護城河。
如何在芯片設計過程中實現軟硬件協同設計?事實上,編譯器的設計是基于一種編程模型,把硬件抽象爲一些不同的層次(例如内部并行計算,内存存取等等),并且進一步根據這些硬件抽象去構建性能模型,來實現性能的預測和優化。
從芯片設計的角度,需要能充分理解編譯器層面的這些硬件抽象和性能模型并不會百分百準确,因此如何設計一個好的芯片架構讓編譯器能夠較爲容易地去優化程序就很重要。
而從編譯器的角度,如前所述每一款芯片的編程模型和硬件抽象層都會略有不同,因此需要在芯片設計周期中就介入開始編譯器的優化和硬件建模。兩者相結合,就能實現在芯片推出時就同時有很強的芯片理論性能和高度優化的編程語言 / 編譯器,最終實現整體解決方案能和 Nvidia 的 GPU+CUDA 做有力的競争。
從這個角度來看,Google 的 TPU+XLA 就是一個滿足之前所屬芯片 - 軟件協同設計的案例。Google 的自研 TPU 過程中和 XLA 編譯器通過軟硬件結合設計實現整體高性能方案(這也是 TPU 在 MLPerf benchmark 上和 Nvidia 的方案性能接近甚至領先的重要原因)。雖然 TPU 并不對第三方銷售因此這個方案并不會完全打破 Nvidia CUDA 的護城河,但是它至少提供了一個打破 Nvidia CUDA 護城河的技術方向。
從另一個方面,AMD 和 Intel 等芯片公司在編譯器領域的方案目前還有待加強,但是通過和 OpenAI 等科技公司合作,通過在下一代 AI 産品的設計過程中就和 Triton 這樣的領先編譯器方案協同設計,可望能在未來追趕 Nvidia GPU + CUDA 的性能;而在性能接近之後,生态的培養就隻是一個時間問題了。
綜上,我們認爲,CUDA 雖然是一個軟件生态,但是如果想要打破 CUDA 的護城河,需要的是軟硬件協同設計。