[動手學深度學習-PyTorch版]-8.4計算性能-多GPU計算

8.4 多GPU計算

注:相對于本章的前面幾節(jié),我們實際中更可能遇到本節(jié)所討論的情況:多GPU計算版姑。原書將MXNet的多GPU計算分成了8.4和8.5兩節(jié),但我們將關于PyTorch的多GPU計算統一放在本節(jié)討論。 需要注意的是味咳,這里我們談論的是單主機多GPU計算而不是分布式計算。如果對分布式計算感興趣可以參考PyTorch官方文檔

本節(jié)中我們將展示如何使用多塊GPU計算腊尚,例如略荡,使用多塊GPU訓練同一個模型庵佣。正如所期望的那樣,運行本節(jié)中的程序需要至少2塊GPU汛兜。事實上巴粪,一臺機器上安裝多塊GPU很常見,這是因為主板上通常會有多個PCIe插槽。如果正確安裝了NVIDIA驅動肛根,我們可以通過在命令行輸入nvidia-smi命令來查看當前計算機上的全部GPU(或者在jupyter notebook中運行!nvidia-smi)辫塌。

nvidia-smi

輸出:

Wed May 15 23:12:38 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 390.48                 Driver Version: 390.48                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN X (Pascal)    Off  | 00000000:02:00.0 Off |                  N/A |
| 46%   76C    P2    87W / 250W |  10995MiB / 12196MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  TITAN X (Pascal)    Off  | 00000000:04:00.0 Off |                  N/A |
| 53%   84C    P2   143W / 250W |  11671MiB / 12196MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+
|   2  TITAN X (Pascal)    Off  | 00000000:83:00.0 Off |                  N/A |
| 62%   87C    P2   190W / 250W |  12096MiB / 12196MiB |    100%      Default |
+-------------------------------+----------------------+----------------------+
|   3  TITAN X (Pascal)    Off  | 00000000:84:00.0 Off |                  N/A |
| 51%   83C    P2   255W / 250W |   8144MiB / 12196MiB |     58%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0     44683      C   python                                      3289MiB |
|    0    155760      C   python                                      4345MiB |
|    0    158310      C   python                                      2297MiB |
|    0    172338      C   /home/yzs/anaconda3/bin/python              1031MiB |
|    1    139985      C   python                                     11653MiB |
|    2     38630      C   python                                      5547MiB |
|    2     43127      C   python                                      5791MiB |
|    2    156710      C   python3                                      725MiB |
|    3     14444      C   python3                                     1891MiB |
|    3     43407      C   python                                      5841MiB |
|    3     88478      C   /home/tangss/.conda/envs/py36/bin/python     379MiB |
+-----------------------------------------------------------------------------+

從上面的輸出可以看到一共有四塊TITAN X GPU,每一塊總共有約12個G的顯存派哲,此時每塊的顯存都占得差不多了......此外還可以看到GPU利用率臼氨、運行的所有程序等信息。

Pytorch在0.4.0及以后的版本中已經提供了多GPU訓練的方式芭届,本文用一個簡單的例子講解下使用Pytorch多GPU訓練的方式以及一些注意的地方储矩。

8.4.1 多GPU計算

先定義一個模型:

import torch
net = torch.nn.Linear(10, 1).cuda()
net

輸出:

Linear(in_features=10, out_features=1, bias=True)

要想使用PyTorch進行多GPU計算,最簡單的方法是直接用torch.nn.DataParallel將模型wrap一下即可:

net = torch.nn.DataParallel(net)
net

輸出:

DataParallel(
  (module): Linear(in_features=10, out_features=1, bias=True)
)

這時褂乍,默認所有存在的GPU都會被使用持隧。

如果我們機子中有很多GPU(例如上面顯示我們有4張顯卡,但是只有第0逃片、3塊還剩下一點點顯存)屡拨,但我們只想使用0、3號顯卡褥实,那么我們可以用參數device_ids指定即可:torch.nn.DataParallel(net, device_ids=[0, 3])洁仗。

8.4.2 多GPU模型的保存與加載

我們現在來嘗試一下按照4.5節(jié)(讀取和存儲)推薦的方式進行一下模型的保存與加載。 保存模型:

torch.save(net.state_dict(), "./8.4_model.pt")

加載模型前我們一般要先進行一下模型定義性锭,此時的new_net并沒有使用多GPU:

new_net = torch.nn.Linear(10, 1)
new_net.load_state_dict(torch.load("./8.4_model.pt"))

然后我們發(fā)現報錯了:

RuntimeError: Error(s) in loading state_dict for Linear:
    Missing key(s) in state_dict: "weight", "bias". 
    Unexpected key(s) in state_dict: "module.weight", "module.bias". 

事實上DataParallel也是一個nn.Module赠潦,只是這個類其中有一個module就是傳入的實際模型。因此當我們調用DataParallel后草冈,模型結構變了(在外面加了一層而已她奥,從8.4.1節(jié)兩個輸出可以對比看出來)。所以直接加載肯定會報錯的怎棱,因為模型結構對不上哩俭。

所以正確的方法是保存的時候只保存net.module:

torch.save(net.module.state_dict(), "./8.4_model.pt")
new_net.load_state_dict(torch.load("./8.4_model.pt")) # 加載成功

或者先將new_netDataParallel包括以下再用上面報錯的方法進行模型加載:

torch.save(net.state_dict(), "./8.4_model.pt")
new_net = torch.nn.Linear(10, 1)
new_net = torch.nn.DataParallel(new_net)
new_net.load_state_dict(torch.load("./8.4_model.pt")) # 加載成功

注意這兩種方法的區(qū)別,推薦用第一種方法拳恋,因為可以按照普通的加載方法進行正確加載凡资。


注:本節(jié)與原書基本不同,原書傳送門

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末谬运,一起剝皮案震驚了整個濱河市隙赁,隨后出現的幾起案子,更是在濱河造成了極大的恐慌梆暖,老刑警劉巖伞访,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異轰驳,居然都是意外死亡厚掷,警方通過查閱死者的電腦和手機弟灼,發(fā)現死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冒黑,“玉大人田绑,你說我怎么就攤上這事÷盏” “怎么了辛馆?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長豁延。 經常有香客問我昙篙,道長,這世上最難降的妖魔是什么诱咏? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任苔可,我火速辦了婚禮,結果婚禮上袋狞,老公的妹妹穿的比我還像新娘焚辅。我一直安慰自己,他們只是感情好苟鸯,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布同蜻。 她就那樣靜靜地躺著,像睡著了一般早处。 火紅的嫁衣襯著肌膚如雪湾蔓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天砌梆,我揣著相機與錄音默责,去河邊找鬼。 笑死咸包,一個胖子當著我的面吹牛桃序,可吹牛的內容都是我干的。 我是一名探鬼主播烂瘫,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼媒熊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坟比?” 一聲冷哼從身側響起芦鳍,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎温算,沒想到半個月后怜校,有當地人在樹林里發(fā)現了一具尸體间影,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡注竿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巩割。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡裙顽,死狀恐怖,靈堂內的尸體忽然破棺而出宣谈,到底是詐尸還是另有隱情愈犹,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布闻丑,位于F島的核電站漩怎,受9級特大地震影響,放射性物質發(fā)生泄漏嗦嗡。R本人自食惡果不足惜勋锤,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侥祭。 院中可真熱鬧叁执,春花似錦、人聲如沸矮冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胎署。三九已至吆录,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琼牧,已是汗流浹背径筏。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留障陶,地道東北人滋恬。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像抱究,于是被迫代替她去往敵國和親恢氯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容