比較CPU和GPU中的矩陣計算
GPU 計算與 CPU 相比能夠快多少?在本文中,我將使用 Python 和 PyTorch 線性變換函數(shù)對其進行測試。
以下是測試機配置:
CPU:英特爾 i7 6700k (4c/8t) GPU:RTX 3070 TI(6,144 個 CUDA 核心和 192 個 Tensor 核心) 內(nèi)存:32G 操作系統(tǒng):Windows 10
無論是cpu和顯卡都是目前常見的配置,并不是頂配(等4090能夠正常發(fā)貨后我們會給出目前頂配的測試結(jié)果)?
NVIDIA GPU 術(shù)語解釋
CUDA 是Compute Unified Device Architecture的縮寫??梢允褂?CUDA 直接訪問 NVIDIA GPU 指令集,與專門為構(gòu)建游戲引擎而設(shè)計的 DirectX 和 OpenGL 不同,CUDA 不需要用戶理解復(fù)雜的圖形編程語言。但是需要說明的是CUDA為N卡獨有,所以這就是為什么A卡對于深度學(xué)習(xí)不友好的原因之一。
Tensor Cores是加速矩陣乘法過程的處理單元。
例如,使用 CPU 或 CUDA 將兩個 4×4 矩陣相乘涉及 64 次乘法和 48 次加法,每個時鐘周期一次操作,而Tensor Cores每個時鐘周期可以執(zhí)行多個操作。
上面的圖來自 Nvidia 官方對 Tensor Cores 進行的介紹視頻
CUDA 核心和 Tensor 核心之間有什么關(guān)系?Tensor Cores 內(nèi)置在 CUDA 核心中,當(dāng)滿足某些條件時,就會觸發(fā)這些核心的操作。
測試方法
GPU的計算速度僅在某些典型場景下比CPU快。在其他的一般情況下,GPU的計算速度可能比CPU慢!但是CUDA在機器學(xué)習(xí)和深度學(xué)習(xí)中被廣泛使用,因為它在并行矩陣乘法和加法方面特別出色。
上面的操作就是我們常見的線性操作,公式是這個
這就是PyTorch的線性函數(shù)torch.nn.Linear的操作??梢酝ㄟ^以下代碼將2x2矩陣轉(zhuǎn)換為2x3矩陣:
CPU 基線測試
在測量 GPU 性能之前,我需要線測試 CPU 的基準(zhǔn)性能。
為了給讓芯片滿載和延長運行時間,我增加了in_row、in_f、out_f個數(shù),也設(shè)置了循環(huán)操作10000次。
現(xiàn)在,讓我們看看CPU完成10000個轉(zhuǎn)換需要多少秒:
可以看到cpu花費55秒。
GPU計算
為了讓GPU的CUDA執(zhí)行相同的計算,我只需將. To (' cpu ')替換為. cuda()。另外,考慮到CUDA中的操作是異步的,我們還需要添加一個同步語句,以確保在所有CUDA任務(wù)完成后打印使用的時間。
并行運算只用了1.3秒,幾乎是CPU運行速度的42倍。這就是為什么一個在CPU上需要幾天訓(xùn)練的模型現(xiàn)在在GPU上只需要幾個小時。因為并行的簡單計算式GPU的強項
如何使用Tensor Cores
CUDA已經(jīng)很快了,那么如何啟用RTX 3070Ti的197Tensor Cores?,啟用后是否會更快呢?在PyTorch中我們需要做的是減少浮點精度從FP32到FP16。,也就是我們說的半精度或者叫混合精度
又是2.6倍的提升。
總結(jié)
在本文中,通過在CPU、GPU CUDA和GPU CUDA +Tensor Cores中調(diào)用PyTorch線性轉(zhuǎn)換函數(shù)來比較線性轉(zhuǎn)換操作。下面是一個總結(jié)的結(jié)果:
NVIDIA的CUDA和Tensor Cores確實大大提高了矩陣乘法的性能。
后面我們會有兩個方向的更新
1、介紹一些簡單的CUDA操作(通過Numba),這樣可以讓我們了解一些細節(jié)
2、我們會在拿到4090后發(fā)布一個專門針對深度學(xué)習(xí)的評測,這樣可以方便大家購買可選擇