本篇介紹多計算節點上的pytorch分佈式訓練。從環境配置到運行demo的全部步驟,step by step。沒有理論原理,理論原理能夠參考這裏.html
多臺linux計算節點,經過網絡鏈接,不一樣主機之間能夠相互ping通。網速越快越好,若是通訊速度比較慢,就不用怎麼考慮分佈式訓練。node
全部linux計算節點都包含若干GPU,GPU數量能夠不一致,可是全部GPU計算速度儘可能一致,不然模型的同步時會等待大量時間(短板效應)。python
全部計算節點都擁有Pytorch運行環境,即均可以單獨的運行訓練代碼。linux
這裏NFS有兩個做用:(1)集羣初始化時做爲多個進程(不一樣主機上)UDS(unix domain socket)的通訊地址;(2)數據集統一存放在NFS目錄上,全部進程均可以同時訪問。git
選擇一臺與計算節點同一網段的linux主機做爲存儲節點,或者使用計算節點中的一臺做爲存儲節點。github
存儲節點操做以下:shell
apt-get install nfs-kernel-server <path to share> *(rw,sync,no_root_squash,no_subtree_check) # insert this line to /etc/exports, save & exit exportfs -a
數據集保存到共享目錄中。
全部計算節點將共享目錄掛載到本地:網絡
mkdir /mnt/nfs mount -t nfs <ip of storage node>:<path to share> /mnt/nfs
代碼見: github ,須要本身更改數據集的地址。dom
分別在三個主機上運行以下的命令。word_size 爲 3,當啓動的進程數少於3時,全部已經啓動的進程會等待,進程數達到3時集羣建立成功,訓練開始。每一個計算節點都使用該計算節點上的兩個GPU --gpu_devices 0 1
。socket
# node 1 python multigpu_demo_v3.py \ --init_method file://<absolute path to nfs file> \ --rank 0 \ --world_size 3 \ --gpu_devices 0 1 # node 2 python multigpu_demo_v3.py \ --init_method file://<absolute path to nfs file> \ --rank 1 \ --world_size 3 \ --gpu_devices 0 1 # node 3 python multigpu_demo_v3.py \ --init_method file://<absolute path to nfs file> \ --rank 2 \ --world_size 3\ --gpu_devices 0 1
更多測試細節見github。
Pytorch裏的分佈式訓練只能實現增大batch size的做用,對於速度的提高不明顯,對於Batch Norm沒有幫助,若是要提高BN的效果,須要用Sync Bn。