赞
踩
Pytorch的数据分为两种,torch.nn.parallel.DataParallel
(DP)和torch.nn.parallel.DistributedDataParallel
(DDP).
DP模式用于单机多卡的情况。实现起来较为简单,只需要用torch.nn.parallel.DataParallel
包装模型即可,其余与单机单卡的情况相同。
可以看出DP模型比较多的操作是在0号卡上进行的。分数据、将模型的副本传到其他模型,收集每块卡的输出、计算loss,将loss传到每块卡上,在每块卡上进行反向传播得到梯度后,收集每块卡上的梯度,进行reduce上操作后,传到其他卡上。这样使得0号卡所占的内存比较多,使得内存使用不均衡,而且会经常出现其他卡等待0好卡计算的情形。
backend
可选nccl,gloo和mpi
模式,表示不同的collective communication方式。使用英伟达显卡,运行比较快的是nccl方式
local_rank= os.getenv('LOCAL_RANK', -1)
if local_rank != -1:
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)
torch.distributed.init_process_group(backend="nccl", init_method='env://')
def create_dataloader(...): train_datasets= torchvision.datasets.MNIST( root='./mnist', train=True, transform=torchvision.transforms.ToTensor(), # (0,255) -->(0,1) download=False ) train_sampler = DistributedSampler(train_datasets) ## 防止不同进程交叉取数据 train_dataloader = DataLoader(train_datasets, sampler=train_sampler, batch_size=int(args.test_batch_size/args.world_size), num_workers=args.num_workers, pin_memory=True) ... .... train_sampler,train_dataloader,test_sampler,test_dataloader = create_dataloader(args,main_process)
model = ...
model.to(device)
num_gpus = torch.cuda.device_count()
if num_gpus > 1:
print('use {} gpus!'.format(num_gpus))
model = nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank],
output_device=args.local_rank)
for epoch in range(EPOCH):
# 步骤五:打乱数据顺序
train_sampler.set_epoch(epoch)
model.train()
start= time()
### train
for step, (b_x, b_y) in enumerate(train_dataloader):
predit_y = model(b_x)
loss = loss_func(predit_y, b_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
python -m torch.distributed.run --nproc_per_node 2 --master_port 2393 ddp_train.py
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=2 --node_rank=0 --master_addr="192.0.0.1" --master_port=1234 ddp.py
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=2 --node_rank=1 --master_addr="192.0.0.1" --master_port=1234 ddp.py
node_rank
不同,其余相同[1] pytorch(分布式)数据并行个人实践总结——DataParallel/DistributedDataParallel
[2] PyTorch Distributed: Experiences on Accelerating Data Parallel Training
[3] 多机多卡
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。