常见失败原因:
容错 ≠ 自动修复错误,而是“从最近安全状态恢复”
关键三件事:
适用场景
核心组件
torch.distributed.launch ❌(已不推荐)torchrun ✅ElasticAgentRendezvous(动态组网)特点
示例
torchrun \
--nnodes=2:4 \
--nproc_per_node=8 \
--rdzv_id=job1 \
--rdzv_backend=etcd \
--rdzv_endpoint=etcd:2379 \
train.py注意
{
"model": model.state_dict(),
"optimizer": optimizer.state_dict(),
"lr_scheduler": scheduler.state_dict(),
"epoch": epoch,
"step": step,
"rng": {
"torch": torch.get_rng_state(),
"cuda": torch.cuda.get_rng_state_all(),
"numpy": np.random.get_state(),
"python": random.getstate()
}
}model.load_state_dict(ckpt["model"])
optimizer.load_state_dict(ckpt["optimizer"])export NCCL_ASYNC_ERROR_HANDLING=1
export TORCH_NCCL_ASYNC_ERROR_HANDLING=1
export NCCL_TIMEOUT=1800或在代码里:
torch.distributed.init_process_group(
backend="nccl",
timeout=datetime.timedelta(seconds=1800)
)作用:
ckpt 自动保存auto_restartTrainer(
strategy="ddp",
plugins="torchrun",
enable_checkpointing=True
)elastic trainingScheduler (K8s / Slurm)
↓
TorchElastic + etcd
↓
定期 Checkpoint → 共享存储 (NFS / S3)
↓
进程崩溃 → 自动重启 → 加载 Checkpoint❌ 只保存 model,不保存 optimizer
→ 学习率 & momentum 错乱
❌ Checkpoint 太稀疏
→ 一挂回到几小时前
❌ 不用 etcd / 静态 IP
→ 节点重连失败
❌ 忽略 DataLoader worker 死锁
→ 加:
persistent_workers=Truetorchrun \
--nnodes=1:4 \
--nproc_per_node=8 \
--rdzv_backend=etcd \
--rdzv_endpoint=etcd:2379 \
train.py# train.py
if os.path.exists("ckpt.pt"):
load_checkpoint()
for epoch in range(start, max_epoch):
train()
save_checkpoint()PyTorch 分布式容错 = torchrun + etcd + 周期 Checkpoint + 自动重启
如果你愿意,我可以:
你现在是哪种训练环境?