pytorch DataLoader的num_workers參數(shù)與設(shè)置大小詳解
Q:在給Dataloader設(shè)置worker數(shù)量(num_worker)時,到底設(shè)置多少合適?這個worker到底怎么工作的?
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=4)
參數(shù)詳解:
1、每次dataloader加載數(shù)據(jù)時:dataloader一次性創(chuàng)建num_worker個worker,(也可以說dataloader一次性創(chuàng)建num_worker個工作進(jìn)程,worker也是普通的工作進(jìn)程),并用batch_sampler將指定batch分配給指定worker,worker將它負(fù)責(zé)的batch加載進(jìn)RAM。
然后,dataloader從RAM中找本輪迭代要用的batch,如果找到了,就使用。如果沒找到,就要num_worker個worker繼續(xù)加載batch到內(nèi)存,直到dataloader在RAM中找到目標(biāo)batch。一般情況下都是能找到的,因為batch_sampler指定batch時當(dāng)然優(yōu)先指定本輪要用的batch。
2、num_worker設(shè)置得大,好處是尋batch速度快,因為下一輪迭代的batch很可能在上一輪/上上一輪...迭代時已經(jīng)加載好了。壞處是內(nèi)存開銷大,也加重了CPU負(fù)擔(dān)(worker加載數(shù)據(jù)到RAM的進(jìn)程是CPU復(fù)制的嘛)。num_workers的經(jīng)驗設(shè)置值是自己電腦/服務(wù)器的CPU核心數(shù),如果CPU很強(qiáng)、RAM也很充足,就可以設(shè)置得更大些。
3、如果num_worker設(shè)為0,意味著每一輪迭代時,dataloader不再有自主加載數(shù)據(jù)到RAM這一步驟(因為沒有worker了),而是在RAM中找batch,找不到時再加載相應(yīng)的batch。缺點當(dāng)然是速度更慢。
設(shè)置大小建議:
1、Dataloader的num_worker設(shè)置多少才合適,這個問題是很難有一個推薦的值。有以下幾個建議:
2、num_workers=0表示只有主進(jìn)程去加載batch數(shù)據(jù),這個可能會是一個瓶頸。
3、num_workers = 1表示只有一個worker進(jìn)程用來加載batch數(shù)據(jù),而主進(jìn)程是不參與數(shù)據(jù)加載的。這樣速度也會很慢。
num_workers>0 表示只有指定數(shù)量的worker進(jìn)程去加載數(shù)據(jù),主進(jìn)程不參與。增加num_works也同時會增加cpu內(nèi)存的消耗。所以num_workers的值依賴于 batch size和機(jī)器性能。
4、一般開始是將num_workers設(shè)置為等于計算機(jī)上的CPU數(shù)量
5、最好的辦法是緩慢增加num_workers,直到訓(xùn)練速度不再提高,就停止增加num_workers的值。
補充:pytorch中Dataloader()中的num_workers設(shè)置問題
如果num_workers的值大于0,要在運行的部分放進(jìn)__main__()函數(shù)里,才不會有錯:
import numpy as np import torch from torch.autograd import Variable import torch.nn.functional import matplotlib.pyplot as plt import torch.utils.data as Data BATCH_SIZE=5 x=torch.linspace(1,10,10) y=torch.linspace(10,1,10) torch_dataset=Data.TensorDataset(x,y) loader=Data.DataLoader( dataset=torch_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2, ) def main(): for epoch in range(3): for step,(batch_x,batch_y) in enumerate(loader): # training.... print('Epoch:',epoch,'| step:',step,'| batch x:',batch_x.numpy(), '| batch y:',batch_y.numpy()) if __name__=="__main__": main() ''' # 下面這樣直接運行會報錯: for epoch in range(3): for step,(batch_x,batch_y) in enumerate(loader): # training.... print('Epoch:',epoch,'| step:',step,'| batch x:',batch_x.numpy(), '| batch y:',batch_y.numpy() '''
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python3+PyQt5+Qt Designer實現(xiàn)擴(kuò)展對話框
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5+Qt Designer實現(xiàn)擴(kuò)展對話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-04-04如何用Python中Tushare包輕松完成股票篩選(詳細(xì)流程操作)
這篇文章主要介紹了如何用Python中Tushare包輕松完成股票篩選(詳細(xì)流程操作),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python3開發(fā)實例之非關(guān)系型圖數(shù)據(jù)庫Neo4j安裝方法及Python3連接操作Neo4j方法實例
這篇文章主要介紹了Python3開發(fā)實例之非關(guān)系型圖數(shù)據(jù)庫Neo4j安裝方法及Python3連接操作Neo4j方法實例,需要的朋友可以參考下2020-03-03Python實現(xiàn)子類調(diào)用父類的初始化實例
這篇文章主要介紹了Python實現(xiàn)子類調(diào)用父類的初始化實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03django xadmin action兼容自定義model權(quán)限教程
這篇文章主要介紹了django xadmin action兼容自定義model權(quán)限教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Python中關(guān)鍵字is與==的區(qū)別簡述
這篇文章主要介紹了Python中關(guān)鍵字is與==的區(qū)別,對于Python初學(xué)者有一定的借鑒學(xué)習(xí)價值,需要的朋友可以參考下2014-07-07