目录

分布式

对于分布式训练,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 --entrypoint main.py --nproc_per_node 4

# locally, 2 node x 4 workers (8 total)
$ torchx run -s local_cwd dist.ddp --entrypoint main.py \
    --rdzv_backend c10d \
    --nnodes 2 \
    --nproc_per_node 4 \

# remote (needs you to setup an etcd server first!)
$ torchx run -s kubernetes -cfg queue=default dist.ddp \
    --entrypoint main.py \
    --rdzv_backend etcd \
    --rdzv_endpoint etcd-server.default.svc.cluster.local:2379 \
    --nnodes 2 \
    --nproc_per_node 4 \

有很多事情在幕后发生,所以我们强烈建议你继续阅读这部分内容,以便了解一切是如何运作的。此外,请注意,虽然dist.ddp很方便,但你会发现自己编写自己的分布式组件不仅简单(最简单的方法就是复制dist.ddp!),而且在未来会带来更好的灵活性和可维护性,因为内置API比更稳定的规范API更容易变化。然而这个选择是你的,如果你的需求得到满足,可以依赖内置API。

分布式训练

本地测试

注意

请先遵循 运行示例的前提条件

在本地运行分布式训练是一种快速验证你的训练脚本的方法。TorchX 的本地调度器将为每个副本创建一个进程 (--nodes)。下面的例子使用 torchelastic 作为每个节点的主要入口点,进而启动 --nprocs_per_node 个训练器。总共你会看到 nnodes*nprocs_per_node 个训练器进程和 nnodes 个弹性代理进程在你的本地主机上创建。

$ torchx run -s local_cwd ./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist \
     --nnodes 2 \
     --nproc_per_node 2 \
     --rdzv_backend c10d \
     --rdzv_endpoint localhost:29500

警告

已知存在一个与 local_docker(当未提供 -s 参数时的默认调度器)相关的问题,因此我们使用 -s local_cwd。请在 issue-286issue-287 中跟踪修复进度。

远程启动

注意

请先遵循 Prerequisites

以下示例演示了如何远程在Kubernetes上启动相同的工作。

$ torchx run -s kubernetes -cfg queue=default \
    ./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist \
    --nnodes 2 \
    --nproc_per_node 2 \
    --rdzv_backend etcd \
    --rdzv_endpoint etcd-server.default.svc.cluster.local:2379
torchx 2021-10-18 18:46:55 INFO     Launched app: kubernetes://torchx/default:cv-trainer-pa2a7qgee9zng
torchx 2021-10-18 18:46:55 INFO     AppStatus:
  msg: <NONE>
  num_restarts: -1
  roles: []
  state: PENDING (2)
  structured_error_msg: <NONE>
  ui_url: null

torchx 2021-10-18 18:46:55 INFO     Job URL: None

请注意,与本地启动相比,唯一的区别是调度器 (-s) 和 --rdzv_backend。etcd 也可以在本地情况下工作,但我们使用了 c10d 因为它不需要额外的设置。请注意,这是 torchelastic 的要求, 而不是 TorchX。了解更多关于会合的信息 在这里

注意

对于GPU训练,保持nproc_per_node等于主机上的GPU数量,并 更改资源需求在torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist 方法。将resource_def修改为主机拥有的GPU数量。

组件APIs

torchx.components.dist.ddp(*script_args: str, entrypoint: str, image: str = 'ghcr.io/pytorch/torchx:0.1.0', rdzv_backend: Optional[str] = None, rdzv_endpoint: Optional[str] = None, resource: Optional[str] = None, nnodes: int = 1, nproc_per_node: int = 1, name: str = 'test-name', role: str = 'worker', env: Optional[Dict[str, str]] = None)torchx.specs.api.AppDef[source]

分布式数据并行风格的应用(一个角色,多个副本)。 使用 torch.distributed.run 启动和协调 PyTorch 工作进程。

Parameters
  • script_args – 脚本参数。

  • 图像 – 容器图像。

  • 入口点 – 在镜像中运行的脚本或二进制文件。

  • rdzv_backend – 用于的rendezvous后端,允许的值可以在 rendezvous注册表文档 中找到,默认后端是c10d

  • rdzv_endpoint – 控制器端点。如果 rdzv_backend 是 etcd,这是 etcd 端点;如果是 c10d,则是其中一个主机的端点。 默认端点是 localhost:29500

  • 资源 – 可选的命名资源标识符。在本地调度器上运行时,资源参数将被忽略。

  • nnodes – 节点数量。

  • nproc_per_node – 数目每个节点上的进程。

  • 名称 – 应用程序的名称。

  • 角色 – 深度学习框架的名称。

  • 环境 – 环境变量。

Returns

Torchx 应用定义

Return type

specs.AppDef

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源