本文並不講解deepspeed的原理以及用法,只是澄清幾個deepspeed中的技術細節。
啟動deepspeed訓練可以透過執行deepspeed --nproc-per-node 4 xxx.py ...
,這樣就會啟動4個程序來執行xxx.py
- deepspeed啟動程序後如何知道是幾號程序?
答:deepspeed啟動程序會自動傳入一個引數--local_rank=<rank>
,同時也會設定環境變數LOCAL_RANK
。
torchrun是透過環境變數
LOCAL_RANK
來傳遞rank,而torch.distributed.launch
則是透過引數--local-rank=<rank>
,值得注意的是,在pytorch 1.x版本中,torch.distributed.launch
傳遞的引數是--local_rank=<rank>
(注意下劃線和連字元的不同)。
dist.broadcast
超時
答:分散式操作必須在所有的卡上都進行才可以,不能只有部分程序執行了這條程式碼。假如寫了如下程式碼就會超時:
if local_rank == 0:
torch.distributed.broadcast(tensor, src=0)
必須在所有卡上呼叫broadcast(tensor, src=0)
,只不過其他卡執行的是“recv”操作,0號卡執行的是“send”操作,不然0卡傳送出去後會一直等待其他程序接收,結果其他程序一直不接收,就會超時。
3. zero-3
將模型切分後,在一張卡上的model.parameters()
返回的是什麼?
寫一段程式碼測試一下哈。實測返回的是一個空引數,並不是模型的實際引數,列印結果如下:
tensor([], device='cuda:3', requires_grad=True)