在公司,mentor教了我一些關(guān)于CPU,GPU的知識,將學(xué)過的計組知識拿起來一起幫助理解。趁著記憶還在,記下一些大概的想法
首先對CPU,GPU有一個初顯的理解,以前我就用速度取理解兩者,不管里面的內(nèi)容。CPU,是中央處理器,代表內(nèi)存,串行處理;
GPU,圖形處理器,代表外存(獨立顯卡,也許集成顯卡也有?)并行處理,要用到GPU顯存時,需要一個工具將數(shù)據(jù)從硬盤放到內(nèi)存,然后從內(nèi)存放到GPU上,為什么GPU可以放,CPU不行呢?因為GPU有專門的框架幫忙處理,比如pytorch,tensolfow這些,那numpy為啥不行呢,因為沒有這個調(diào)用源碼呢,舉個torch的命令比如torch.to(GPU.device)(提一下Nvidia的cuda,cudann給GPU的加速訓(xùn)練)使用GPU訓(xùn)練。
PS:(PyTorch不是代碼行“GPU -> on”,而是“CUDA”張量。CUDA是一個用于在GPU上執(zhí)行操作的庫?;旧希琍yTorch要求你聲明要在GPU上放置的內(nèi)容,然后你可以像往常一樣執(zhí)行操作。)
從數(shù)據(jù)量來理解一下為什么batch_size參數(shù)太大會導(dǎo)致輸出結(jié)果爆掉或者說是報錯RAM不夠,首先明白數(shù)據(jù)的處理過程:從硬盤讀到內(nèi)存(RAM),再送到顯存(GPU),舉個例子假如batch_size是4,每張圖片是400×400×3,那么一次從硬盤讀到內(nèi)存的數(shù)據(jù)量是 400×400×3個像素點×4(假如每個像素點是int 4位存儲的話)*batch_size=480000*4*batch_size(bit),240000×batch_size(B),而RAM可用空間不大,會被爆掉。
這些是一些個人理解吸收吧,很感謝mentor肯手把手教我這些基礎(chǔ)知識,emmmm,換而言之,我這不就是在學(xué)習(xí)一些先驗知識嗎,哈哈哈哈,元數(shù)據(jù)來了,后面就容易學(xué)進去了!
另外去網(wǎng)上查了些資料,網(wǎng)上有一個比喻用來比較 GPU 和 CPU ,我覺得非常貼切,100 個小學(xué)生和一個大學(xué)教授組成兩隊進行數(shù)學(xué)比賽,第一回合是兩隊分別完成 100 道四則運算題,比賽開始,第一回合教授還在寫的時候,小學(xué)生們已經(jīng)完成了答題,然后進行了第二回合,第二回合是兩隊分別完成 1 道高等數(shù)學(xué)題目,教授已經(jīng)完成了答題,100個小學(xué)生還在冥思苦想。
這就是GPU和CPU的最大不同,他們設(shè)計的目標不一樣,針對不同的應(yīng)用場景。CPU需要很強的通用性來處理各種不同的數(shù)據(jù)類型,還要邏輯判斷引入大量分支跳轉(zhuǎn)和中斷處理,使得CPU內(nèi)部結(jié)構(gòu)復(fù)雜,被大量cache占據(jù)空間,它的計算性能只是CPU的很小一部分呢。
GPU面對的是類型高度統(tǒng)一的,相互無依賴的大規(guī)模數(shù)據(jù)和不需要被打斷的純凈計算環(huán)境,采用數(shù)量眾多的計算單元和超長的流水線,簡單的控制邏輯省去cache,這張Nvidia CUDA文檔很好說明了,其中綠色是計算單元,橙紅色的是存儲單元,橙黃色是控制單元。

結(jié)合那個比喻來看就是,一些簡單的操作,GPU可以用大量的并行操作取同時進行,完全是人海戰(zhàn)術(shù),而對復(fù)雜的操作不能,但是深度學(xué)習(xí)而言,處理數(shù)據(jù)這種簡單操作足矣,CPU是串行操作,可以應(yīng)對復(fù)雜的操作指令,但是它的復(fù)雜結(jié)構(gòu),以及內(nèi)存大小的限制導(dǎo)致它無法那么快處理那么多的數(shù)據(jù)單元。
搞定,回家!