python中的多線程陷阱與pytorch分布式執行機制
1. 多線程
運行pytorch,設置 work 不為0時的一個怪異現象。
一個類有 __init__ 函數,也有__del__ 函數,以及其他正常函數。
__init__ 被運行后,進行了多線程復制,可能多個線程各自復制了一分這個類的實例。
各個線程在各自空間進行。
最后 __del__ 操作進行一次回收。也就是 __del__ 和 __init__ 是一一對應的,中間的其他線程是獨立運行的。
2. 分布式執行
https://lambdalabs.com/blog/multi-node-pytorch-distributed-training-guide
http://www.rzrgm.cn/rossiXYZ/p/15553670.html
(1)第一種方式,使用 torchrun 或python3 -m torch.distributed.launch。這種方式要求在每個節點上都要執行命令。每個命令傳入了節點數量,節點rank號,主節點地址端口等。該命令根據傳入參數創建環境變量,訓練程序從環境變量獲取rank號等。
參數傳入主要是為了方便,也可以直接在訓練程序里指定ran號,只要不同節點上運行的程序能區分開rank號并且總的word size符合。
(2)第二種方式,使用mpi,即mpirun。這種方式相當于使用mpi程序啟動 python程序。首先需要在mpi程序命令中指定節點列表,也可以通過參數文件傳入,設置比較靈活。其次,需要在python程序命令中執行主節點,即rank為0的節點地址,以用來進行 init_process_group 。
一般來說,mpi參數節點列表第一個就是rank為0的節點,因此python參數的節點要填寫mpi參數節點列表第一個節點。
也可以子在訓練程序中通過rank 0節點廣播,讓其他節點獲取主節點進行 init_process_group 。
mpi運行節點不必須是節點列表的第一個節點,也就是不必須是rank 0
posted on 2024-06-04 15:29 longbigfish 閱讀(61) 評論(0) 收藏 舉報
浙公網安備 33010602011771號