专题三:多GPU计算
引言:
NVIDIA公司的GPU编程接口采用CUDA,AMD公司的GPU编程接口采用OpenCL,本文以NVIDIA公司的GPU举例。
部分一:
查看显卡占用情况,指令如下:
打印结果:

包括了GPU的标号(取值为0,1,2,...)、GPU的名称(Name)和GPU使用率(Volatile GPU-Util)等内容,具体可参考专题一:Ubuntu搭建深度学习开发环境(Pytorch);进程(Processes)一栏则显示了所有占用GPU的进程信息,包括进程号(PID)、进程名称和显存占用等内容。
注意:
如果模型训练完成后,显存和GPU占用没有被自动释放,则需要将显存手动释放掉,方法如下:先使用"nvidia-smi"指令查看占用显存的进程;然后使用"sudo kill -9 PID(进程号)"来结束进程,即可释放显存。
部分二:利用pytorch查看显卡的数量、名称和属性等信息
查看显卡的CUDA是否有效
查看显卡的数量(标号为0,1,2,...)
查看当前显卡的标号
查看标号为0的显卡名称
查看标号为0的显卡属性
打印结果如下

部分三:指定GPU计算
方式一:.to(device)
指定单个GPU或CPU
指定多个GPU
方法二:.cuda()
指定单个GPU
指定多个GPU
注意一:
torch.nn.DataParallel是pytorch的一种并行方法,也称为单进程多GPU训练模式(DP模式),这种模式下并行计算的多个GPU都是由一个进程(process)控制的,在进行梯度传播时,也是在主GPU上进行的。
注意二:多GPU模型的保存与加载
单GPU模型

多GPU模型

可见,多GPU模型结构发生了改变!DataParallel也是一个nn.Module,传入的模型被放到了module中,在进行模型保存时,需要只保存DataParallel.module中的内容,即:
如果保存了整个DataParallel,则需要将新模型传入到DataParallel中才能加载权重文件,即:
注意三:不同GPU之间的数据不能直接计算
