torchrun

PyTorch 分布式训练启动器

补充说明

torchrun 是 PyTorch 官方分布式启动工具,替代 torch.distributed.launch。它负责设置 RANK、WORLD_SIZE、LOCAL_RANK 等环境变量,并支持容错重启。

常用示例

单机多卡:

torchrun --standalone --nproc_per_node=4 train.py

多机多卡:

torchrun \
  --nnodes=2 \
  --nproc_per_node=8 \
  --node_rank=0 \
  --master_addr=10.0.0.10 \
  --master_port=29500 \
  train.py

代码中初始化进程组:

import torch.distributed as dist
dist.init_process_group(backend="nccl")
local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)

按 rank 控制日志和保存:

if dist.get_rank() == 0:
    print("only rank 0 logs")

容错启动:

torchrun --nnodes=2 --nproc_per_node=8 \
  --rdzv_backend=c10d --rdzv_endpoint=10.0.0.10:29500 \
  --max_restarts=3 train.py

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. 多机训练时 master_addr 写成 localhost 会怎样?
  2. 只设置 CUDA_VISIBLE_DEVICES 就够了吗?
  3. 每个 rank 都保存模型或写日志会有什么问题?
答案
  1. 其他节点连不上 master,进程组初始化会卡住。应使用各节点可达的 IP。
  2. 不够。还要按 LOCAL_RANK 调用 torch.cuda.set_device(local_rank) 设置当前设备。
  3. 文件会互相覆盖。应只让 rank 0 记录日志和保存模型。