隨著傳統(tǒng)的順序算法到日益流行的并行算法,GPU 將成為加速復雜計算不可或缺的工具。在 AI 和機器學習任務等具有海量數(shù)據(jù)集和復雜的神經(jīng)網(wǎng)絡的架構(gòu)中,GPU 的并行處理能力具有很大的優(yōu)勢。本文將深入探討學習。
原文鏈接:https://journal.hexmos.com/gpu-survival-toolkit/
作者 | Rijul Rajesh譯者| 彎月
責編 | 夏萌
出品 | CSDN(ID:CSDNnews)
為什么僅有 CPU 的知識還不夠
在如今的 AI 時代,大多數(shù)開發(fā)人員接受過 CPU 相關(guān)知識的培訓。這些知識已成為教學內(nèi)容的一部分,因此一般我們都會以面向 CPU 的方式思考和解決問題。
然而,CPU 的問題在于它們依賴于順序架構(gòu)。在當今世界,我們依賴于大量并行任務,而 CPU 并不適合這些情況。
開發(fā)人員面臨的問題包括:
執(zhí)行并行任務
傳統(tǒng)的 CPU 是線性運行的,一次執(zhí)行一條指令。有這種限制是因為 CPU 通常擁有若干針對單線程性能進行過優(yōu)化的強大核心。
在面對多個任務時,CPU 會分配資源來依次處理每個任務,即順序執(zhí)行指令。在需要同時關(guān)注大量任務的情況下,這種方法會變得效率低下。
雖然我們可以通過多線程等技術(shù)來提高 CPU 的性能,但其基本設計理念優(yōu)先考慮的是順序執(zhí)行。
高效運行 AI 模型
AI模型采用 Transformer 等先進架構(gòu),利用并行處理來提高性能。與順序運行的舊式循環(huán)神經(jīng)網(wǎng)絡 (RNN)不同,GPT 等現(xiàn)代Transformer 可以同時處理多個單詞,從而提高訓練的效率和能力。因為當我們并行訓練時,就可以得到更大的模型,而更大的模型會生成更好的輸出。
并行性的概念超越了自然語言處理,擴展到了圖像識別等其他領(lǐng)域。例如,圖像識別架構(gòu) Ale.NET 可以同時處理圖像的不同部分,展現(xiàn)出了并行處理的強大功能,從而實現(xiàn)了準確的模式識別。
然而,以單線程性能為重心設計的 CPU 很難充分發(fā)揮并行處理的潛力。它們無法有效地分配和執(zhí)行復雜的 AI 模型所需的大量并行計算。
因此,GPU 的開發(fā)變得越來越普遍,為的是滿足 AI 應用程序中并行處理的特定需求,從而實現(xiàn)更高的效率和更快的計算。
如何利用 GPU 驅(qū)動開發(fā)解決這些問題
GPU 核心的大規(guī)模并行性
與 CPU 的核心相比,工程師們設計的 GPU 具有更小、高度專業(yè)化的核心。這種架構(gòu)允許 GPU 同時執(zhí)行多個并行任務。
GPU中的大量核心非常適合依賴于并行性的工作負載,例如圖形渲染和復雜的數(shù)學計算。
在本文中,我們將演示如何利用 GPU 的并行性來縮短完成復雜的任務所需的時間。
AI 模型中使用的并行性
AI模型,特別是基于 TensorFlow 等深度學習框架構(gòu)建的模型,展現(xiàn)出了高度的并行性。神經(jīng)網(wǎng)絡的訓練涉及大量矩陣運算,而 GPU 憑借其龐大的核心數(shù)量,能夠并行化這些運算。TensorFlow 以及其他流行的深度學習框架都進行了優(yōu)化,能夠利用 GPU 的能力來加速模型的訓練和推理。
在本文中,我們將展示如何利用 GPU 的強大功能來訓練神經(jīng)網(wǎng)絡。
CPU與 GPU 有何不同?CPU
順序架構(gòu)
中央處理單元(CPU)的設計重心是順序處理。它們擅長線性執(zhí)行一組指令。
CPU針對需要高單線程性能的任務進行了優(yōu)化,例如
- 通用計算
- 系統(tǒng)操作
- 處理涉及條件分支的復雜算法
處理并行任務的核心數(shù)量有限
CPU的核心數(shù)量較少,消費級的處理器通常有 2~16個核心。每個核心都能夠獨立處理自己的指令集。
GPU
并行架構(gòu)
圖形處理單元(GPU)采用并行架構(gòu)設計,能夠高效地執(zhí)行并行處理任務。
適合于:
- 渲染圖形
- 執(zhí)行復雜的數(shù)學計算
- 運行可并行的算法
GPU通過將多個任務分解為更小的并行子任務來同時處理多個任務。
數(shù)千個用于并行任務的核心
與 CPU 不同,GPU 擁有大量核心,通常高達數(shù)千個。這些核心組織成了流式多處理器(SM)或類似的結(jié)構(gòu)。
豐富的核心使 GPU 能夠同時處理大量數(shù)據(jù),非常適合并行任務,例如圖像和視頻處理、深度學習和科學模擬等。
AWS GPU 實例:初學者指南
Amazon Web Services(AWS)提供各種用于機器學習等任務的 GPU 實例。
以下是不同類型的 AWS GPU 實例及其用例:
通用 GPU 實例
- P3 和 P4 實例作為多功能通用 GPU 實例,非常適合各種工作負載。
- 其中包括機器學習訓練和推理、圖像處理和視頻編碼。它們的各方面能力都很平衡,因此成為了各種計算任務的可靠選擇。
- 價格:p3.2xlarge實例的費用為每小時 3.06 美元。
- 提供 1 個 16 GB GPU 內(nèi)存的 NVIDIA Tesla V100 GPU。
推理優(yōu)化 GPU 實例
- 推理指的是通過訓練好的 AI 模型運行實時數(shù)據(jù)以進行預測或解決任務的過程。
- P5 和 Inf1 實例專門針對機器學習推理,在十分注重低延遲和成本的場合中有著出色表現(xiàn)。
- 價格:p5.48xlarge實例的費用為每小時 98.32 美元。
- 提供 8 個 NVIDIA H100 GPU,每個 GPU 80 GB 內(nèi)存,共計 640 GB 顯存。
圖形優(yōu)化 GPU 實例
- G4 實例主要用于處理圖形密集型任務。
- 視頻游戲開發(fā)人員可以使用 G4 實例來渲染視頻游戲的 3D 圖形。
- 價格:g4dn.xlarge的費用為每小時 0.526 美元。
- 提供 1 個 16 GB 內(nèi)存的 NVIDIA T4 GPU。
托管 GPU 實例
- Amazon SageMaker是一項機器學習托管服務。提供支持各種 GPU 實例的訪問,包括 P3、P4 和 P5 實例。
- 對于希望接觸機器學習,同時不想操心底層基礎設施管理的組織來說,SageMaker 是一個不錯的選擇。
- 價格:https://aws.amazon.com/sagemaker/pricing/?ref=journal.hexmos.com
使用 Nvidia 的 CUDA 進行GPU 驅(qū)動開發(fā)CUDA是什么?
CUDA是一款 NVIDIA 開發(fā)的并行計算平臺和編程模型,可幫助開發(fā)人員利用 GPU 加速器的強大功能來提高應用程序的速度。
下面,我們將使用 CUDA 來展示一個示例。
設置 CUDA
你可以按照以下步驟操作,在計算機上設置 CUDA。
- 下載CUDA(https://developer.nvidia.com/cuda-downloads?ref=journal.hexmos.com)
- 通過上面的鏈接,下載基本的安裝程序以及驅(qū)動程序安裝程序。
- 打開主文件夾中的.bashrc,將以下內(nèi)容添加到文件中: export PATH="/usr/local/cuda-12.3/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/cuda-12.3/lib64:$LD_LIBRARY_PATH"
- 執(zhí)行以下命令 sudo apt-get install cuda-toolkit sudo apt-get install nvidia-gds
- 重啟系統(tǒng)。
在安裝好 CUDA 后,你可以嘗試以下命令。
LSPCI | grep VGA
此命令可識別并列出系統(tǒng)中的 GPU。
nvidia-smi
此命令為 NVIDIA System Management Interface(NVIDIA 系統(tǒng)管理界面)的縮寫,可提供系統(tǒng)中有關(guān) NVIDIA GPU 的詳細信息,包括利用率、溫度、內(nèi)存使用情況等。
sudo lshw -C display
此命令可提供系統(tǒng)中有關(guān)顯示控制器(包括顯卡)的詳細信息。
inxi -G
此命令可提供有關(guān)圖形子系統(tǒng)的信息,包括有關(guān) GPU 和顯示器的詳細信息。
sudo hwinfo --gfxcard
此命令可提供系統(tǒng)中有關(guān)顯卡的詳細信息。
使用 CUDA 框架
下面,我們來展示 CUDA 的一些具體功能。
數(shù)組加法問題
數(shù)組加法問題很適合演示 GPU 并行化。
考慮以下數(shù)組:
- 數(shù)組 A = [1,2,3,4,5,6]
- 數(shù)組 B = [7,8,9,10,11,12]
- 我們需要計算每個元素之和,并存儲在數(shù)組C中。
- 即 C = [1+7,2+8,3+9,4+10,5+11,6+12] = [8,10,12,14,16,18]
如果由 CPU 來執(zhí)行整個操作,則代碼如下:
前一個循環(huán)遍歷數(shù)組的每個元素,并依次執(zhí)行加法。當需要處理大量數(shù)字時,這種方法就會由于其順序執(zhí)行的性質(zhì)而變得緩慢。
為了克服這個限制,GPU 提供了一種解決方案:并行化加法運算。不同于依次執(zhí)行運算的 CPU,GPU 可以同時執(zhí)行多項加法。
例如,運算 1+7、2+8、3+9、4+10、5+11 和 6+12 可以借助 GPU 并行化同時執(zhí)行。
利用 CUDA,實現(xiàn)并行加法的代碼如下:
我們將使用內(nèi)核文件(.cu)進行演示。
我們來逐行講解代碼。
- __global__ 表明該函數(shù)是一個內(nèi)核函數(shù),將在 GPU 上調(diào)用。
- vectorAdd 接受三個整數(shù)指針(a、b 和 c)作為參數(shù),代表相加的向量。
- threadIdx.x 獲取當前線程的索引(在一維網(wǎng)格中)。
- 向量 a 和 b 的相應元素之和存儲在向量 c 中。
下面,我們來看看 main 函數(shù)。
創(chuàng)建指針 cudaA、cudaB 和 cudaC,指向 GPU 上的內(nèi)存。
我們使用 cudaMalloc,為向量 cudaA、cudaB 和 cudaC 分配 GPU上的內(nèi)存。
使用 cudaMemcpy 將向量 a 和b 的內(nèi)容從主機復制到 GPU。
使用一個塊和多個(數(shù)量等于向量大小)線程調(diào)用內(nèi)核函數(shù) vectorAdd。
將結(jié)果向量 cudaC 從 GPU 復制回主機。
然后就可以正常輸出結(jié)果了:
我們使用 nvcc 命令執(zhí)行這段代碼。
輸出如下:
完整的代碼,請參見這里(https://Github.com/RijulTP/GPUToolkit/tree/main/array-addition?ref=journal.hexmos.com)。
使用 GPU 優(yōu)化 Python/ target=_blank class=infotextkey>Python 中的圖像生成
下面,我們來探討如何使用 GPU 處理來優(yōu)化性能密集型任務,例如圖像生成。
曼德博集合是一種數(shù)學結(jié)構(gòu),可根據(jù)指定方程中特定數(shù)字的行為形成復雜的視覺模式。生成這種集合是一項資源密集型操作。
通過下面的代碼片段,你可以了解到使用 CPU 處理生成曼德博集合的傳統(tǒng)方法,該方法的速度很慢。
上面的代碼生成結(jié)果需要耗費 4.07 秒。
為了提高速度,我們可以通過 Numba 庫利用 GPU 的并行化。具體方法如下。
首先,我們導入 Numba 庫的即時編譯、用于 GPU 加速的 CUDA 以及其他實用程序。
@jit指示 Numba 執(zhí)行即時編譯,將 Python 代碼轉(zhuǎn)換為機器代碼,以提高執(zhí)行速度。
- mandel_gpu 是使用cuda.jit 創(chuàng)建的 mandel 函數(shù)的 GPU 兼容版本。它可以將 mandel 的邏輯卸載到 GPU。
- 為此,我們需要使用@cuda.jit,并指定函數(shù)參數(shù)的數(shù)據(jù)類型(f8 表示浮點數(shù),uint32 表示無符號整數(shù))。
- device=True 參數(shù)表示該函數(shù)將在GPU 上運行。
根據(jù)定義,mandel_kernel 將在 CUDA GPU 上執(zhí)行。負責跨 GPU 線程并行生成曼德博集合。
接下來,我們可以在 create_fractal_gpu 函數(shù)中使用 GPU 加速的曼德博集合生成。create_fractal_gpu 函數(shù)需要分配 GPU 內(nèi)存,啟動 GPU 內(nèi)核 (mandel_kernel),并將結(jié)果復制回 CPU。
上述代碼只需 0.0046 秒內(nèi)就能執(zhí)行完成。比之前的 CPU 的代碼要快許多。
完整的代碼,請參見這里(https://github.com/RijulTP/GPUToolkit/tree/main/mandelbrot?ref=journal.hexmos.com)。
使用 GPU 訓練區(qū)分貓狗的神經(jīng)網(wǎng)絡
GPU在 AI 領(lǐng)域的應用是如今的熱門話題之一,出于演示的目的,下面我們來創(chuàng)建一個用于區(qū)分貓和狗神經(jīng)網(wǎng)絡。
準備工作
- CUDA
- 安裝Tensorflow:pip install tensorflow[and-cuda]
- 我們將使用kaggle 的貓狗數(shù)據(jù)集。
- 下載完成后,解壓,將訓練文件夾中的貓狗圖片整理到不同的子文件夾,如下所示:
導入庫:
- pandas 和 numpy:用于操作數(shù)據(jù)。
- Sequential:用于創(chuàng)建神經(jīng)網(wǎng)絡中疊放的線性層。
- Convolution2D、MaxPooling2D、Dense 和 Flatten:構(gòu)建卷積神經(jīng)網(wǎng)絡(CNN)的各層。
- ImageDataGenerator:用于在訓練期間進行實時數(shù)據(jù)增強。
初始化卷積神經(jīng)網(wǎng)絡(CNN)
加載訓練數(shù)據(jù)
構(gòu)建 CNN 架構(gòu)
編譯模型
訓練模型
訓練完成后,使用 classifier.save 將模型存儲在 .h5 文件中。
在下面的代碼中,我們將使用 trained_model.h5 來識別貓和狗。
輸出如下:
完整的代碼,請參見這里(https://github.com/RijulTP/GPUToolkit/tree/main/neural-network?ref=journal.hexmos.com)。
總結(jié)
在即將到來的 AI 時代,GPU 是不容忽視的存在,我們應該深入了解它的能力。
隨著我們從傳統(tǒng)的順序算法過渡到日益流行的并行算法,GPU 將成為加速復雜計算不可或缺的工具。在 AI 和機器學習任務等具有海量數(shù)據(jù)集和復雜的神經(jīng)網(wǎng)絡的架構(gòu)中,GPU 的并行處理能力具有很大的優(yōu)勢。
此外,GPU 已超出傳統(tǒng)的機器學習領(lǐng)域,在科學研究、模擬和數(shù)據(jù)密集型任務中也有找到了應用。事實證明,GPU 的并行處理能力有助于解決藥物發(fā)現(xiàn)、氣候建模以及金融模擬等各個領(lǐng)域的難題。