1. 程式人生 > >pytorch-GPU分散式訓練筆記

pytorch-GPU分散式訓練筆記

這篇部落格可能會存在很多不正確的地方,麻煩大神指正,後期我會慢慢修改

1.如果我有8片卡,但只想用其中的兩片,比如顯示卡7和顯示卡8(假設索引從1開始,其實可能是0)

我們先建立好模型:

import torch.nn as nn
inport torchvision.models as models

model = models.vgg16(pretrained = False)
model = nn.DataParallel(model)
model = model.cuda()  

在這種情況下,模型及訓練過程中的引數都會被載入到預設的顯示卡上(。。我感覺是模組1),但我們需要的是將模型放在顯示卡G上作為控制單元,然後將模型複製到其他計算顯示卡,再將batch_size資料等分成幾分,平攤到其他計算顯示卡,計算完成後,統一由G進行排程並在G中更新。

model = nn.DataParallel(model)
#會把模型複製到8塊顯示卡中,但我們只需要顯示卡7和顯示卡8,所以需要修改為:
model = nn.DataParallel(model,device_ids = [7,8])  #使用device_ids進行指定
model = model.cuda(device_ids[0])#不確定是否正確

上面的程式碼只是針對模型進行操作,對於batch_size資料,則是在訓練過程中進行載入,需要注意的地方是,模型與batch_size資料需要載入到先載入到同一張顯示卡,如果載入到不同的顯示卡,會報錯:需要將所有的資料載入到顯示卡1。

所以在載入資料時,需要指定:

input_var = Variable(data.cuda(device[0]))

2.單機多卡下模型並行的方式

將Module放在GPU上執行也十分簡單,只需兩步:(單機單卡模式下可直接使用,不需要下面的並行操作)
model = model.cuda():將模型的所有引數轉存到GPU
input = input.cuda():將輸入資料也放置到GPU上
PyTorch也提供了兩個函式,可實現簡單高效的並行GPU計算。
①nn.parallel.data_parallel(module, inputs, device_ids=None, output_device=None, dim=0, module_kwargs=None)
②class torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)
通過device_ids引數可以指定在哪些GPU上進行優化,output_device指定輸出到哪個GPU上。唯一的不同就在於前者直接利用多GPU平行計算得出結果,而後者則返回一個新的module,能夠自動在多GPU上進行並行加速。程式碼如下:

# method 1
output = nn.parallel.data_parallel(new_net, input, device_ids=[0, 1])
# method 2
model = nn.DataParallel(model, device_ids=[0, 1])
output = model(input)   #需要兩步   個人習慣用方法二   此處需要對原始的input進行相關操作

DataParallel並行的方式,是將輸入一個batch的資料均分成多份,分別送到對應的GPU進行計算,各個GPU得到的梯度累加。與Module相關的所有資料也都會以淺複製的方式複製多份

3.引入了一個新的函式model = torch.nn.parallel.DistributedDataParallel(model)為的就是支援分散式模式

不同於原來在multiprocessing中的model = torch.nn.DataParallel(model,device_ids=[0,1,2,3]).cuda()函式,這個函式只是實現了在單機上的多GPU訓練,根據官方文件的說法,甚至在單機多卡的模式下,新函式表現也會優於這個舊函式。