​ 训练较大的深度学习模型往往需要多个GPU设备,大部分实验室都使用单机多GPU设置,本文讲述在Windows系统上如何进行Pytorch平台上的单机多GPU设置。

一、相关函数

​ 如何在单机设备上实现多个GPU并行计算,PyTorch提供了两个函数可实现简单高效的并行GPU计算:

# 函数一
nn.parallel.data_parallel(module, inputs, device_ids=None, output_device=None, dim=0, module_kwargs=None)
# 函数二
nn.DataParallel(module, device_ids=None, output_device=None, dim=0)

​ 二者的参数十分相似,通过device_ids参数可以指定在哪些GPU上进行优化,output_device指定输出到哪个GPU上。

​ 不同点在于前者直接利用多GPU并行计算得出结果,而后者则返回一个新的模型,能够自动在多GPU上进行并行加速。

​ 常用的是函数二,DataParallel()将模型相关的所有数据以浅复制的形式复制多份(输入一个batch的数据均分成多份),分别送到对应的GPU进行计算,然后将各个GPU计算得到的梯度累加得到结果。

二、代码演示

1、启用CUDA设备

import os
device_ids = [0,1,2] # 设置当前可被Python检测到的显卡ID
os.environ["CUDA_VISIBLE_DEVICES"] = ','.join(map(str, device_ids))

2、分配网络模型

# 方式 1
output = nn.parallel.data_parallel(model, input, device_ids=[0, 1])
# 方式 2
model = model.cuda()
model = nn.DataParallel(model, device_ids=[0,1,2])
output = model(input)

注意,os.environ["CUDA_VISIBLE_DEVICES"]= "1, 2" 会规定使用后两块显卡,但会将原本编号为1的显卡序号更改为0,原来序号为2的显卡更改为1,所以在nn.DataParallel()函数里device_ids序号不需要更改,必须写0,1。

三、实践问题

作者在实际的修改中,出现过如下问题:

1、AssertionError: Invalid device id

原因是DataParallel()函数输入了无法使用的cuda设备ID,解决步骤:

(1)检查当前平台是否支持CUDA训练

(2)检查当前机器是否可访问多个GPU

(3)检查DataParallel()函数调用前是否进行过多余的CUDA设置操作

2、UserWarning: PyTorch is not compiled with NCCL support

该警告表明当前PyTorch不支持NCCL编译,经过查询可能与Windows系统有关。