專題三:多GPU計(jì)算
引言:
NVIDIA公司的GPU編程接口采用CUDA,AMD公司的GPU編程接口采用OpenCL,本文以NVIDIA公司的GPU舉例。
部分一:
查看顯卡占用情況,指令如下:
打印結(jié)果:

包括了GPU的標(biāo)號(hào)(取值為0,1,2,...)、GPU的名稱(Name)和GPU使用率(Volatile GPU-Util)等內(nèi)容,具體可參考專題一:Ubuntu搭建深度學(xué)習(xí)開發(fā)環(huán)境(Pytorch);進(jìn)程(Processes)一欄則顯示了所有占用GPU的進(jìn)程信息,包括進(jìn)程號(hào)(PID)、進(jìn)程名稱和顯存占用等內(nèi)容。
注意:
如果模型訓(xùn)練完成后,顯存和GPU占用沒有被自動(dòng)釋放,則需要將顯存手動(dòng)釋放掉,方法如下:先使用"nvidia-smi"指令查看占用顯存的進(jìn)程;然后使用"sudo kill -9 PID(進(jìn)程號(hào))"來結(jié)束進(jìn)程,即可釋放顯存。
部分二:利用pytorch查看顯卡的數(shù)量、名稱和屬性等信息
查看顯卡的CUDA是否有效
查看顯卡的數(shù)量(標(biāo)號(hào)為0,1,2,...)
查看當(dāng)前顯卡的標(biāo)號(hào)
查看標(biāo)號(hào)為0的顯卡名稱
查看標(biāo)號(hào)為0的顯卡屬性
打印結(jié)果如下

部分三:指定GPU計(jì)算
方式一:.to(device)
指定單個(gè)GPU或CPU
指定多個(gè)GPU
方法二:.cuda()
指定單個(gè)GPU
指定多個(gè)GPU
注意一:
torch.nn.DataParallel是pytorch的一種并行方法,也稱為單進(jìn)程多GPU訓(xùn)練模式(DP模式),這種模式下并行計(jì)算的多個(gè)GPU都是由一個(gè)進(jìn)程(process)控制的,在進(jìn)行梯度傳播時(shí),也是在主GPU上進(jìn)行的。
注意二:多GPU模型的保存與加載
單GPU模型

多GPU模型

可見,多GPU模型結(jié)構(gòu)發(fā)生了改變!DataParallel也是一個(gè)nn.Module,傳入的模型被放到了module中,在進(jìn)行模型保存時(shí),需要只保存DataParallel.module中的內(nèi)容,即:
如果保存了整個(gè)DataParallel,則需要將新模型傳入到DataParallel中才能加載權(quán)重文件,即:
注意三:不同GPU之間的數(shù)據(jù)不能直接計(jì)算
