deepspeed從入門到放棄

王冰冰發表於2024-09-01

本文並不講解deepspeed的原理以及用法,只是澄清幾個deepspeed中的技術細節。

啟動deepspeed訓練可以透過執行deepspeed --nproc-per-node 4 xxx.py ...,這樣就會啟動4個程序來執行xxx.py

  1. 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>(注意下劃線和連字元的不同)。

  1. 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)

相關文章