[Notes] Pytorch中DDP(DistributedDataParallel)指定显卡/GPU运行的方式

先看看哪些卡空闲/可用,使用CUDA_VISIBLE_DEVICES屏蔽掉不可用的卡

# 1 2 4 7号卡可用
CUDA_VISIBLE_DEVICES="1,2,4,7" python -m torch.distributed.launch --nproc_per_node 4 main.py

#避免冲突 自定义端口
CUDA_VISIBLE_DEVICES="1,2,4,7" python -m torch.distributed.launch --nproc_per_node 4 --master_port YourPort main.py
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorchDistributedDataParallelDDP)是一种用于训练分布式模型的工具。使用DDP,我们可以在多个节点或GPU上并行训练模型,以加快训练速度。 以下是使用DDP进行分布式训练的基本步骤: 1. 初始化进程组: ```python import torch.distributed as dist dist.init_process_group('gloo', init_method='file:///tmp/some_file', rank=rank, world_size=world_size) ``` 这会初始化一个进程组,用于协调不同节点或GPU之间的通信。`gloo`是一种通信后端,支持TCP/IP、IB和RoCE等协议。`init_method`参数指定了进程组的初始化方法,在此示例,我们使用了文件方式。`rank`参数指定了当前进程的排名,`world_size`指定了进程组的总大小。 2. 定义模型: ```python model = nn.Sequential( nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10) ) ``` 我们定义了一个简单的前馈神经网络模型。 3. 将模型包装在DDP: ```python model = nn.parallel.DistributedDataParallel(model, device_ids=[rank], output_device=rank) ``` 我们使用`nn.parallel.DistributedDataParallel`将模型包装在DDP。`device_ids`参数指定了当前进程使用的GPU ID,`output_device`参数指定了输出设备的GPU ID。 4. 定义数据加载器: ```python train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True) ``` 我们使用`torch.utils.data.DataLoader`定义数据加载器。`batch_size`参数指定了每个批次的大小,`shuffle`参数指定了是否打乱数据,`num_workers`参数指定了数据加载器的工作进程数量,`pin_memory`参数指定了是否将数据加载到固定的内存位置。 5. 训练模型: ```python for epoch in range(num_epochs): model.train() for i, (images, labels) in enumerate(train_loader): images = images.to(rank) labels = labels.to(rank) outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if i % 100 == 0: print(f"Epoch [{epoch}/{num_epochs}], Step [{i}/{total_steps}], Loss: {loss.item():.4f}") ``` 我们使用常规的PyTorch训练循环训练模型。在每个批次,我们将数据加载到当前进程使用的GPU,计算损失,进行反向传播和优化。在训练过程DDP会自动将模型参数同步到其他节点或GPU。 6. 清理: ```python dist.destroy_process_group() ``` 训练完成后,我们需要清理进程组。 完整的示例代码如下: ```python import torch import torch.nn as nn import torch.optim as optim import torch.distributed as dist import torchvision.datasets as datasets import torchvision.transforms as transforms # 初始化进程组 dist.init_process_group('gloo', init_method='file:///tmp/some_file', rank=rank, world_size=world_size) # 定义模型 model = nn.Sequential( nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10) ) # 将模型包装在DDP model = nn.parallel.DistributedDataParallel(model, device_ids=[rank], output_device=rank) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=lr) # 定义数据加载器 train_dataset = datasets.MNIST(root='data', train=True, transform=transforms.ToTensor(), download=True) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True) # 训练模型 for epoch in range(num_epochs): model.train() for i, (images, labels) in enumerate(train_loader): images = images.to(rank) labels = labels.to(rank) outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() if i % 100 == 0: print(f"Epoch [{epoch}/{num_epochs}], Step [{i}/{total_steps}], Loss: {loss.item():.4f}") # 清理进程组 dist.destroy_process_group() ``` 需要注意的是,在使用DDP进行分布式训练时,我们需要确保每个进程的代码都是相同的,否则可能会导致不一致的行为。因此,我们需要使用相同的随机种子、相同的数据加载顺序等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值