誰能挑戰英偉達 CUDA?

華爾街見聞
2023.12.21 01:58
portai
I'm PortAI, I can summarize articles.

在最近的一場 “AI Everywhere” 發佈會上,Intel 的 CEO Pat Gelsinger 批評了 Nvidia 的 CUDA 生態系統,並表示整個行業都希望能夠挑戰 CUDA。儘管 CUDA 為人工智能算法的訓練和部署提供了便利,但行業對其過度依賴產生了警惕性。一些公司如 Google 和 OpenAI 正在研發自己的解決方案。本文將深入分析 CUDA 的強勢來源以及誰能夠打破其壟斷。

在最近的一場 “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 的護城河,需要的是軟硬件協同設計。

風險提示及免責條款

市場有風險,投資需謹慎。本文不構成個人投資建議,也未考慮到個別用户特殊的投資目標、財務狀況或需要。用户應考慮本文中的任何意見、觀點或結論是否符合其特定狀況。據此投資,責任自負。