关于pytorch使⽤DDP模式(parallel.Distribute。。。
最近由于要⽤到多卡去训模型,尝试着⽤DDP模式,⽽不是DP模式去加速训练(很容易出现负载不均衡的情况)。遇到了⼀点关于DistributedSampler这个采样器的⼀点疑惑,想试验下在DDP模式下,使⽤这个采样器和不使⽤这个采样器有什么区别。
实验代码:
整个数据集⼤⼩为8,batch_size 为4,总共跑2个epoch
import torch
as nn
from torch.utils.data import Dataset, DataLoader
from torch.utils.data.distributed import DistributedSampler
torch.distributed.init_process_group(backend="nccl")
batch_size = 4
data_size = 8
local_rank = _rank()
print(local_rank)
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)
class RandomDataset(Dataset):
def __init__(self, length, local_rank):
self.len = length
self.data = torch.stack([s(1), s(1)*s(1)*s(1)*s(1)*s(1)*s(1)*s(1)*8]).to self.local_rank = local_rank
def __getitem__(self, index):
return self.data[index]
def __len__(self):
return self.len
dataset = RandomDataset(data_size, local_rank)
sampler = DistributedSampler(dataset)
#rand_loader =DataLoader(dataset=dataset,batch_size=batch_size,sampler=None,shuffle=True)
rand_loader = DataLoader(dataset=dataset,batch_size=batch_size,sampler=sampler)
epoch = 0
while epoch < 2:
sampler.set_epoch(epoch)
for data in rand_loader:
print(data)
epoch+=1
运⾏命令: CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 test.py
实验结果:
结论分析:上⾯的运⾏结果来看,在⼀个epoch中,sampler相当于把整个数据集 划分成了nproc_per_node份,每个GPU每次得到
batch_size的数量,也就是nproc_per_node 个GPU分⼀整份数据集,总数据量⼤⼩就为1个dataset
如果不⽤它⾥⾯⾃带的sampler,单纯的还是按照我们⼀般的形式。Sampler=None,shuffle=True这种,那么结果将会是下⾯这样的:
结果分析:没⽤sampler的话,在⼀个epoch中,每个GPU各⾃维护着⼀份数据,每个GPU每次得到的batch_size的数据,总的数据量为2个dataset,
总结:
⼀般的形式的dataset只能在同进程中进⾏采样分发,也就是为什么图2只能单GPU维护⾃⼰的dataset,DDP中的sampler可以对不同进程进⾏分发数据,图1,可以夸不同进程(GPU)进⾏分发。。
>distribute名词形式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论