欢迎访问宙启技术站
智能推送

使用nn.DataParallel()实现PyTorch中多GPU的数据并行训练

发布时间:2023-12-27 08:30:33

在PyTorch中,使用nn.DataParallel()可以方便地实现多GPU的数据并行训练。数据并行训练可以利用多个GPU同时处理不同批次的数据,加速模型的训练。下面是一个使用nn.DataParallel()的示例代码。

首先,我们需要导入torch和torch.nn库:

import torch
import torch.nn as nn

然后,定义一个简单的神经网络模型:

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(10, 5)
        self.activation = nn.ReLU()
        self.fc2 = nn.Linear(5, 2)
    
    def forward(self, x):
        x = self.fc1(x)
        x = self.activation(x)
        x = self.fc2(x)
        return x

接下来,我们创建一个实例化的模型对象:

model = SimpleModel()

然后,创建一个数据加载器,用于加载训练数据:

train_loader = torch.utils.data.DataLoader(...)

然后,创建一个优化器和一个损失函数:

optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
criterion = nn.CrossEntropyLoss()

接下来,使用torch.cuda.device_count()来获取可用的GPU数量,并对模型进行并行训练的设置:

if torch.cuda.device_count() > 1:
    model = nn.DataParallel(model)

通过检查GPU数量,我们可以选择是否使用nn.DataParallel()来自动将模型划分到多个GPU上进行并行训练。如果只有一个GPU,则不需要使用nn.DataParallel()。

接下来,将模型及其参数移动到GPU上:

model = model.cuda()

然后,开始训练模型:

for epoch in range(num_epochs):
    for inputs, labels in train_loader:
        inputs = inputs.cuda()
        labels = labels.cuda()
        
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

在每个epoch中,我们通过迭代训练数据,将输入和标签移动到GPU上,并使用nn.DataParallel()自动进行并行计算。然后,我们进行前向传播、计算损失、反向传播和参数更新。

最后,可以通过调用model.module来获得最终的模型:

final_model = model.module

这样就完成了多GPU的数据并行训练。使用nn.DataParallel()可以方便地使不同批次的数据在多个GPU上同时进行处理,加速模型的训练过程。