Simple and easy-to-understand pytorch uses DistributedDataParallel for single-machine multi-card training

First, post an official case, and just modify it according to the case.

import torch
import torch.distributed as dist
import torch.nn as nn
import torch.optim as optim

from torch.nn.parallel import DistributedDataParallel as DDP

class ToyModel(nn.Module):
    def __init__(self):
        super(ToyModel, self).__init__()
        self.net1 = nn.Linear(10, 10)
        self.relu = nn.ReLU()
        self.net2 = nn.Linear(10, 5)

    def forward(self, x):
        return self.net2(self.relu(self.net1(x)))


def demo_basic():
    dist.init_process_group("nccl")
    rank = dist.get_rank()
    print(f"Start running basic DDP example on rank {
      
      rank}.")

    # create model and move it to GPU with id rank
    device_id = rank % torch.cuda.device_count()
    model = ToyModel().to(device_id)
    ddp_model = DDP(model, device_ids=[device_id])

    loss_fn = nn.MSELoss()
    optimizer = optim.SGD(ddp_model.parameters(), lr=0.001)

    optimizer.zero_grad()
    outputs = ddp_model(torch.randn(20, 10))
    labels = torch.randn(20, 5).to(device_id)
    loss_fn(outputs, labels).backward()
    optimizer.step()

if __name__ == "__main__":
    demo_basic()

Just execute it when running torchrun --nproc_per_node=8 elastic_ddp.py. 8 refers to the number of graphics cards on the single machine
. Several points to note:

  1. DataSet and DataLoader try to use pytorch
  2. The data involved in the calculation later, such as in the code labels, is requiredto(device_id)

Guess you like

Origin blog.csdn.net/Defiler_Lee/article/details/127935889