首先是資料集的分布處理
需要用到的包:
torch.utils.data.distributed.distributedsampler
torch.utils.data.dataloader
torch.utils.data.dataset
distributedsampler這個包我們用來確保dataloader只會load到整個資料集的乙個特定子集,為每乙個子程序劃分出一部分資料集,以避免不同程序之間資料重複。
而我們構造的sampler是在構造dataloader時的乙個引數
先構建乙個自己的torch.utils.data.dataset類的dataset類:
import torch.utils.data as data
class
mydataset
(data.dataset)
:def
__init__
(self, x_train, x_label, y_train, y_label)
:super
(mydataset, self)
.__init__(
) self.x_train = x_train
self.x_label = x_label
self.y_train = y_train
self.y_label = y_label
def__len__
(self)
:return self.x_train.shape[0]
def__getitem__
(self, idx)
:return self.x_train[idx]
, self.x_label[idx]
, self.y_train[idx]
, self.y_label[idx]
初始化dataset:
這裡的x_train, x_label, y_train, y_label
是資料集載入進來的變數,根據自己的資料集情況設定變數和數量
train_data = mydataset(x_train, x_label, y_train, y_label)
然後根據構造的dataset物件構造乙個distributedsampler:
train_sampler = torch.utils.data.distributed.distributedsampler(train_data, shuffle=
true
)
然後使用torch.utils.data.dataloader構造自己的dataloader
mydataloader = data.dataloader(mydataset(x_train, x_label, \
y_train, y_label)
, batch_size=
2, sampler = train_sampler)
然後是模型的分布處理
需要用到的包:
torch.nn.parallel.distributeddataparallel
在初始化model之後,進行一步:
model = torch.nn.parallel.distributeddataparallel(model)
# device_ids will include all gpu devices by default
多機多卡需要配置多機間通訊,進行多程序的初始化:
需要用到的包:
torch.distributed
在初始化model之後,進行一步:
torch.distributed.init_process_group(init_method=
'tcp://{}:{}'
.format
(args.ip, args.port)
,backend=
"gloo"
,
引數解析:
backend: 多個機器之間交換資料的協議
init_method: 機器之間交換資料, 需要指定乙個主節點,這代表主節點
world_size: 程序個數,實際上就是機器的個數, 比如四台臺機器一起訓練的話, world_size就為4
rank: 區分主節點和從節點的, 主節點為0
, 剩餘的為了1
-(n-1)
, n為要使用的機器的數量, 也就是world_size
Pytorch中多GPU訓練
參考 在資料越來越多的時代,隨著模型規模引數的增多,以及資料量的不斷提公升,使用多gpu去訓練是不可避免的事情。pytorch在0.4.0及以後的版本中已經提供了多gpu訓練的方式,本文簡單講解下使用pytorch多gpu訓練的方式以及一些注意的地方。這裡我們談論的是單主機多gpus訓練,與分布式訓...
pytorch 多GPU訓練注意事項
1.多gpu訓練記得dataloader dataset dataset train,batch size config train batch shuffle config train shuffle num workers config train workers drop last true ...
Pytorch多GPU訓練踩坑記錄2
使用nn.dataparallel進行多gpu訓練時,對模型進行傳參,有時會出現報錯 runtimeerror chunk expects at least a 1 dimensional tensor nn.dataparallel的作用是將模型和資料分配到各個gpu上,讓其在各自的gpu上訓練,...