網(wǎng)站續(xù)費(fèi)管理系統(tǒng)合肥網(wǎng)站排名提升
參考:https://blog.51cto.com/u_16099172/7398948
問題:用小數(shù)據(jù)集訓(xùn)練顯存使用率、GPU使用率正常,但是用大數(shù)據(jù)集訓(xùn)練GPU使用率一直是0.
小數(shù)據(jù):
大數(shù)據(jù):
1、我理解GPU內(nèi)存占用率=顯存使用率,由模型的大小以及batch size的大小,來(lái)影響這個(gè)指標(biāo)。模型結(jié)構(gòu)固定的情況下,盡量將batch size設(shè)置大,充分利用GPU的內(nèi)存。但是代碼中有val部分,val時(shí)會(huì)只使用gpu0,bs太大可能導(dǎo)致val時(shí)候out of memory。
2、gpu利用率。GPU在等待數(shù)據(jù)從CPU傳輸過來(lái),當(dāng)從總線傳輸?shù)紾PU之后,GPU逐漸起計(jì)算來(lái),利用率會(huì)突然升高,但是GPU的算力很強(qiáng)大,0.5秒就基本能處理完數(shù)據(jù)。所以利用率接下來(lái)又會(huì)降下去,等待下一個(gè)batch的傳入。因此,這個(gè)GPU利用率瓶頸在內(nèi)存帶寬和內(nèi)存介質(zhì)上以及CPU的性能上面。最好當(dāng)然就是換更好的四代或者更強(qiáng)大的內(nèi)存條,配合更好的CPU。硬件都固定的情況下,嘗試調(diào)節(jié)參數(shù)優(yōu)化gpu使用率。
在PyTorch這個(gè)框架里面,數(shù)據(jù)加載Dataloader上做更改和優(yōu)化,包括num_workers(線程數(shù)),pin_memory,會(huì)提升速度。解決好數(shù)據(jù)傳輸?shù)膸捚款i和GPU的運(yùn)算效率低的問題。
torch.utils.data.DataLoader(image_datasets[x],batch_size=batch_size, shuffle=True,num_workers=8,pin_memory=True)
為了提高利用率,首先要將num_workers(線程數(shù))設(shè)置得體,4,8,16是幾個(gè)常選的幾個(gè)參數(shù)。本人測(cè)試過,將num_workers設(shè)置的非常大,例如,24,32,等,其效率反而降低,因?yàn)槟P托枰獙?shù)據(jù)平均分配到幾個(gè)子線程去進(jìn)行預(yù)處理,分發(fā)等數(shù)據(jù)操作,設(shè)高了反而影響效率。當(dāng)然,線程數(shù)設(shè)置為1,是單個(gè)CPU來(lái)進(jìn)行數(shù)據(jù)的預(yù)處理和傳輸給GPU,效率也會(huì)低。其次,當(dāng)你的服務(wù)器或者電腦的內(nèi)存較大,性能較好的時(shí)候,建議打開pin_memory打開,就省掉了將數(shù)據(jù)從CPU傳入到緩存RAM里面,再給傳輸?shù)紾PU上;為True時(shí)是直接映射到GPU的相關(guān)內(nèi)存塊上,省掉了一點(diǎn)數(shù)據(jù)傳輸時(shí)間。
3. CPU的利用率問題
很多人在模型訓(xùn)練過程中,不只是關(guān)注GPU的各種性能參數(shù),往往還需要查看CPU處理的怎么樣,利用的好不好。這一點(diǎn)至關(guān)重要。但是對(duì)于CPU,不能一味追求超高的占用率。如圖所示,對(duì)于14339這個(gè)程序來(lái)說(shuō),其CPU占用率為2349%(我的服務(wù)器是32核的,所以最高為3200%)。這表明用了24核CPU來(lái)加載數(shù)據(jù)和做預(yù)處理和后處理等。其實(shí)主要的CPU花在加載傳輸數(shù)據(jù)上。此時(shí),來(lái)測(cè)量數(shù)據(jù)加載的時(shí)間發(fā)現(xiàn),即使CPU利用率如此之高,其實(shí)際數(shù)據(jù)加載時(shí)間是設(shè)置恰當(dāng)?shù)腄ataLoader的20倍以上,也就是說(shuō)這種方法來(lái)加載數(shù)據(jù)慢20倍。當(dāng)DataLoader的num_workers=0時(shí),或者不設(shè)置這個(gè)參數(shù),會(huì)出現(xiàn)這個(gè)情況。