pytorch-多GPU操作的方法

完整的步骤:
  1. 设定好os.environment(" CUDA_VISIBEL_DEVICES ")='0,1,2,3,4,5'
  2. pytorch中定义一个变量device = torch.device("cuda:0,1,2,3,4,5")
  3. 把model使用model = nn.DataParallel(model),用来分配数据,并且model.to(device),将model加载到gpu上
  4. 将要训练的数据放入到device中,然后训练这个model就可以了!
实际操作:
import os 
os.environment("CUDA_VISIBEL_DEVICES")='0,1,2,3,4,5'

上述步骤相当于在shell 命令里面调用了 CUDA_VISIBEL_DEVICES 命令, 相当于打开了6个gpu的入口。分别指定了cuda0,cuda1,cuda2三个gpu进行计算。这里相当于调用了6个gpu

note:使用torch.cuda.device_count()看到的就是这里调用了几个gpu。

device=torch.device("cuda:0,1,2,3,4,5", if torch.cuda.is_available() else "cpu")

这里必须和上面的数值保持一致,否则会报错。device的输出是 type: "cuda" ,index=0, 用index的值表示了cuda的个数

model = Model(input_size, output_size)
if torch.cuda.device_count() > 1:
print("Let's use", torch.cuda.device_count(), "GPUs!")
# dim = 0 [30, xxx] -> [10, ...], [10, ...], [10, ...] on 3 GPUs
model = nn.DataParallel(model)

model.to(device)

使用nn.DataParallel对model这个网络模型进行data上的自动分配

for data in rand_loader:
input = data.to(device)
output = model(input)
print("Outside: input size", input.size(),
"output_size", output.size())

将input从dataset中得到batch_size的数据,将data传给GPU中,对模型进行了训练(forward function这里省去)

这个时候cuda上就会被分配上数据。可以看到最后输出的结果:

Let's use 2 GPUs!
In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
In Model: input size torch.Size([15, 5]) output size torch.Size([15, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])
In Model: input size torch.Size([5, 5]) output size torch.Size([5, 2])
Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])
Let's use 8 GPUs!
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([4, 5]) output size torch.Size([4, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
Outside: input size torch.Size([30, 5]) output_size torch.Size([30, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
In Model: input size torch.Size([2, 5]) output size torch.Size([2, 2])
Outside: input size torch.Size([10, 5]) output_size torch.Size([10, 2])

可以看到model上的data被平均分配到了8个gpu上。

input_size=2, output_size=5, batch_size=30, data_size=100。

由于每次batch_size=30, 因此跑了4次,数据量为30+30+30+10

每次在模型中,30个input被分配到8个gpu上,4+4+4+4+4+2+4+4个,每个cuda上跑了4或2个input,output则相应输出对应的大小。[4,5]表示4个input,每个input的大小为5。


   转载规则


《pytorch-多GPU操作的方法》 胡哲 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
ICLR2020论文解读__Learning robust representations via multi-view information ICLR2020论文解读__Learning robust representations via multi-view information
本文是对于信息瓶颈方法的原始公式应用于在学习时可以使用任务特定标签的监督设置中。提出了通过利用muilt-view的方式提供一种实体的两类视图,可以将方法扩展到无监督的情况下.
2020-01-22
下一篇 
pytorch-data处理的方法 pytorch-data处理的方法
本文总结了深度学习中数据处理所需要使用的函数,对功能进行了总结
2020-01-18