行業動态

了(le/liǎo)解最新公司動态及行業資訊

當前位置:首頁>新聞中心>行業動态
全部 471 公司動态 136 行業動态 173

過去十年機器學習軟件開發行業概覽(軟件開發)過去十年黃金價格,

時(shí)間:2025-04-21   訪問量:0

過去十年機器學習軟件開發行業概覽:英偉達 CUDA 壟斷地(dì / de)位下降,PyTorch 超越谷歌 TensorFlow

作者 | Dylan Patel

譯者 | 馬可薇

策劃 | Tina

在(zài)過去的(de)十年間,機器學習軟件開發的(de)格局翻天覆地(dì / de)。流水的(de)框架鐵打的(de)英偉達,這(zhè)些框架大(dà)多都極度依賴英偉達的(de) CUDA(統一(yī / yì /yí)計算架構),且在(zài)英偉達 GPU 上(shàng)性能最好。不(bù)過,随着 PyTorch 2.0 和(hé / huò) OpenAI 的(de) Triton 的(de)到(dào)來(lái),英偉達因其軟件護城河而(ér)在(zài)這(zhè)一(yī / yì /yí)領域的(de)制霸地(dì / de)位恐将不(bù)保。

本篇報告中将涵蓋以(yǐ)下主題:爲(wéi / wèi)何谷歌的(de) TensorFlow 輸給了(le/liǎo) PyTorch,谷歌爲(wéi / wèi)何沒能利用其在(zài)人(rén)工智能領域的(de)早期領導地(dì / de)位,機器學習模型訓練時(shí)間的(de)主要(yào / yāo)構成成分,内存容量、帶寬、成本牆,模型優化,爲(wéi / wèi)何其他(tā)人(rén)工智能硬件公司至今無法撼動英偉達的(de)統治地(dì / de)位,爲(wéi / wèi)何硬件地(dì / de)位逐漸重要(yào / yāo),英偉達在(zài) CUDA 上(shàng)的(de)競争優勢是(shì)如何消失的(de),以(yǐ)及英偉達的(de)競争對手在(zài)大(dà)型雲的(de)芯片訓練上(shàng)所取得的(de)重大(dà)勝利。

問題簡述是(shì),英偉達閉源 CUDA 将不(bù)再涵蓋機器學習模型的(de)默認軟件棧。英偉達雖然搶占先機,但卻讓 OpenAI 和(hé / huò) Meta 後來(lái)居上(shàng)掌控了(le/liǎo)軟件棧,英偉達專有工具的(de)失敗緻使後者在(zài)生态系統中建立了(le/liǎo)自己的(de)工具,英偉達的(de)護城河也(yě)遭到(dào)了(le/liǎo)永久地(dì / de)削弱。

TensorFlow vs. PyTorch

僅僅幾年前,在(zài)相當分散的(de)框架生态系統中,掌握最常用框架 TensorFlow 的(de)谷歌作爲(wéi / wèi)領跑者,設計并部署了(le/liǎo)唯一(yī / yì /yí)成功的(de)人(rén)工智能指定應用加速器 TPU,他(tā)們看似已經搶占先機、準備好制霸機器學習行業了(le/liǎo)。

2019 年機器學習框架狀态,PyTorch 掌控研究領域,Tensorflow 掌控行業領域

可事實卻是(shì) PyTorch 赢了(le/liǎo),而(ér)谷歌沒能将先手優勢轉換爲(wéi / wèi)對新生機器學習行業的(de)主導權。如今的(de)谷歌使用自研軟硬件棧而(ér)非 PyTorch 和(hé / huò)對應 GPU,導緻其在(zài)機器學習社區的(de)地(dì / de)位頗爲(wéi / wèi)尴尬,谷歌甚至還有另一(yī / yì /yí)套名爲(wéi / wèi) Jax 的(de)框架,直接和(hé / huò) TensorFlow 相競争。

不(bù)僅如此,關于(yú)谷歌在(zài)搜索及自然語言處理方面的(de)主導地(dì / de)位會因大(dà)型語言模型而(ér)衰退之(zhī)類的(de)言論也(yě)是(shì)甚嚣塵上(shàng),尤其是(shì)來(lái)自那些 OpenAI 及各種利用 OpenAI 的(de) API 的(de)、或基于(yú)類似基礎模型的(de)初創公司。雖說(shuō)可能是(shì)有些杞人(rén)憂天,但我們今天不(bù)談這(zhè)些。目前來(lái)說(shuō),雖然挑戰不(bù)斷,但谷歌仍是(shì)處于(yú)機器學習模型的(de)最前沿。谷歌所發明的(de) Transformer 在(zài) PaLM、LaMBDA、Chinchilla、MUM,以(yǐ)及 TPU 等諸多領域依舊是(shì)最先進的(de)。

讓我們回到(dào) PyTorch 赢得一(yī / yì /yí)籌的(de)話題中去。雖然也(yě)有從谷歌手中奪取掌控權的(de)成分在(zài),但 PyTorch 主要(yào / yāo)還是(shì)赢在(zài)了(le/liǎo)其相對 TensorFlow 而(ér)言更高的(de)靈活性和(hé / huò)可用性,從原則爲(wéi / wèi)先的(de)角度來(lái)看,PyTorch 與 TensorFlow 的(de)不(bù)同在(zài)于(yú)前者使用的(de)是(shì)“動态圖模式(Eager Mode)”而(ér)非“圖模式(Graph Mode)”。

動态圖模式可被看作是(shì)一(yī / yì /yí)種标準的(de)腳本執行方式。深度學習框架會随調用立即逐行執行所有操作,這(zhè)點和(hé / huò)任何的(de) Python 代碼執行都一(yī / yì /yí)樣。因此,代碼的(de)調試和(hé / huò)理解也(yě)都更加容易,操作間的(de)結果和(hé / huò)模型表現也(yě)更直觀。

相較之(zhī)下,圖模式則有兩個(gè)階段,第一(yī / yì /yí)階段定義需要(yào / yāo)執行操作的(de)計算圖,其中計算圖是(shì)一(yī / yì /yí)系列代表操作、變量的(de)相交節點,節點相連的(de)邊則代表其間的(de)數據流。第二階段定義延遲執行計算圖的(de)優化版本。因爲(wéi / wèi)圖的(de)執行過程中我們無從得知到(dào)底發生着什麽,所以(yǐ)這(zhè)種分階段的(de)方式讓代碼調試更具挑戰,也(yě)更難理解。這(zhè)與“解釋性”和(hé / huò)“編譯性”編程語言類似,可解釋的(de) Python 調試要(yào / yāo)比 C++更容易。

盡管現在(zài) TensorFlow 也(yě)默認擁有了(le/liǎo)動态圖模式,但研究社區和(hé / huò)多數大(dà)型技術公司都已經習慣了(le/liǎo) PyTorch 的(de)解決方案。至于(yú) PyTorch 更勝一(yī / yì /yí)籌的(de)深層解釋,請見這(zhè)裏。總之(zhī),主流 AI 大(dà)會 NeurIPS 上(shàng)最優秀的(de)那些非谷歌的(de)生成性人(rén)工智能都是(shì)用的(de) PyTorch。

機器學習訓練組件

追根究底,影響機器學習的(de)模型訓練耗時(shí)主要(yào / yāo)有兩個(gè)因素:1. 計算(FLOPS),即每層内運行密集的(de)矩陣乘法 2. 内存(帶寬),即等待數據或層權重獲取計算資源。常見受帶寬限制的(de)操作有歸一(yī / yì /yí)化、點式操作、SoftMax、ReLU。

曾經主要(yào / yāo)影響機器學習訓練時(shí)長的(de)計算時(shí)間、等待矩陣乘法等因素,随着英偉達 GPU 的(de)不(bù)斷發展都已不(bù)再重要(yào / yāo)。英偉達的(de) FLOPS 在(zài)摩爾定律下英偉達的(de) FLOPS 在(zài)摩爾定律下提升了(le/liǎo)多個(gè)數量級,但主要(yào / yāo)架構變化還是(shì)集中在(zài)張量核心及低精度浮點格式上(shàng),内存方面則沒有太多變化。

英偉達 GPU 增長趨勢

2018 年的(de) BERT 模型和(hé / huò)英偉達的(de) GPU V100 均是(shì)時(shí)代頂尖産品,我們不(bù)難發現,矩陣乘法已經不(bù)再是(shì)提高模型性能的(de)主要(yào / yāo)因素。自此之(zhī)後,最爲(wéi / wèi)先進的(de)模型在(zài)參數數量上(shàng)有了(le/liǎo) 3 至四個(gè)數量級的(de)增長,而(ér)最快的(de) GPU 也(yě)有了(le/liǎo)一(yī / yì /yí)個(gè)數量級的(de)增長。

PyTorch中操作類占比

即使是(shì)在(zài) 2018 年,純粹的(de)計算性質工作負載在(zài)占據 99.8%的(de) FLOPS 同時(shí),僅占用了(le/liǎo) 61%的(de)運行時(shí)間。歸一(yī / yì /yí)化和(hé / huò)逐點操作相較矩陣乘法而(ér)言,分别擁有 250 倍和(hé / huò) 700 倍 FLOPS 的(de)減少,但同時(shí)也(yě)消耗了(le/liǎo)模型近 40%的(de)運行時(shí)間。

内存牆

随着模型規模的(de)不(bù)斷擴張,大(dà)型語言模型的(de)權重本身便占據了(le/liǎo)千億、乃至太字節。百度和(hé / huò) Meta 所部署的(de)生産型推薦網絡其中的(de)大(dà)規模嵌入表就(jiù)可占用幾十兆字節内存,大(dà)型模型訓練或推理中的(de)大(dà)部分時(shí)間并沒有花在(zài)矩陣乘法的(de)計算,而(ér)是(shì)在(zài)等待數據到(dào)達計算資源。或許你會問,爲(wéi / wèi)什麽架構師不(bù)把更多内存放在(zài)靠近計算模塊的(de)地(dì / de)方?答案隻有一(yī / yì /yí)個(gè)字,貴。

存儲層級

存儲層級所遵循的(de)規律是(shì)從近且快,到(dào)慢但廉價的(de)。共享内存池最近可以(yǐ)在(zài)同一(yī / yì /yí)塊芯片上(shàng),通常這(zhè)種情況是(shì)由 SRAM(靜态随機存取存儲器)組成。有的(de)機器學習 ASIC 嘗試利用大(dà)型 SRAM 池保存模型權重,但即使是(shì)Cerebras價值約5百萬美元的(de)晶圓規模芯片上(shàng)也(yě)隻有 40G 的(de) SRAM。我們沒有足夠的(de)内存來(lái)容納 100B 以(yǐ)上(shàng)的(de)參數模型權重。

英偉達的(de)架構常常會在(zài)芯片上(shàng)使用更爲(wéi / wèi)少量的(de)内存,當前一(yī / yì /yí)代 A100 包括了(le/liǎo) 40MB 内存,而(ér)下一(yī / yì /yí)代的(de) H100 上(shàng)也(yě)隻有 50MB。台積電 5 納米工藝節點上(shàng) 1GB 的(de) SRAM 需要(yào / yāo)大(dà)約 200 平方毫米的(de)矽,加上(shàng)相關的(de)控制邏輯和(hé / huò)結構的(de)實現後就(jiù)需要(yào / yāo)超過 400 平方毫米的(de)矽,或使用英偉達數據中心 GPU 總邏輯面積的(de) 50%左右。考慮到(dào) A100 GPU 超過 1 萬美元的(de)價格,H100 的(de)價格很可能也(yě)會兩萬美元起步,經濟層面上(shàng)這(zhè)條路行不(bù)通。就(jiù)算我們忽略英偉達數據中心 GPU 的(de) 75%毛利率(約爲(wéi / wèi)四倍加價),實現産品的(de)完全産出(chū)所需要(yào / yāo)每 GB 的(de) SRAM 内存,成本仍在(zài)一(yī / yì /yí)百美元上(shàng)下。

此外,芯片上(shàng) SRAM 内存的(de)花銷并不(bù)會随着傳統摩爾定律所帶來(lái)的(de)工藝技術縮減而(ér)下降太多,在(zài)下一(yī / yì /yí)代台積電 3 納米工藝技術下,同樣 1GB 的(de)内存成本實際是(shì)在(zài)增長的(de)。3D SRAM 雖然會在(zài)一(yī / yì /yí)定程度上(shàng)降低 SRAM 成本,但這(zhè)也(yě)隻是(shì)價格曲線的(de)暫時(shí)下跌。

存儲層次中的(de)下一(yī / yì /yí)層是(shì)緊密耦合的(de)片外内存 DRAM。DRAM 相較于(yú) SRAM,延遲要(yào / yāo)高上(shàng)一(yī / yì /yí)個(gè)數量級(約 100 納秒和(hé / huò) 10 納秒的(de)區别),但 DRAM 也(yě)要(yào / yāo)便宜許多(DRAM 每 GB 一(yī / yì /yí)美元,SRAM 每 GB 一(yī / yì /yí)百美元)

數十年來(lái) DRAM 一(yī / yì /yí)直遵循摩爾定律,事實上(shàng),在(zài)戈登·摩爾創造“摩爾定律”這(zhè)個(gè)詞時(shí),英特爾的(de)主要(yào / yāo)業務就(jiù)是(shì) DRAM。摩爾關于(yú)晶體管密度與成本的(de)經濟預測對 2009 年之(zhī)前的(de) DRAM 通常都是(shì)準确的(de),但自 2012 年來(lái),DRAM 的(de)成本幾乎沒有提升。

DRAM 每 GB 價格

我們對内存的(de)需求隻增不(bù)減,目前 DRAM 已經占據了(le/liǎo)服務器總成本的(de)50%。内存牆的(de)存在(zài)已經開始在(zài)産品中顯露出(chū)來(lái)了(le/liǎo)。相比英偉達 2016 年的(de) GPU P100,2022 年剛剛發售的(de) GPU H100 在(zài)内存容量上(shàng)提升了(le/liǎo)五倍(16GB 到(dào) 80GB 的(de)提升),而(ér) FP16 性能卻提升了(le/liǎo)足足 46 倍(21.1 TFLOPS 至 989.5 TFLOPS)。

容量瓶頸與另一(yī / yì /yí)同樣重要(yào / yāo)的(de)帶寬瓶頸息息相關。并行化是(shì)增加内存帶寬的(de)主要(yào / yāo)手段,如今的(de) DRAM 每 GB 價格區區幾美元,而(ér)英偉達爲(wéi / wèi)了(le/liǎo)達到(dào)機器學習所需要(yào / yāo)的(de)巨大(dà)帶寬而(ér)用上(shàng)了(le/liǎo) HBM 内存,這(zhè)是(shì)一(yī / yì /yí)種由3D堆疊的(de)DRAM層所組成的(de)設備,且需要(yào / yāo)更爲(wéi / wèi)昂貴的(de)包裝。HBM 的(de)價格區間爲(wéi / wèi) 10 至 20 美元每 GB,其中包含有包裝與産量成本。

内存帶寬與容量限制在(zài)英偉達 A100 GPU 中被反複提及。沒有大(dà)量優化過的(de) A100 常常會有極低的(de) FLOPS 利用率,FLOPS 利用率是(shì)通過計算(模型訓練時(shí)總計算 FLOPS)/(GPU 在(zài)模型訓練時(shí)間内理論可計算 FLOPS)而(ér)得出(chū)。

即使是(shì)在(zài)頂尖研究者所做的(de)大(dà)量優化下,60%的(de) FLOPS 利用率對于(yú)大(dà)型語言模型訓練而(ér)言也(yě)算是(shì)非常高的(de)了(le/liǎo)。剩下的(de)時(shí)間都是(shì)開銷,包括等待其他(tā)計算或内存數據的(de)空閑期,或爲(wéi / wèi)減少内存瓶頸而(ér)進行即時(shí)重新計算結果。

FLOPS 在(zài) A100 至 H100 兩代間增長了(le/liǎo) 6 倍有餘,但内存帶寬卻隻有 1.65 倍的(de)增長,從而(ér)導緻了(le/liǎo)許多對 H100 低利用率問題的(de)擔憂。人(rén)們爲(wéi / wèi)讓 A100 繞過内存牆搞出(chū)了(le/liǎo)許多變通方案,而(ér)這(zhè)種努力在(zài) H100 上(shàng)恐怕會隻多不(bù)少。

H100爲(wéi / wèi)Hopper架構帶來(lái)了(le/liǎo)分布式共享内存和(hé / huò)二級組播,其中不(bù)同 SM(可看作内核)可直接寫入其他(tā) SM 的(de) SRAM(共享内存/L1 緩存)。此舉在(zài)有效增加緩存大(dà)小的(de)同時(shí),縮減了(le/liǎo)DRAM讀寫所需的(de)帶寬。後續架構也(yě)将通過減少向内存傳輸的(de)操作緩解内存牆的(de)影響。值得注意的(de)是(shì),因爲(wéi / wèi)對 FLOPS 的(de)需求會随參數數量增加而(ér)立方擴展,對内存帶寬及容量的(de)需求則常呈二次曲線發展,所以(yǐ)較大(dà)型的(de)模型也(yě)更傾向于(yú)實現更高的(de)利用率。

算子(zǐ)融合 - 治标不(bù)治本

同機器學習模型訓練一(yī / yì /yí)樣,明白自己所處狀态才能更精确地(dì / de)進行重要(yào / yāo)的(de)優化。舉例來(lái)說(shuō),如果我們處于(yú)内存帶寬約束的(de)狀态,時(shí)間全花在(zài)了(le/liǎo)内存傳輸上(shàng),那麽增加 GPU 的(de) FLOPS 并不(bù)能解決問題。而(ér)如果是(shì)處于(yú)計算約束的(de)狀态,笨重的(de)矩陣乘法非常耗時(shí)的(de)話,那麽試圖通過将模型邏輯改寫成 C++來(lái)削減開銷也(yě)是(shì)沒效果的(de)。

雖然 PyTorch 是(shì)通過動态圖模式增加了(le/liǎo)靈活性和(hé / huò)可用性而(ér)赢得的(de)比賽,但動态圖模式也(yě)不(bù)是(shì)完美的(de)。在(zài)動态圖模式中執行的(de)每個(gè)操作都需要(yào / yāo)從内存中讀取、計算,再發送到(dào)内存之(zhī)後,才能處理下一(yī / yì /yí)個(gè)操作。在(zài)缺乏大(dà)量優化的(de)情況下,這(zhè)種模式将大(dà)大(dà)增加對内存帶寬的(de)需求。

因此,動态圖模式中執行模型的(de)主要(yào / yāo)優化手段之(zhī)一(yī / yì /yí)是(shì)算子(zǐ)融合。用融合操作符的(de)方式取代将每次的(de)中間結果寫入内存,在(zài)一(yī / yì /yí)次計算中計算多個(gè)函數,從而(ér)盡可能減少對内存的(de)讀寫。算子(zǐ)融合改善了(le/liǎo)操作符的(de)調度,也(yě)削減了(le/liǎo)内存帶寬和(hé / huò)容量的(de)成本。

算子(zǐ)融合簡圖

這(zhè)種優化方式常常需要(yào / yāo)編寫自定義 CUDA 内核,這(zhè)可比簡單使用 Python 腳本要(yào / yāo)難多了(le/liǎo)。PyTorch 的(de)内置變通方案長期以(yǐ)來(lái)在(zài) PyTorch 内部實現了(le/liǎo)越來(lái)越多的(de)操作符,這(zhè)其中的(de)許多操作符都隻是(shì)将多個(gè)常用操作融合到(dào)一(yī / yì /yí)個(gè)更爲(wéi / wèi)複雜的(de)函數中。

操作符的(de)增加讓 PyTorch 中的(de)模型創建更加輕松,随着内存讀寫次數的(de)減少,動态圖模式的(de)性能也(yě)更快。但随之(zhī)而(ér)來(lái)的(de)代價是(shì) PyTorch 中運算符在(zài)短短幾年内就(jiù)膨脹至兩千有餘。

人(rén)們常說(shuō)軟件開發者是(shì)懶人(rén),但老實說(shuō)又有誰不(bù)是(shì)呢。在(zài)熟悉了(le/liǎo) PyTorch 中某個(gè)新增的(de)操作符後,開發者們通常隻會覺得這(zhè)個(gè)新操作符能讓自己少些點代碼,而(ér)完全沒有意識到(dào)其中的(de)性能提高。

此外,并不(bù)是(shì)所有的(de)操作都能融合。大(dà)部分時(shí)間我們都在(zài)決定要(yào / yāo)融合哪些操作,又要(yào / yāo)将哪些操作分配給芯片和(hé / huò)集群層面特定的(de)計算資源。雖然一(yī / yì /yí)般來(lái)說(shuō)算子(zǐ)融合的(de)策略都多少有些類似,但根據架構的(de)不(bù)同也(yě)會有所區别。

英偉達稱王

操作符數量的(de)發展和(hé / huò)其默認的(de)首選地(dì / de)位讓英偉達受益很多,每個(gè)被迅速優化的(de)操作符都是(shì)針對英偉達架構的(de),且對其他(tā)硬件并不(bù)适用。任何想要(yào / yāo)完整實現 PyTorch 的(de)人(rén)工智能硬件初創公司,都得靠高性能才能原生支持兩千多個(gè)且還在(zài)不(bù)斷增長的(de)操作符。

在(zài) GPU 上(shàng)訓練高 FLOPS 利用率的(de)大(dà)型模型所需的(de)技術水平越來(lái)越高,爲(wéi / wèi)達到(dào)最佳性能所需花樣也(yě)越發繁多。動态圖模式的(de)執行和(hé / huò)算子(zǐ)融合,意味着軟件、技術、模型的(de)開發都要(yào / yāo)被迫适應最新一(yī / yì /yí)代 GPU 的(de)計算和(hé / huò)内存比例範圍。

内存牆是(shì)任何機器學習芯片的(de)開發者都逃不(bù)開的(de)命運。ASIC 必須要(yào / yāo)能支持常用框架的(de)同時(shí),也(yě)要(yào / yāo)能支持混合使用英偉達及外部庫的(de)、基于(yú) GPU 優化的(de) PyTorch 代碼這(zhè)一(yī / yì /yí)默認開發策略。因此,爲(wéi / wèi)圖更高 FLOPS 及更嚴格的(de)編程模型,而(ér)主動放棄 GPU 的(de)各種非計算包袱這(zhè)種行爲(wéi / wèi)是(shì)非常沒有意義的(de)。

易用性是(shì)王道(dào)。

要(yào / yāo)打破這(zhè)種惡性循環的(de)唯一(yī / yì /yí)方式是(shì)将英偉達 GPU 上(shàng)運行模型的(de)軟件,盡可能地(dì / de)無縫轉移至其他(tā)硬件上(shàng)。随着 PyTorch 2.0、OpenAI Triton,以(yǐ)及諸如MosaicML的(de)MLOps公司所提供的(de)模型架構穩定性和(hé / huò)抽象逐漸得到(dào)主流承認,芯片解決方案的(de)架構和(hé / huò)性價比逐漸取代了(le/liǎo)英偉達卓越的(de)軟件所帶來(lái)的(de)易用性,成爲(wéi / wèi)驅動購買力的(de)主要(yào / yāo)因素。

PyTorch 2.0

數月之(zhī)前剛剛成立的(de)PyTorch基金會正式脫離了(le/liǎo)Meta的(de)掌握。在(zài)向開放式開發和(hé / huò)管理模式轉變的(de)同時(shí),2.0 的(de)早期測試版本已經發布,并預計于(yú) 2023 年三月全年上(shàng)市。PyTorch 2.0 與前代最主要(yào / yāo)的(de)區别在(zài)于(yú),新增的(de)一(yī / yì /yí)個(gè)支持圖執行模型的(de)編譯解決方案,讓各種硬件資源的(de)利用更加輕松。

PyTorch 2.0 在(zài)英偉達 A100 上(shàng)的(de)訓練性能有了(le/liǎo)86%的(de)提升,CPU上(shàng)的(de)推理則有26%的(de)提升,極大(dà)地(dì / de)縮減了(le/liǎo)模型訓練所需的(de)計算時(shí)間和(hé / huò)成本。而(ér)這(zhè)種性能提升也(yě)可以(yǐ)類推至包括AMD、英特爾、Tenstorrent、Luminous Computing、特斯拉、谷歌、亞馬遜、微軟、Marvell、Meta、Graphcore、Cerebras、SambaNova 在(zài)内的(de)多個(gè) GPU 和(hé / huò)加速器上(shàng)。

PyTorch 2.0 的(de)性能提升在(zài)未經優化的(de)硬件上(shàng)更爲(wéi / wèi)明顯。Meta 及其他(tā)公司對 PyTorch 的(de)大(dà)量貢獻背後,是(shì)希望能在(zài)他(tā)們數十億美元的(de)訓練集群上(shàng),以(yǐ)最小的(de)努力實現更高的(de) FLOPS 利用率,讓他(tā)們的(de)軟件棧更易于(yú)移植到(dào)其他(tā)硬件上(shàng),從而(ér)爲(wéi / wèi)機器學習領域引入新的(de)競争力。

分布式訓練也(yě)受益于(yú) PyTorch 2.0,數據并行、分片、管道(dào)并行及張量并行均得到(dào)了(le/liǎo)更優秀的(de) API 支持。除此之(zhī)外,PyTorch 2.0 也(yě)通過全棧提供了(le/liǎo)對動态圖形的(de)原生支持,讓LLM不(bù)同序列長度等更易于(yú)支持。這(zhè)也(yě)是(shì)主流編譯器第一(yī / yì /yí)次支持從訓練到(dào)推理的(de)動态形狀。

PrimTorch

對任何非英偉達 GPU 之(zhī)外的(de)任何機器學習 ASIC 來(lái)說(shuō),想要(yào / yāo)編寫一(yī / yì /yí)個(gè)完整支持全部兩千餘個(gè)操作符的(de)高性能後端是(shì)非常具有挑戰性的(de)。而(ér) PrimTorch 卻可以(yǐ)在(zài)保障 PyTorch 終端用戶可用性不(bù)變的(de)前提下,将操作符數量減少至約 250 個(gè)原始操作符,讓非英偉達的(de) PyTorch 後端實現更簡單容易,定制硬件和(hé / huò)操作系統的(de)供應商也(yě)更容易提出(chū)自己的(de)軟件棧。

TorchDynamo

穩健的(de)圖定義是(shì)向圖模式轉變的(de)必需品,而(ér)過去五年間 Meta 和(hé / huò) PyTorch 在(zài)這(zhè)方面解決方案的(de)嘗試都有着明顯的(de)缺陷,直到(dào) TorchDynamo 的(de)出(chū)現。TorchDynamo 可接收任何 PyTorch 用戶腳本并生成FX圖,甚至是(shì)調用三方外部庫的(de)腳本也(yě)可以(yǐ)。

Dynamo 将所有複雜操作都壓縮爲(wéi / wèi) PrimTorch 中約 250 個(gè)原始操作符。圖成型後所有未使用的(de)操作會被棄置,成型的(de)圖決定了(le/liǎo)有哪些中間操作需要(yào / yāo)被存儲或寫入内存,有哪些可以(yǐ)被融合。這(zhè)種方式極大(dà)地(dì / de)削減了(le/liǎo)模型内開銷,對用戶而(ér)言也(yě)是(shì)無感的(de)。

目前在(zài)不(bù)修改任何源碼的(de)前提下,TorchDynamo已在(zài)超過七千個(gè)PyTorch模型上(shàng)通過了(le/liǎo)可行性測試,其中不(bù)乏來(lái)自 OpenAI、HuggingFace、Meta、英偉達、Stability.AI 的(de)模型。這(zhè)七千多個(gè)模型是(shì)從 GitHub 上(shàng)熱度最高的(de) PyTorch 項目中直接選取的(de)。

谷歌的(de) TensorFlow、Jax 及其他(tā)圖模式的(de)執行管道(dào),通常需要(yào / yāo)用戶自行保障模型對編譯器架構的(de)兼容性,才能确保圖可以(yǐ)被捕獲。而(ér) Dynamo 通過啓用部分圖捕獲、受保護的(de)圖捕獲及即時(shí)重新捕獲進行改善。

部分圖捕獲允許模型包括不(bù)支持或非 Python 的(de)結構。在(zài)無法生成圖的(de)模型構造部分插入圖斷點,并在(zài)部分圖之(zhī)間以(yǐ)動态圖模式執行。受保護圖捕獲校驗被捕獲的(de)圖是(shì)否可有效執行。保護是(shì)指需要(yào / yāo)重新編譯的(de)代碼變更,畢竟多次重複執行的(de)同一(yī / yì /yí)段代碼并不(bù)會重新編譯。即時(shí)重新捕獲允許無效執行的(de)圖重新被捕獲。

PyTorch 意圖創建一(yī / yì /yí)個(gè)依賴 Dynamo 圖生成的(de)、統一(yī / yì /yí)且流暢的(de) UX。這(zhè)項解決方案在(zài)不(bù)改變用戶體驗的(de)同時(shí)顯著提高性能,而(ér)圖捕獲意味着在(zài)大(dà)型計算資源的(de)基礎上(shàng)執行可以(yǐ)更高效地(dì / de)并行進行。

Dynamo 及AOT自動求導會在(zài)之(zhī)後将優化後的(de) FX 圖傳入 PyTorch 本地(dì / de)編譯器層,即 TorchInductor。其他(tā)硬件企業也(yě)可直接取用此時(shí)的(de)圖并輸入至他(tā)們自己的(de)後端編譯器中。

TorchInductor

作爲(wéi / wèi)原生的(de) Python 深度學習編譯器,TorchInductor 可爲(wéi / wèi)多個(gè)加速器和(hé / huò)後端生成快速代碼。Inductor(電感器)可接收包含約 250 個(gè)操作符的(de) FX 圖,并進一(yī / yì /yí)步将其操作符數量削減至 50 左右。在(zài)這(zhè)之(zhī)後,Inductor 會進入調度階段,融合算子(zǐ)并确定内存規劃。

之(zhī)後,Inductor 會進入“代碼封裝”階段,生成可在(zài) CPU、GPU 及其他(tā)人(rén)工智能加速器上(shàng)運行的(de)代碼。封裝後的(de)代碼可調用内核并分配内存,取代了(le/liǎo)編譯器堆棧中解釋器的(de)部分。其中,後端代碼的(de)生成部分借助 OpenAI 的(de) GPU 語言 Triton,輸出(chū) PTX 代碼。對 CPU 而(ér)言,英特爾編譯器所生成的(de) C++代碼也(yě)可以(yǐ)在(zài)非英特爾的(de) CPU 上(shàng)運行。

後續還會新增更多對硬件的(de)支持,但 Inductor 确實顯著降低了(le/liǎo)在(zài)編寫 AI 硬件加速器的(de)編譯器時(shí)所需的(de)工作量。此外,代碼性能也(yě)得到(dào)了(le/liǎo)優化,對内存帶寬和(hé / huò)容量的(de)要(yào / yāo)求也(yě)大(dà)大(dà)地(dì / de)降低了(le/liǎo)。

我們寫的(de)編譯器不(bù)能隻支持 GPU,而(ér)要(yào / yāo)能擴展到(dào)對各類硬件後端的(de)支持。C++及(OpenAI)Triton 迫使着我們一(yī / yì /yí)定要(yào / yāo)具備這(zhè)種通用性。——Jason Ansel – Meta AI

OpenAI Triton

OpenAI 的(de) Triton 語言對英偉達機器學習閉源軟件的(de)護城河有着毀滅性的(de)打擊。Triton 可直接接收 Python 腳本,或者更常見地(dì / de)接收通過PyTorch的(de)Inductor堆棧的(de)信息流。随後 Triton 會将輸入轉換爲(wéi / wèi) LLVM 中間表示并生成代碼,使用 cutlass 等開源庫取代英偉達的(de)閉源 CUDA 庫(如 cuBLAS)。

CUDA 在(zài)專職于(yú)加速計算的(de)開發者中更爲(wéi / wèi)常用,在(zài)機器學習研究者或數據科學家之(zhī)間則沒什麽知名度。高效地(dì / de)使用 CUDA 并不(bù)容易,需要(yào / yāo)使用者對硬件架構有深入理解,并可能會拖慢開發過程。因此,機器學習專家們常常會依賴 CUDA 專家對他(tā)們的(de)代碼進行修改、優化,以(yǐ)及并行化。

而(ér) Triton 則彌補了(le/liǎo)這(zhè)一(yī / yì /yí)差距,讓高層語言達到(dào)與底層語言相媲美的(de)性能水平。Triton 的(de)内核本身對一(yī / yì /yí)般的(de)機器學習研究者而(ér)言具備可讀性,這(zhè)一(yī / yì /yí)點對語言可用性非常重用。Triton 将内存凝聚、共享内存管理,以(yǐ)及 SM 内部的(de)調度全部自動化,但對元素層面的(de)矩陣乘法沒什麽太大(dà)幫助,後者本身已經足夠高效了(le/liǎo)。此外,Triton 在(zài)昂貴的(de)逐點操作方面很有效,對涉及矩陣乘法的(de)大(dà)型算子(zǐ)融合而(ér)言,也(yě)可明顯削減複雜如Flash注意力等操作的(de)開銷。

時(shí)至今日,OpenAI 的(de) Triton 才正式支持英偉達的(de) GPU,不(bù)過很快就(jiù)要(yào / yāo)不(bù)同了(le/liǎo)。數個(gè)其他(tā)硬件供應商都會在(zài)後續對其提供支持,這(zhè)項開源項目的(de)前途一(yī / yì /yí)片光明。其他(tā)硬件加速器能夠直接集成至 Triton 中 LLVM IR,意味着在(zài)新硬件上(shàng)建立人(rén)工智能編譯器堆棧的(de)時(shí)間将大(dà)幅縮短。

英偉達龐大(dà)的(de)軟件組織缺乏遠見,沒能利用自己在(zài)機器學習軟硬件方面的(de)巨大(dà)優勢,一(yī / yì /yí)舉成爲(wéi / wèi)機器學習的(de)默認編譯器。英偉達對可用性關注的(de)缺失讓外界中 OpenAI 及 Meta 得以(yǐ)開發出(chū)向其他(tā)硬件方向移植的(de)軟件棧。他(tā)們爲(wéi / wèi)什麽沒能爲(wéi / wèi)機器學習研究者們開發出(chū)一(yī / yì /yí)個(gè)像是(shì) Triton 之(zhī)類的(de)*簡化版*CUDA?爲(wéi / wèi)什麽像是(shì)Flash注意力一(yī / yì /yí)類的(de)技術是(shì)出(chū)自一(yī / yì /yí)個(gè)博士生而(ér)不(bù)是(shì)英偉達本身?

本篇報告中的(de)剩餘部分将會列出(chū)能讓微軟拿下一(yī / yì /yí)城的(de)具體硬件加速器,以(yǐ)及目前正被快速集成至 PyTorch 2.0 或 OpenAI Trion 軟件棧中多家公司的(de)硬件産品。此外,報告中也(yě)将列出(chū)相反觀點,爲(wéi / wèi)英偉達在(zài)人(rén)工智能培訓領域的(de)護城河或實力提供辯護。

查看英文原文:How Nvidia’s CUDA Monopoly In Machine Learning Is Breaking - OpenAI Triton And PyTorch 2.0

本文轉載來(lái)源:

https://www.infoq.cn/article/9TFWk1rM2h8hLJUvbUG0

上(shàng)一(yī / yì /yí)篇:軟件開發越來(lái)越糟?(軟件開發)軟件開發的(de)人(rén)厲害嗎,

下一(yī / yì /yí)篇:從零做電商:3個(gè)月實現月銷10萬,這(zhè)套方法讓新手少走彎路(電子(zǐ)商務)做電商月入千萬,

在(zài)線咨詢

點擊這(zhè)裏給我發消息 售前咨詢專員

點擊這(zhè)裏給我發消息 售後服務專員

在(zài)線咨詢

免費通話

24小時(shí)免費咨詢

請輸入您的(de)聯系電話,座機請加區号

免費通話

微信掃一(yī / yì /yí)掃

微信聯系
返回頂部