Pytorch数据并行处理
在这个教程中,我们将学习如何用DataParallel
来使用多 GPU
通过 PyTorch 使用多个 GPU 非常简单。你可以将模型放在一个 GPU:
1 | device = torch.device("cuda: 0") |
然后可以复制所有的张量到GPU上:
1 | mytensor = my_tensor.to(device) |
请注意,调用my_tensor.to(device)
返回一个GPU上的my_tensor
副本,而不是重写my_tensor
你需要把它赋值给一个新的张量并在GPU上使用这个张量
在多GPU上执行正向和反向传播是自然而然的事。然而,PyTorch 默认将只是用一个GPU
你可以使用DataParallel
让模型并行运行来轻易的在多个GPU上运行你的操作
1 | mytensor = net.to(device) |
这是这篇教程背后的核心,我们接下来将更详细的介绍它
导入和参数
导入 PyTorch 模块和定义参数
1 | import torch |
设备( Device ):
1 | device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") |
如果GPU可用,则会输出
1 | cuda:0 |
虚拟数据集
要制作一个虚拟(随机)数据集,你只需实现__getitem__
1 | class RandomDataset(Dataset): |
简单模型
作为演示,我们的模型只接受一个输入,执行一个线性操作,然后得到结果。然而,你能在任何模型(CNN,RNN,Capsule Net等)上使用DataParallel
我们在模型内部放置了一条打印语句来检测输入和输出向量的大小。请注意批等级为0时打印的内容
1 | class Model(nn.Module): |
创建一个模型与数据并行
这是本教程的核心部分
首先,我们需要创建一个模型实例和检测我们是否有多个GPU
如果我们有多个GPU,我们使用nn.DataParallel
来包装我们的模型
然后通过model.to(device)把模型放到GPU上
1 | model = Model(input_size, output_size) |
输出为(因为我的笔记本电脑只有一块3060,所以GPU的总数是1)
1 | 1 |
运行模型
现在我们可以看输入和输出张量的大小
1 | for data in rand_loader: |
输出为
1 | In Model: input size torch.Size([30, 5]) output size torch.Size([30, 2]) |
结果
如果没有GPU或只有1个GPU,当我们对30个输入和输出进行批处理时,我们和期望的一样得到30个输入和30个输出,但是若有多个GPU,会得到如下的结果
2个GPU
若有2个GPU,将看到
1 | Let's use 2 GPUs! |
3个GPU
若有3个GPU,将看到
1 | Let's use 3 GPUs! |
8个GPU
若有8个GPU,将看到
1 | Let's use 8 GPUs! |
总结
DataParallel
自动的划分数据,并将作业顺序发送到多个GPU上的多个模型
DataParallel
会在每个模型完成作业后,收集与合并结果然后返回给你
官方的例程请参考:MULTI-GPU EXAMPLES