分布式¶
对于分布式训练,TorchX 依赖调度器的批调度能力来调度 n 个节点副本。一旦启动,应用程序应以利用这种拓扑的方式编写,例如使用 PyTorch 的
DDP。
你可以通过在组件的 AppDef 中指定多个
torchx.specs.Role 来表达各种节点拓扑。每个角色映射到一组同构的节点,在整体训练中执行一个“角色”(功能)。从调度的角度来看,TorchX 以子批的方式启动每个角色。
DDP 风格的训练作业只有一个角色:训练器。而使用参数服务器的训练作业则有两个角色:参数服务器和训练器。 你可以为每个角色指定不同的入口点(可执行文件)、副本数量、资源需求等。
DDP 内置¶
DDP风格的训练器很常见且易于模板化,因为它们是同构的单一角色AppDefs,所以有一个内置的: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 的信息请 点击这里。
组件APIs¶
- torchx.components.dist.ddp(*script_args: str, script: Optional[str] = None, m: Optional[str] = None, image: str = 'ghcr.io/pytorch/torchx:0.5.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, mounts: Optional[List[str]] = None, debug: bool = False) AppDef[source]¶
分布式数据并行风格应用(一个角色,多个副本)。 使用torch.distributed.run 启动和协调PyTorch工作进程。默认使用
c10d会合后端 在会合端点$rank_0_host:$rdzv_port上。请注意,在单节点运行时,rdzv_port参数会被忽略 而是使用端口0,这指示torchelastic选择主机上的一个随机空闲端口。- Note: (cpu, gpu, memMB) parameters are mutually exclusive with
h(named resource) where h如果指定了资源需求设置,则优先考虑。 请参阅 注册命名资源。
- Parameters:
script_args – 主模块的参数
脚本 – 在镜像中运行的脚本或二进制文件
m – 运行的Python模块路径
图像 – 图像 (例如 docker)
名称 – 以如下格式覆盖作业名称:
{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存储(用于会合)的端口。 仅在运行多节点时生效。当运行单节点时,此参数将被忽略,并选择一个随机的空闲端口。
挂载点 – 挂载到工作环境/容器中的挂载点(例如 type=<bind/volume>,src=/host,dst=/job[,readonly])。 请参阅调度程序文档以获取更多信息。
调试 – 是否启用预设的调试标志运行
- Note: (cpu, gpu, memMB) parameters are mutually exclusive with