分散式¶
對於分散式訓練,TorchX 依靠排程器的群組排程功能來排程節點的 n
個副本。啟動後,應用程式應以利用此拓撲的方式編寫,例如,使用 PyTorch 的 DDP。您可以透過在元件的 AppDef 中指定多個 torchx.specs.Role
來使用 TorchX 表達各種節點拓撲。每個角色都對應到一個同質的節點群組,這些節點在整體訓練中執行一個「角色」(功能)。在排程方面,TorchX 將每個角色作為一個子群組啟動。
DDP 樣式的訓練作業只有一個角色:訓練器。而使用參數伺服器的訓練作業將具有兩個角色:參數伺服器、訓練器。您可以為每個角色指定不同的進入點(可執行檔)、副本數、資源需求等。
DDP 內建¶
DDP 樣式的訓練器很常見,而且很容易模板化,因為它們是同質的單一角色 AppDef,所以有一個內建的:dist.ddp
。假設您的 DDP 訓練腳本名為 main.py
,請按以下方式啟動它
# locally, 1 node x 4 workers
$ torchx run -s local_cwd dist.ddp -j 1x4 --script main.py
# locally, 2 node x 4 workers (8 total)
$ torchx run -s local_cwd dist.ddp -j 2x4 --script main.py
# remote (optionally pass --rdzv_port to use a different master port than the default 29500)
$ torchx run -s kubernetes -cfg queue=default dist.ddp \
-j 2x4 \
--script main.py
# remote -- elastic/autoscaling with 2 minimum and max 5 nodes with 8
# workers each
$ torchx run -s kubernetes dist.ddp -j 2:5x8 --script main.py
請注意,與本地啟動相比,唯一的區別是排程器 (-s
)。dist.ddp
內建元件在幕後使用 torchelastic
(更具體地說是 torch.distributed.run
)。在 這裡 閱讀更多關於 torchelastic 的資訊。
元件 API¶
- torchx.components.dist.ddp(*script_args: str, script: Optional[str] = None, m: Optional[str] = None, image: str = 'ghcr.io/pytorch/torchx:0.7.0', name: str = '/', h: Optional[str] = None, cpu: int = 2, gpu: int = 0, memMB: int = 1024, j: str = '1x2', env: Optional[Dict[str, str]] = None, max_retries: int = 0, rdzv_port: int = 29500, rdzv_backend: str = 'c10d', mounts: Optional[List[str]] = None, debug: bool = False, tee: int = 3) AppDef [原始碼]¶
分散式資料平行應用程式(一個角色,多個副本)。 使用 torch.distributed.run 來啟動和協調 PyTorch 工作者行程。 預設情況下,在 rendezvous_endpoint
$rank_0_host:$rdzv_port
上使用c10d
會合後端。 請注意,在單一節點上執行時,rdzv_port
參數會被忽略,而我們使用端口 0,這會指示 torchelastic 在主機上選擇一個可用的隨機端口。- 注意: (cpu、gpu、memMB) 參數與
h
(已命名的資源)互斥,其中 如果指定了
h
來設定資源需求,則h
優先。 請參閱 註冊已命名的資源。
- 參數:
script_args – 傳遞給主模組的參數
script – 在映像檔中執行的腳本或二進位檔案
m – 要執行的 Python 模組路徑
image – 映像檔(例如 docker)
name – 作業名稱覆寫,格式如下:
{experimentname}/{runname}
或{experimentname}/
或/{runname}
或{runname}
。 如果未指定{runname}
,則使用腳本或模組名稱。cpu – 每個副本的 CPU 數量
gpu – 每個副本的 GPU 數量
memMB – 每個副本的 CPU 記憶體(MB)
h – 註冊的已命名資源(如果指定,則優先於 cpu、gpu、memMB)
j – [{min_nnodes}:]{nnodes}x{nproc_per_node},對於 GPU 主機,nproc_per_node 不能超過 GPU 數量
env – 要傳遞給執行的環境變數(例如 ENV1=v1、ENV2=v2、ENV3=v3)
max_retries – 允許的排程程式重試次數
rdzv_port – rank0 主機上用於託管用於會合的 c10d 存放區的端口。 僅在執行多節點時生效。 在執行單一節點時,此參數將被忽略,並選擇一個可用的隨機端口。
rdzv_backend – 要使用的會合後端。 僅在執行多節點時生效。
mounts – 要掛載到工作者環境/容器的掛載(例如 type=<bind/volume>、src=/host、dst=/job[,readonly])。 如需詳細資訊,請參閱排程程式文件。
debug – 是否使用預設的除錯旗標啟用執行
tee – 將指定的標準串流複製到控制台 + 檔案。 0:無,1:標準輸出,2:標準錯誤輸出,3:兩者
- 注意: (cpu、gpu、memMB) 參數與