在深度学习任务中,使用多gpu并行操作是必不可少的,因为深度学习任务的计算量之大导致使用cpu进行计算会相当耗时,而gpu的计算速度是cpu的几十倍甚至上百倍。这是因为gpu内部是采用并行计算,而cpu采用的是串行。
pytorch深度学习框架也能够指定多gpu并行,使用gpu并行需要指定以下几步:
(1)声明可见物理gpu:这一步相当于告诉程序只能够看见那几块gpu,在python中声明如下
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2,3,4"
如上述代码所示,指定程序只能够看到1,2,3,4号gpu
(2)指定模型使用的物理gpu:
from torch import nn
device_ids = [0, 2]
model_gpu = nn.DataParallel(module=my_model, device_ids=device_ids)
这里的device_ids是物理gpu对应的索引,如(1)中指定的物理gpu为"1,2,3,4",其对应索引为0,1,2,3,那这里指定device_ids=[0, 2]表示使用物理gpu1和物理gpu3
(3)将模型放在device_ids[0]上作为controller:
model_gpu = model_gpu.cuda(device_ids[0])
通过以上三步,就可以指定多gpu运算,当然需要注意的是,要使用gpu运算,需要将模型输入数据,损失函数计算对象均放至device_ids[0]上
接下来使用代码进行了简单的验证:
可以看到指定物理gpu为4,5,6,7号,device_ids设定为[0, 3],应当使用的是物理gpu4和物理gpu7,结果如下图
验证了猜测,再次进行测试
这次指定物理gpu仍然为4,5,6,7号,不同的是指定device_ids为[1, 3],也就是使用物理gpu5和物理gpu7,运行结果如下图