pytorch GPU計算比CPU還慢的可能原因分析
1. 張量(tensor)太小,難以并行化計算
我們先來做個簡單實驗:
import torch import time def train(size_list, epochs): for s in size_list: # CPU start_time1 = time.time() a = torch.ones(s,s) for _ in range(epochs): a += a cpu_time = time.time() - start_time1 # GPU start_time2 = time.time() b = torch.ones(s,s).cuda() for _ in range(epochs): b += b gpu_time = time.time() - start_time2 print('s = %d, CPU_time = %.4fs, GPU_time = %.4fs'%(s, cpu_time, gpu_time)) size_list = [8, 32, 128, 512] epochs = 100000 train(size_list, 100000)
s = 8, CPU_time = 0.2252s, GPU_time = 0.6376s
s = 32, CPU_time = 0.3321s, GPU_time = 0.6468s
s = 128, CPU_time = 2.2634s, GPU_time = 0.6493s
s = 512, CPU_time = 9.6728s, GPU_time = 1.5587s
可以看到,在tensor維度比較低(s = 8, 32) 時,CPU的計算耗時比GPU少,這是因為把數(shù)據(jù)從CPU搬到GPU也是需要時間的,GPU加速帶來的收益被這部分搬運時間抵消了,完全展示不出cuda的加速功能。
當tensor維度達到128或以上時,GPU的計算耗時顯著低于CPU的計算耗時,這時GPU加速帶來的收益遠高于搬運數(shù)據(jù)所花費的時間,展示出GPU加速的強大能力(老黃牛批?。?。
咳咳,分析一下:
GPU加速通過大量的計算并行化來工作。 GPU有大量的內(nèi)核,每個內(nèi)核都不是很強大,但是核心數(shù)量巨大。PyTorch可以使它們盡可能地并行計算,在tensor維度比較高的情況下,GPU能夠并行化更多的整體計算,顯著減少計算耗時。
因此,如果遇到pytorch 用CPU比GPU還快的情況時,可以看看dataloader里單次輸入的 x 維度是否太低,如果太低可以把 batch_size 調(diào)大一點,可以的話增加一下數(shù)據(jù)維度,單次輸入的tensor的shape越大,GPU越能并行化計算。
當然,也不要設(shè)的太大了,比如batch_size設(shè)個大幾萬啥的,再強的顯卡也遭不住這么折騰。
2. 模型太過簡單
GPU的強大體現(xiàn)在它的并行計算,數(shù)據(jù)越大,模型越復(fù)雜越能體現(xiàn)出來。
太過簡單的模型CPU一下子就算完了,此時的GPU可能才剛接收完數(shù)據(jù),沒法體現(xiàn)GPU的強大。
因此,解決方案也很簡單,換個復(fù)雜點的模型或者加深加寬現(xiàn)有的神經(jīng)網(wǎng)絡(luò)模型。
3. CPU 相對 GPU 強太多
在相同的、沒調(diào)好的參數(shù)情況下,有時候64核的CPU用60%的核心(也就是38個)也能達到一張2080ti顯卡(GPU)的效果。
如果CPU是個64核的芯片,而顯卡是老黃家的古董960,那CPU比GPU快也是完全有可能的,這時候瓶頸就在顯卡了。
總結(jié)
以上是我在寫bug代碼時遇到的情況及可能原因,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python中fastapi設(shè)置查詢參數(shù)可選或必選
這篇文章主要介紹了python中fastapi設(shè)置查詢參數(shù)可選或必選,文圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值需要的小伙伴可以參考一下2022-06-06python pow函數(shù)的底層實現(xiàn)原理介紹
這篇文章主要介紹了python pow函數(shù)的底層實現(xiàn)原理介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python實現(xiàn)四舍五入的兩個方法總結(jié)
這篇文章主要介紹了python中實現(xiàn)四舍五入的兩種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-09-09python向已存在的excel中新增表,不覆蓋原數(shù)據(jù)的實例
下面小編就為大家分享一篇python向已存在的excel中新增表,不覆蓋原數(shù)據(jù)的實例,具有很好超參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python通用驗證碼識別OCR庫ddddocr的安裝使用教程
dddd_ocr是一個用于識別驗證碼的開源庫,又名帶帶弟弟ocr,下面這篇文章主要給大家介紹了關(guān)于Python通用驗證碼識別OCR庫ddddocr的安裝使用教程,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07