分布式¶
对于分布式训练,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 [source]¶
分布式数据并行应用程序 (单角色,多副本)。使用 torch.distributed.run 来启动和协调 PyTorch 工作进程。默认使用
c10d
协调后端,在协调端点$rank_0_host:$rdzv_port
上。请注意,在单节点上运行时,rdzv_port
参数会被忽略,我们改用端口 0,指示 torchelastic 在主机上选择一个随机的空闲端口。- 注意: (cpu, gpu, memMB) 参数与
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 – 用于托管用于协调的 c10d 存储的 rank0 主机上的端口。仅在多节点运行时生效。在单节点运行时,此参数会被忽略,并选择一个随机的空闲端口。
rdzv_backend – 要使用的协调后端。仅在多节点运行时生效。
mounts – 要挂载到工作环境/容器中的挂载点 (例如 type=<bind/volume>,src=/host,dst=/job[,readonly])。有关详细信息,请参阅调度器文档。
debug – 是否以预设的调试标志启用运行
tee – 将指定的标准流 (s) 输出到控制台 + 文件。0: 无,1: stdout,2: stderr,3: 同时输出
- 注意: (cpu, gpu, memMB) 参数与