单机单卡能用torch.distributed.launch吗,怎么用
时间: 2023-06-01 15:02:35 浏览: 264
可以使用`torch.distributed.launch`来启动单机单卡的训练。
使用方法如下:
1. 在命令行中运行以下命令:
```
python -m torch.distributed.launch --nproc_per_node=1 your_script.py
```
其中,`--nproc_per_node`指定每个节点使用的GPU数,这里是1。
2. 在代码中使用`torch.distributed.init_process_group`初始化进程组。
```
import torch
import torch.distributed as dist
dist.init_process_group(backend='nccl', init_method='env://')
```
其中,`backend`指定使用的通信后端,这里是nccl,`init_method`指定初始化方法,这里使用环境变量。
3. 将模型和数据分布到各个GPU上,并使用`nn.parallel.DistributedDataParallel`包装模型。
```
import torch.nn as nn
import torch.optim as optim
import torchvision.models as models
import torchvision.transforms as transforms
import torch.utils.data.distributed
model = models.resnet50()
model.cuda()
model = nn.parallel.DistributedDataParallel(model)
criterion = nn.CrossEntropyLoss().cuda()
optimizer = optim.SGD(model.parameters(), lr=0.1)
train_dataset = torchvision.datasets.CIFAR10(root='./data', train=True,
transform=transforms.ToTensor(), download=True)
train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=128, shuffle=False,
num_workers=2, pin_memory=True, sampler=train_sampler)
for epoch in range(10):
train_sampler.set_epoch(epoch)
for i, (input, target) in enumerate(train_loader):
input = input.cuda()
target = target.cuda()
output = model(input)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
```
以上代码使用了CIFAR10数据集和ResNet50模型作为示例。需要注意的是,每个进程在训练过程中只能访问到分配给它的数据,因此需要使用`torch.utils.data.distributed.DistributedSampler`分发数据,同时在每个epoch之前调用`train_sampler.set_epoch(epoch)`来更新数据的分发策略。还需要使用`input.cuda()`和`target.cuda()`将数据移到GPU上。
阅读全文