分散式¶
Torchx 可帮助您运行分布式 trainer 作业。退房torchx.components.train
在运行单个 Trainer Job 的示例上。在这里,我们将使用
相同的 Trainer 应用程序示例。
但将以分布式方式运行它。
Torchx 使用 Torch 分布式运行来启动用户进程 并期望用户应用程序以分布式数据并行方式编写
分布式训练器执行¶
为了在单个或多个进程上远程或本地运行您的 Trainer,您需要做的就是 编写分布式 torchX 组件。我们将在此处使用的示例是 Distributed Trainer Component
该组件定义了用户应用程序的启动方式,torchx 将负责将其转换为 特定于调度程序的定义。
单节点、多个 Trainer (桌面)¶
尝试在桌面上启动单个节点、多个 Trainer 示例:
torchx run -s local_cwd ./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist --nnodes 1 --nproc_per_node 2 --rdzv_backend c10d --rdzv_endpoint localhost:29500
./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist 是对组件的引用 功能: 分布式训练器组件
单节点、多训练师 (kubernetes)¶
现在让我们在 kubernetes 集群上启动相同的组件。
退房torchx.schedulers.kubernetes_scheduler
在需要安装的依赖项上
在使用 Kubernetes Scheduler 运行之前。
我们可以使用以下 cmd 在 kubernetes 上启动应用程序:
torchx run -s kubernetes --scheduler_args namespace=default,queue=default ./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist --nnodes 1 --nproc_per_node 2
namespaces arg 对应于要启动的 kubernetes 命名空间。 queue arg 是 volcano 队列。
输出示例:
kubernetes://torchx/default:cv-trainer-pa2a7qgee9zng
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
您可以使用作业 URL 查询作业的状态或日志:
torchx status kubernetes://torchx/default:cv-trainer-pa2a7qgee9zng
torchx 2021-10-18 18:47:44 INFO AppDef:
State: SUCCEEDED
Num Restarts: -1
Roles:
*worker[0]:SUCCEEDED
尝试运行 torchx log kubernetes://torchx/default:cv-trainer-pa2a7qgee9zng。
多个节点,多个 trainer (kubernetes)¶
在 kubernetes 中启动多节点训练器很简单:
torchx run -s kubernetes --scheduler_args namespace=default,queue=default ./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist --nnodes 2 --nproc_per_node 2
上面的命令将使用 volcano 默认队列在 kubernetes 默认命名空间上启动分布式训练作业。它将使用可在 etcd-server:2379 上访问的 etcd 服务来执行 etcd rendezvous。
您可以覆盖 rendezvous 终端节点:
torchx run -s kubernetes --scheduler_args namespace=default,queue=default ./torchx/examples/apps/lightning_classy_vision/component.py:trainer_dist --nnodes 2 --nproc_per_node 1 --rdzv_endpoint etcd-server.default.svc.cluster.local:2379
注意
对于 GPU 训练,请保持 nproc_per_node 等于实例拥有的 GPU 数量。
上面的命令将使用 volcano 默认队列在 kubernetes 默认命名空间上启动分布式训练作业。它将使用可在 etcd-server:2379 上访问的 etcd 服务来执行 etcd rendezvous。
内置分布式组件¶
在上面的示例中,我们使用自定义组件来启动用户应用程序。情况并非总是如此 用户需要编写自己的组件。
Torchx 附带了一组描述典型执行模式的内置组件。
dist.ddp¶
dist.ddp
是以 DDP 方式作为分布式作业运行的应用程序的组件。
您可以使用它来快速迭代您的应用程序,而无需编写自己的组件。
注意
dist.ddp
是一个通用组件,因此它适用于快速迭代,但不适用于生产用途。
如果要将应用程序投入生产,建议编写自己的组件。
详细了解 创作 有关如何创作组件的信息。
我们将用于执行以下示例:dist.ddp
# main.py
import os
import torch
import torch.distributed as dist
import torch.nn.functional as F
import torch.distributed.run
def compute_world_size():
rank = int(os.getenv("RANK", "0"))
world_size = int(os.getenv("WORLD_SIZE", "1"))
dist.init_process_group()
print("successfully initialized process group")
t = F.one_hot(torch.tensor(rank), num_classes=world_size)
dist.all_reduce(t)
computed_world_size = int(torch.sum(t).item())
print(
f"rank: {rank}, actual world_size: {world_size}, computed world_size: {computed_world_size}"
)
if __name__ == "__main__":
compute_world_size()
桌面上的单个 Trainer¶
我们可以使用以下 cmd 在桌面上的四个进程上运行此示例:
torchx run -s local_cwd dist.ddp --entrypoint main.py --nproc_per_node 4
Kubernetes 集群上的单个 trainer¶
我们可以在 kubernetes 集群上执行它
torchx run -s kubernetes --scheduler_args namespace=default,queue=defaultdist.ddp --entrypoint main.py --nproc_per_node 4
组件 API
- torchx.components.dist 中。ddp(*script_args: str, 入口点: str, 图像: str = 'ghcr.io/pytorch/torchx:0.1.0rc2', rdzv_backend: 可选[str] = 无, rdzv_endpoint: 可选[str] = 无, resource: Optional[str] = None, nnodes: int = 1, nproc_per_node: int = 1, 名称: str = 'test-name', 角色: str = 'worker', env: 可选[dict[str, str]] = None) → torchx.specs.api.AppDef[来源]¶
分布式数据并行风格的应用程序(一个角色,多副本)。 使用 torch.distributed.run 启动和协调 pytorch 工作进程。
- 参数
script_args – 脚本参数。
image (图像) – 容器镜像。
entrypoint – 要在映像中运行的脚本或二进制文件。
rdzv_backend – 要使用的 rendezvous 后端,允许的值可以在 rdzv 注册表文档中找到默认后端为 c10d
rdzv_endpoint – 控制器终端节点。如果 rdzv_backend 是 etcd,则这是一个 etcd endpoint,如果是 c10d,则这是其中一个主机的 endpoint。 默认 entdpoint it localhost:29500
resource – 可选的命名资源标识符。resource 参数 在本地调度程序上运行时被忽略。
nnodes – 节点数。
nproc_per_node – 每个节点的进程数。
name (名称) – 应用程序的名称。
role (角色) – ddp 角色的名称。
env – 环境变量。
- 返回
Torchx 应用防御
- 返回类型