关于pytorch 使用DDP模式(torch.nn.parallel.DistributedDataParallel)时,DistributedSampler(dataset)用法解释

最近由于要用到多卡去训模型,尝试着用DDP模式,而不是DP模式去加速训练(很容易出现负载不均衡的情况)。遇到了一点关于DistributedSampler这个采样器的一点疑惑,想试验下在DDP模式下,使用这个采样器和不使用这个采样器有什么区别。

实验代码:

整个数据集大小为8,batch_size 为4,总共跑2个epoch

import torch
import torch.nn 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 = torch.distributed.get_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([torch.ones(1), torch.ones(1)*2,torch.ones(1)*3,torch.ones(1)*4,torch.ones(1)*5,torch.ones(1)*6,torch.ones(1)*7,torch.ones(1)*8]).to('cuda')
            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)进行分发。。

  • 20
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
PyTorch支持使用分布式数据并行(DDP)和多进程训练(mp)来实现多机多卡训练。以下是使用PyTorch进行多机多卡训练的步骤: 1. 安装必要的软件和库。您需要安装PyTorch和Horovod(或其他分布式训练库),以便能够使用DDP和mp。 2. 编写代码。您需要编写一个PyTorch脚本,该脚本使用DDP和mp启动多机多卡训练。您可以使用以下代码片段来启动多机多卡训练: ``` import torch import horovod.torch as hvd from torch.nn.parallel import DistributedDataParallel from torch.utils.data.distributed import DistributedSampler from torchvision import datasets, transforms # Initialize Horovod hvd.init() # DistributedSampler to split the dataset among the workers train_sampler = DistributedSampler( datasets.MNIST( './data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) ), num_replicas=hvd.size(), rank=hvd.rank() ) # DataLoader to load the dataset train_loader = torch.utils.data.DataLoader( datasets.MNIST( './data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) ), batch_size=64, sampler=train_sampler ) # Setup the model model = ... model = DistributedDataParallel(model) # Define the optimizer optimizer = ... # An optimizer is instantiated for each worker with a copy of the model and its gradients optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters()) # Train the model for epoch in range(10): train(epoch, model, train_loader, optimizer, hvd.rank(), hvd.size()) ``` 3. 启动多机多卡训练。您需要在多台计算机上启动多个进程来运行PyTorch脚本。以下是一个简单的启动脚本示例: ``` mpirun -np 4 \ -H server1:2,server2:2 \ -bind-to none -map-by slot \ -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH \ python train.py ``` 上述命令将在两台计算机上启动4个进程(每台计算机上有两个进程),并将它们连接起来进行多机多卡训练。请注意,您需要将“server1”和“server2”替换为您的计算机名称或IP地址。 4. 监视训练进度。您可以使用TensorBoard等工具来监视训练进度,并在训练期间进行实分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值