如果您希望可以時常見面,歡迎標(biāo)星收藏哦~
隨著人工智能不斷滲透到生活的各個領(lǐng)域,這些工具將運(yùn)行在哪種軟件上仍然是一個問題。軟件堆棧的選擇在以 GPU 為中心的人工智能任務(wù)計(jì)算需求中變得越來越重要。
隨著 AI 和 HPC 應(yīng)用不斷突破計(jì)算能力的極限,軟件堆棧的選擇會顯著影響性能、效率和開發(fā)人員的生產(chǎn)力。
目前,軟件堆棧競爭中有三個主要參與者:Nvidia 的計(jì)算統(tǒng)一設(shè)備架構(gòu) 、英特爾的 oneAPI 和 AMD 的 Radeon Open Compute (ROCm)。雖然它們各有優(yōu)缺點(diǎn),但 Nvidia 的 CUDA 繼續(xù)占據(jù)主導(dǎo)地位,主要是因?yàn)槠溆布?HPC 和現(xiàn)在的 AI 領(lǐng)域處于領(lǐng)先地位。
在這里,我們將深入研究每個軟件堆棧的復(fù)雜性——探索它們的功能、硬件支持以及與流行的 AI 框架 PyTorch 的集成。此外,我們將最后快速了解兩種高級 HPC 語言:Chapel 和 Julia。
Nvidia 的 CUDA
Nvidia 的 CUDA 是該公司專有的并行計(jì)算平臺和軟件堆棧,用于在其 GPU 上進(jìn)行通用計(jì)算。CUDA 提供了一個應(yīng)用程序編程接口 ,使軟件能夠利用 Nvidia GPU 的并行處理能力來加速計(jì)算。
首先必須提到 CUDA,因?yàn)樗?AI 和 GPU 密集型 HPC 任務(wù)的軟件堆棧領(lǐng)域占據(jù)主導(dǎo)地位,這是有充分理由的。CUDA 自 2006 年就已存在,這使其擁有悠久的第三方支持歷史和成熟的生態(tài)系統(tǒng)。許多庫、框架和其他工具都專門針對 CUDA 和 Nvidia GPU 進(jìn)行了優(yōu)化。對 CUDA 堆棧的長期支持是其相對于其他堆棧的主要優(yōu)勢之一。
Nvidia 提供了一套全面的工具集作為 CUDA 平臺的一部分,包括 CUDA 編譯器,如Nvidia CUDA Compiler 。還有許多用于調(diào)試和優(yōu)化 CUDA 應(yīng)用程序的調(diào)試器和分析器以及用于分發(fā) CUDA 應(yīng)用程序的開發(fā)工具。此外,CUDA 的悠久歷史催生了大量的文檔、教程和社區(qū)資源。
在討論 AI 任務(wù)時,CUDA 對 PyTorch 框架的支持也至關(guān)重要。該軟件包是一個基于 Torch 庫的開源機(jī)器學(xué)習(xí)庫,主要用于計(jì)算機(jī)視覺和自然語言處理中的應(yīng)用。PyTorch 對 CUDA 提供了廣泛且完善的支持。PyTorch 中的 CUDA 集成經(jīng)過高度優(yōu)化,可在 Nvidia GPU 上進(jìn)行高效的訓(xùn)練和推理。同樣,CUDA 的成熟意味著可以訪問 PyTorch 可以使用的眾多庫和工具。
除了大量加速庫之外,Nvidia 還為 AI 研究人員和軟件開發(fā)人員提供了完整的深度學(xué)習(xí)軟件堆棧。該堆棧包括流行的 CUDA 深度神經(jīng)網(wǎng)絡(luò)庫 ,這是一個 GPU 加速的 度神經(jīng)網(wǎng)絡(luò)基元庫。CuDNN 可加速廣泛使用的深度學(xué)習(xí)框架,包括 Caffe2 、Chainer 、Keras 、MATLAB 、MxNet 、PaddlePaddle 、PyTorch和TensorFlow。
更重要的是,CUDA 旨在與所有 Nvidia GPU 配合使用,從消費(fèi)級 GeForce 顯卡到高端數(shù)據(jù)中心 GPU,為用戶提供可使用硬件的廣泛多功能性。
盡管如此,CUDA 仍有改進(jìn)空間,而 Nvidia 的軟件堆棧也存在一些用戶必須考慮的缺點(diǎn)。首先,盡管 CUDA 可以免費(fèi)使用,但它是 Nvidia 擁有的專有技術(shù),因此不是開源的。這種情況將開發(fā)人員鎖定在 Nvidia 的生態(tài)系統(tǒng)和硬件中,因?yàn)樵?CUDA 上開發(fā)的應(yīng)用程序無法在非 Nvidia GPU 上運(yùn)行,除非進(jìn)行重大代碼更改或使用兼容層。同樣,CUDA 的專有性質(zhì)意味著軟件堆棧的開發(fā)路線圖完全由 Nvidia 控制。開發(fā)人員對 CUDA 代碼庫的貢獻(xiàn)或修改能力有限。
開發(fā)人員還必須考慮 CUDA 的許可成本。CUDA 本身對于非商業(yè)用途是免費(fèi)的,但商業(yè)應(yīng)用可能需要購買昂貴的 Nvidia 硬件和軟件許可證。
AMD 的 ROCm
AMD 的 ROCm 是許多開發(fā)人員選擇的另一種軟件堆棧。雖然 CUDA 可能占據(jù)主導(dǎo)地位,但 ROCm 卻與眾不同,因?yàn)樗怯糜?GPU 計(jì)算的開源軟件堆棧。此功能允許開發(fā)人員自定義和貢獻(xiàn)代碼庫,促進(jìn)社區(qū)內(nèi)的協(xié)作和創(chuàng)新。ROCm 的一個關(guān)鍵優(yōu)勢是它支持 AMD 和 Nvidia GPU,從而實(shí)現(xiàn)跨平臺開發(fā)。
這一獨(dú)特功能由異構(gòu)計(jì)算可移植接口 實(shí)現(xiàn),它使開發(fā)人員能夠創(chuàng)建可在不同 GPU 平臺上運(yùn)行的可移植應(yīng)用程序。雖然 ROCm 支持消費(fèi)級和專業(yè)級 AMD GPU,但其主要重點(diǎn)是 AMD 專為專業(yè)工作負(fù)載設(shè)計(jì)的高端 Radeon Instinct 和 Radeon Pro GPU。
與 CUDA 一樣,ROCm 提供了一系列用于 GPU 編程的工具。這些工具包括 C/C++ 編譯器以及 Fortran 編譯器(如 Flang)。此外,還有適用于各種領(lǐng)域的庫,例如線性代數(shù)、FFT 和深度學(xué)習(xí)。
盡管如此,與 CUDA 相比,ROCm 的生態(tài)系統(tǒng)相對較新,需要在第三方支持、庫和工具方面迎頭趕上。與 CUDA 提供的大量文檔、教程和支持相比,進(jìn)入市場的遲到也意味著文檔和社區(qū)資源更加有限。對于 PyTorch 來說,情況尤其如此,它支持 ROCm 平臺,但由于其歷史和成熟度較短,需要在性能、優(yōu)化和第三方支持方面趕上 CUDA。ROCm 上 PyTorch 的文檔和社區(qū)資源比 CUDA 的更有限。不過,AMD在這方面正在取得進(jìn)展。
與 Nvidia 一樣,AMD 也提供了大量的ROCm 庫。AMD 為深度學(xué)習(xí)提供了一個與 cuDNN 相當(dāng)?shù)膸欤麨?MIOpen,用于 PyTorch 的 ROCm 版本。
此外,雖然 ROCm 同時支持 AMD 和 Nvidia GPU,但由于驅(qū)動程序開銷和優(yōu)化挑戰(zhàn),其在 Nvidia 硬件上運(yùn)行時的性能可能無法與 CUDA 相匹配。
英特爾的 oneAPI
英特爾的 oneAPI 是一種統(tǒng)一的跨平臺編程模型,支持針對各種硬件架構(gòu)和加速器進(jìn)行開發(fā)。它支持多種架構(gòu),包括來自不同供應(yīng)商的 CPU、GPU、FPGA 和 AI 加速器。它旨在為異構(gòu)計(jì)算提供與供應(yīng)商無關(guān)的解決方案,并利用 SYCL 等行業(yè)標(biāo)準(zhǔn)。此功能意味著它可以在 AMD 和 Nvidia 等外部供應(yīng)商的架構(gòu)以及英特爾的硬件上運(yùn)行。
與 ROCm 一樣,oneAPI 是一個開源平臺。因此,與 CUDA 相比,oneAPI 有更多的社區(qū)參與和對代碼庫的貢獻(xiàn)。oneAPI 支持開源開發(fā),支持多種編程語言和框架,包括帶有 SYCL 的 C/C++、Fortran、Python 和 TensorFlow。此外,oneAPI 為異構(gòu)計(jì)算提供了統(tǒng)一的編程模型,簡化了跨不同硬件的開發(fā)。
同樣,與 ROCm 一樣,oneAPI 也存在一些與堆棧成熟度相關(guān)的缺點(diǎn)。作為一個較年輕的平臺,oneAPI 需要在第三方軟件支持和針對特定硬件架構(gòu)的優(yōu)化方面趕上 CUDA。
從 PyTorch 中的具體用例來看,與成熟的 CUDA 集成相比,oneAPI 仍處于早期階段。PyTorch 可以利用 oneAPI 的數(shù)據(jù)并行 Python 庫在 Intel CPU 和 GPU 上進(jìn)行分布式訓(xùn)練,但對 oneAPI GPU 的原生 PyTorch 支持仍處于開發(fā)階段,尚未準(zhǔn)備好投入生產(chǎn)。
話雖如此,值得注意的是,oneAPI 的優(yōu)勢在于其基于開放標(biāo)準(zhǔn)的方法和跨平臺可移植性的潛力。如果擔(dān)心供應(yīng)商鎖定并且在不同硬件架構(gòu)上運(yùn)行 PyTorch 模型的能力是優(yōu)先事項(xiàng),那么 oneAPI 可能是一個可行的選擇。
目前,如果 Nvidia GPU 上的最大性能是 PyTorch 工作負(fù)載開發(fā)人員的主要目標(biāo),那么 CUDA 仍然是首選,因?yàn)樗鼡碛型晟频纳鷳B(tài)系統(tǒng)。也就是說,尋求與供應(yīng)商無關(guān)的解決方案的開發(fā)人員或主要使用 AMD 或英特爾硬件的開發(fā)人員可能希望分別依賴 ROCm 或 oneAPI。
雖然 CUDA 在生態(tài)系統(tǒng)開發(fā)方面處于領(lǐng)先地位,但其專有性質(zhì)和硬件特異性可能會使 ROCm 和 oneAPI 成為某些開發(fā)人員更有利的解決方案。此外,隨著時間的推移,這些堆棧的社區(qū)支持和文檔將繼續(xù)增長。CUDA 現(xiàn)在可能占據(jù)主導(dǎo)地位,但這種情況在未來幾年可能會發(fā)生變化。
抽象出堆棧
總體而言,許多開發(fā)人員更喜歡創(chuàng)建獨(dú)立于硬件的應(yīng)用程序。在 HPC 中,出于性能原因,硬件優(yōu)化是合理的,但許多現(xiàn)代程序員更喜歡專注于他們的應(yīng)用程序,而不是底層硬件的細(xì)微差別。
PyTorch 就是這一趨勢的一個很好的例子。Python 并不是一種特別快的語言,但 Hugging Face 上 92% 的模型都是PyTorch 獨(dú)有的。只要硬件供應(yīng)商在其庫上構(gòu)建了 PyTorch 版本,用戶就可以專注于模型,而不必?fù)?dān)心底層硬件的差異。雖然這種可移植性很好,但它并不能保證性能,而這正是底層硬件架構(gòu)可能發(fā)揮作用的地方。
當(dāng)然,Pytorch 基于 Python,這是許多程序員最喜愛的第一語言。這種語言通常以易用性換取性能。當(dāng)使用 Python 啟動 HPC 項(xiàng)目時,它們傾向于遷移到基于分布式 C/C++ 和 MPI 或使用 OpenMP 的線程應(yīng)用程序的可擴(kuò)展高性能代碼。這些選擇通常會導(dǎo)致“兩種語言”問題,開發(fā)人員必須管理其代碼的兩個版本。
目前,兩種“較新”的語言 Chapel 和 Julia 提供了一種易于使用的語言解決方案,可提供高性能編碼環(huán)境。除其他外,這些語言試圖“抽象”編寫并行 HPC 集群、多核處理器和 GPU/加速器環(huán)境應(yīng)用程序所需的許多細(xì)節(jié)。在它們的基礎(chǔ)上,它們?nèi)匀灰蕾囉谏厦嫣岬降墓?yīng)商 GPU 庫,但通常可以輕松構(gòu)建能夠在運(yùn)行時識別和適應(yīng)底層硬件環(huán)境的應(yīng)用程序。
Chapel
Chapel最初由 Cray 開發(fā),是一種并行編程語言,旨在實(shí)現(xiàn)比當(dāng)前編程語言(即“Fortran/C/C++ 加 MPI”)更高級別的表達(dá)。收購 Cray 的惠普企業(yè)目前支持該語言的開發(fā),將其作為 Apache 許可證第 2 版下的開源項(xiàng)目。當(dāng)前版本為2.0 版,Chapel 網(wǎng)站發(fā)布了一些令人印象深刻的并行性能數(shù)據(jù)。
Chapel 默認(rèn)編譯為二進(jìn)制可執(zhí)行文件,但也可以編譯為 C 代碼,用戶可以選擇編譯器。Chapel 代碼可以編譯為可從 C、Fortran 或 Python調(diào)用的庫。Chapel 通過為 Nvidia 和 AMD 圖形處理單元生成代碼來支持 GPU 編程。
Chapel可用的庫越來越多。最近有一個名為 Chainn 的神經(jīng)網(wǎng)絡(luò)庫可用于 Chapel,它專門用于使用并行編程構(gòu)建深度學(xué)習(xí)模型。Chainn 在 Chapel 中的實(shí)現(xiàn)使用戶能夠利用該語言的并行編程功能,并在從筆記本電腦到超級計(jì)算機(jī)的大規(guī)模上訓(xùn)練深度學(xué)習(xí)模型。
Julia
Julia 由麻省理工學(xué)院開發(fā),旨在成為上述雙語言問題的快速、靈活且可擴(kuò)展的解決方案。 Julia 的開發(fā)工作始于 2009 年,當(dāng)時 Jeff Bezanson、Stefan Karpinski、Viral B. Shah 和 Alan Edelman 著手創(chuàng)建一種既高級又快速的開放式技術(shù)計(jì)算語言。
與 Python 一樣,Julia使用快速的即時編譯器提供響應(yīng)式解釋編程環(huán)境 。該語言語法類似于 Matlab,并提供許多高級功能,包括:
1、多重分派:一個函數(shù)可以根據(jù)輸入類型有多種實(shí)現(xiàn)(易于創(chuàng)建可移植和自適應(yīng)代碼)
2、動態(tài)類型系統(tǒng):用于文檔、優(yōu)化和調(diào)度的類型
3、性能接近 C 等靜態(tài)類型語言。
4、內(nèi)置包管理器
5、專為并行和分布式計(jì)算而設(shè)計(jì)
6、可以編譯為二進(jìn)制可執(zhí)行文件
Julia 還擁有適用于 CUDA、ROCm、OneAPI 和 Apple 的GPU 庫,可與機(jī)器學(xué)習(xí)庫 Flux.jl一起使用。Flux 是用 Julia 編寫的,為 Julia 的原生 GPU 支持提供了輕量級的抽象。
Chapel 和 Julia 都提供了一種高級且可移植的 GPU 編程方法。與許多隱藏底層硬件細(xì)節(jié)的語言一樣,它們可能會有一些性能損失。不過,開發(fā)人員通常愿意犧牲幾個百分點(diǎn)的性能來換取易移植性。
點(diǎn)這里加關(guān)注,鎖定更多原創(chuàng)內(nèi)容
今天是《半導(dǎo)體行業(yè)觀察》為您分享的第3805期內(nèi)容,歡迎關(guān)注。
『半導(dǎo)體第一垂直媒體』
實(shí)時 專業(yè) 原創(chuàng) 深度
公眾號ID:icbank
喜歡我們的內(nèi)容就點(diǎn)“在看”分享給小伙伴哦
鄭重聲明:此文內(nèi)容為本網(wǎng)站轉(zhuǎn)載企業(yè)宣傳資訊,目的在于傳播更多信息,與本站立場無關(guān)。僅供讀者參考,并請自行核實(shí)相關(guān)內(nèi)容。