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

PyTorch中的nn.DataParallel()实现多GPU训练

发布时间:2023-12-27 08:26:21

在PyTorch中,使用多个GPU进行训练可以显著提高模型的训练速度。PyTorch提供了nn.DataParallel()模块来简化在多个GPU上的训练过程。

nn.DataParallel()可以将模型自动并行在多个GPU上,并将输入数据分割到各个GPU上,然后将每个GPU计算的结果合并。使用nn.DataParallel()非常简单,只需要在模型初始化的时候将模型包装在nn.DataParallel()中即可。

下面是一个使用nn.DataParallel()进行多GPU训练的例子:

import torch
import torch.nn as nn
from torch.utils.data import DataLoader

# 首先定义一个简单的模型
class MLP(nn.Module):
    def __init__(self):
        super(MLP, self).__init__()
        self.fc1 = nn.Linear(10, 1000)
        self.fc2 = nn.Linear(1000, 100)

    def forward(self, x):
        x = self.fc1(x)
        x = torch.relu(x)
        x = self.fc2(x)
        return x

# 创建数据集和数据加载器
dataset = torch.randn(1000, 10)
dataloader = DataLoader(dataset, batch_size=100)

# 定义模型并将其包装在nn.DataParallel()中
model = MLP()
model = nn.DataParallel(model)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练模型
for epoch in range(10):
    for batch in dataloader:
        inputs = batch
        labels = torch.randn(100, 100)

        # 将输入和标签移到GPU上
        inputs = inputs.cuda()
        labels = labels.cuda()

        optimizer.zero_grad()

        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        # 反向传播和优化
        loss.backward()
        optimizer.step()

        print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, 10, loss.item()))

在上面的例子中,我们首先定义了一个简单的MLP模型,然后创建了一个随机数据集和数据加载器。然后,我们将模型包装在nn.DataParallel()中,并将数据移动到GPU上进行训练。在训练过程中,模型会自动并行在多个GPU上进行计算,并将每个GPU计算的结果合并。最后,我们使用反向传播和优化器来更新模型的参数。

需要注意的是,使用nn.DataParallel()时,模型和输入数据都需要移动到GPU上。在示例中,我们使用了.cuda()方法将模型和输入数据移动到GPU上。如果使用的是多个GPU,可以使用.cuda(device_id)将模型和输入数据移动到特定的GPU上。

总结起来,使用nn.DataParallel()可以轻松地在多个GPU上实现模型的训练,提高模型的训练速度和性能。