torch.distributed 包支持
Pytorch
分佈式目前只支持 Linux
Pytorch
中通過 torch.distributed
包提供分佈式支持,包括 GPU
和 CPU
的分佈式訓練支持。。
在此之前,torch.nn.DataParallel
已經提供數據並行的支持,但是其不支持多機分佈式訓練,且底層實現相較於 distributed
的接口,有些許不足。
torch.distributed
的優勢如下:
- 每個進程對應一個獨立的訓練過程,且只對梯度等少量數據進行信息交換。
在每次迭代中,每個進程具有自己的 optimizer
,並獨立完成所有的優化步驟,進程內與一般的訓練無異。
在各進程梯度計算完成之後,各進程需要將梯度進行彙總平均,然後再由 rank=0
的進程,將其 broadcast
到所有進程。之後,各進程用該梯度來更新參數。
由於各進程中的模型,初始參數一致 (初始時刻進行一次 broadcast
),而每次用於更新參數的梯度也一致,因此,各進程的模型參數始終保持一致。
而在 DataParallel
中,全程維護一個 optimizer
,對各 GPU
上梯度進行求和,而在主 GPU
進行參數更新,之後再將模型參數 broadcast
到其他 GPU
。
相較於 DataParallel
,torch.distributed
傳輸的數據量更少,因此速度更快,效率更高。
- 每個進程包含獨立的解釋器和 GIL。
由於每個進程擁有獨立的解釋器和 GIL
,消除了來自單個 Python
進程中的多個執行線程,模型副本或 GPU
的額外解釋器開銷和 GIL-thrashing
,因此可以減少解釋器和 GIL
使用衝突。這對於嚴重依賴 Python runtime
的 models
而言,比如說包含 RNN
層或大量小組件的 models
而言,這尤爲重要。
windows報錯:
module 'torch.distributed' has no attribute 'get_world_size'