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

在PyTorch中使用torch.nn.parallel.data_parallel实现多GPU模型训练

发布时间:2023-12-23 05:32:07

在PyTorch中,torch.nn.parallel.data_parallel是用于多GPU模型训练的工具。它能够自动将模型和数据划分到各个GPU上,并行地执行前向传播和反向传播。下面是一个实例,演示了如何使用torch.nn.parallel.data_parallel在多个GPU上进行模型训练。

首先,我们需要定义一个多GPU模型。假设我们有两个GPU,我们的模型可以通过将不同的层放在不同的GPU上来实现并行计算。下面是一个简单的多GPU模型的示例:

import torch
import torch.nn as nn

class MultiGPUModel(nn.Module):
    def __init__(self):
        super(MultiGPUModel, self).__init__()
        self.layer1 = nn.Linear(10, 5).cuda(0)
        self.layer2 = nn.Linear(5, 2).cuda(1)
        
    def forward(self, x):
        x = x.cuda(0)
        x = self.layer1(x)
        x = x.cuda(1)
        x = self.layer2(x)
        return x

在上面的代码中,我们首先使用cuda方法将层layer1放在第一个GPU上,然后使用cuda方法将层layer2放在第二个GPU上。在前向传播时,我们可以通过将数据通过cuda方法移动到相应的GPU上来并行计算。

接下来,我们需要定义训练函数。假设我们的输入数据是一个大小为(64, 10)的张量。

def train(inputs, targets):
    model = MultiGPUModel()
    optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
    criterion = nn.CrossEntropyLoss()
    
    inputs = inputs.cuda()
    targets = targets.cuda()
    
    # 将模型包装在DataParallel中,自动划分和并行执行计算
    model = nn.DataParallel(model)

    for epoch in range(10):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        loss.backward()
        optimizer.step()
        
        print(f"Epoch {epoch+1}, Loss: {loss.item()}")

在上面的代码中,我们首先创建了一个多GPU模型,然后定义了优化器和损失函数。我们将输入数据和目标数据都通过cuda方法移动到GPU上。然后,我们使用nn.DataParallel将模型包装在DataParallel中。这样,模型的前向传播和反向传播会自动在多个GPU上并行计算。

最后,我们执行训练函数,传入输入数据和目标数据。

inputs = torch.randn(64, 10)
targets = torch.tensor([0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]).long()

train(inputs, targets)

在上述代码中,我们使用torch.randn生成了一个大小为(64, 10)的随机输入数据张量,并使用torch.tensor创建了一个大小为64的随机目标数据张量。

通过以上代码,我们可以在多个GPU上并行训练我们的模型。注意,在实际应用中,我们需要检查每个GPU的显存是否足够,以及合理分配模型的层到各个GPU上。此外,还可以通过设置环境变量CUDA_VISIBLE_DEVICES来选择使用哪些GPU进行训练。