pytorch1.7 win10 两张titan x pascal
一、torch.nn.parallel.DistributedDataParallel
1、接收并行调用传入的参数
parser = argparse.ArgumentParser()
parser.add_argument("--local_rank", type=int)
args = parser.parse_args()
2、设置当前进程GPU
torch.cuda.set_device(args.local_rank)
3、通讯初始化,Windows pytorch 1.7所用版本不支持NCCL,所以用GLOO,world_size代表进程数量
torch.distributed.init_process_group(Backend.GLOO, init_method='file:///sharefile', rank=args.local_rank, world_size=2)
4、dataset
train_dataset = datasets.CIFAR100('./data/CIFAR100', train=True, download=True, transform=transforms.Compose([
transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]))
test_dataset = datasets.CIFAR100('./data/CIFAR100', train=False, transform=transforms.Compose([
transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]))
5、sampler
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
test_sampler = torch.utils.data.distributed.DistributedSampler(test_dataset)
6、loader
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=500, shuffle=False, num_workers=2, sampler=train_sampler)
test_loader = torch.utils.data.DataLoader(test_dataset, 500, shuffle=False, num_workers=2, sampler=test_sampler)
7、device
device = torch.device("cuda", args.local_rank)
8、model
model = DigitalNet().to(device)
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], output_device=args.local_rank)
9、调用,nproc_per_node进程数量,nnodes机子数量
python -m torch.distributed.launch --nproc_per_node=2 --nnodes=1 DigitalNetParallel.py
10、结果
CIFAR100数据集
双卡,batch=500 num_workers=2时,相当于batch=1000,10个epoch用时123.25秒
单卡,batch=1000 num_workers=0时,10个epoch用时174.05秒
双卡,GPU1占用显存6939MB,GPU2占用显存5006MB。
单卡,GPU占用显存8703MB。
双卡速度比单卡快速了41%。
二、torch.nn.DataParallel
CIFAR100数据集
在使用更简单数据并行torch.nn.DataParallel,速度没有提升,小批量还会慢几秒。
if torch.cuda.device_count() > 1:
model = torch.nn.DataParallel(model, device_ids=[0, 1])
ubuntu 18.4同样硬件条件
通讯使用NCCL
双卡,batch=500 num_workers=2时,相当于batch=1000,10个epoch用时63.33秒
单卡,batch=1000 num_workers=0时,10个epoch用时136.43秒
linux下速度更快。