什么是DLRover
关于DLRover是什么,参见本专栏的上一篇文章:DLRover:蚂蚁开源的大规模智能分布式训练系统
两个大模型训练故障场景复现
场景复现:训练 Pod 被调度在了一个故障机上
复现步骤
- 训练任务,启动任务时同时启动监控进程,在worker-1 pod上持续杀死dlrover-run启动的网络检测子进程,模拟故障机
- sed -i 's/run_network_check/nvidia_gpu/' examples/pytorch/mnist/start_chaos.sh && \
- (bash examples/pytorch/mnist/start_chaos.sh kill-process &) &&
- 训练节点数必须大于3,否则DLRover无法定位故障机
预期结果
- pod因为故障机报错退出,错误日志("The node is down.")
- dlrover自动启动新的pod,接替故障节点
场景复现:训练pod是一个慢节点-场景
复现步骤
- 正常启动训练任务
- 启动命令携带--exclude-straggler 参数
- 进入一个训练pod中,将 其 CPU 负载提升到 90%,使其成为慢节点
- chaosblade-1.7.2/blade create cpu load --cpu-percent 90
- kubectl top pod torch-mnist-hgc-edljob-worker-0 -n dlrover
- 训练pod申请的cpu数量不能太少,否则组网就会失败,整个任务失败
预期结果
- 慢节点pod报错退出,错误日志("The node is a straggler and exits.")
- dlrover自动启动新的pod,接替慢节点
torchrun介绍
- torchrun 是 PyTorch 提供的一种用于启动分布式训练任务的命令行工具。它是 torch.distributed.launch 的改进版本,提供了简化的接口和更强的功能。torchrun 具备以下特点:
- 简化的命令行参数:相比 torch.distributed.launch,torchrun 的参数更加简洁和易用。
- 支持多节点多进程:能够方便地配置和启动多节点多进程的分布式训练任务。
- 与 PyTorch 弹性机制的集成:torchrun 可以与 PyTorch Elastic 配合使用,提供弹性训练能力。
torchrun命令示例
- torchrun --nnodes=4 --nproc_per_node=2 --rdzv_id=123 --rdzv_backend=c10d --rdzv_endpoint=master_ip:29500 train.py
- --nnodes 指定总共的节点数。
- --nproc_per_node 指定每个节点上运行的进程数。
- --rdzv_id 是用于集合点的唯一标识符。
- --rdzv_backend 指定集合点的后端,通常是 c10d。
- --rdzv_endpoint 指定集合点的地址和端口。
dlrover-run介绍
- dlrover-run 是 DLRover 提供的一个命令行工具,用于运行分布式训练作业
- 它在功能上是 torchrun 的扩展版本,并增加了一些额外的功能,以提高分布式训练的可靠性和易用性
- 网络检查: 自动检测故障节点和迟滞节点,提升分布式训练的可靠性。
- 简化配置: 在多节点多工作者场景下,简化了必要的配置参数,提升了易用性。
- 否则需要手动处理节点间通信、资源管理和故障检测等问题
dlrover-run命令示例
/usr/local/bin/dlrover-run --network-check --nnodes=2:3 --nproc_per_node=2 --max_restarts=3 examples/pytorch/mnist/cnn_train.py --num_epochs 5 --training_data /data/mnist_png/training/ --validation_data /data/mnist_png/testing/
- 对比torchrun:
- 自动化配置:不需要指定集合点参数
- 故障检测和恢复:--network-check参数
- 动态资源管理:--nnodes参数指定范围而非固定节点数
自动检测故障节点
- 任务启动时候添加 --network-check参数
- 在ElasticTrainingAgent每次_rendezvous时候,会调用_initialize_workers,过程中会创建NodeCheckElasticAgent
- NodeCheckElasticAgent在每个 GPU 上启动子进程来运行一个轻量级的检测任务来检查机器
- GPU 检测脚本 :python -m dlrover.trainer.torch.node_check.nvidia_gpu
- 昇腾芯片检测脚本:python -m dlrover.trainer.torch.node_check.ascend_npu
- 检测任务包含一个简单的 GEMM 和 allgather 任务
- 所有节点两两划分为多个group,执行检查任务并将运行耗时上报给 job master
- 如果有任务失败,需要第二轮测试
- 至少需要4个节点才能检测出故障节点,否则训练直接失败
agent的继承关系
- ElasticAgent:抽象类,提供弹性调度能力的基本框架
- PyTorch包,仅有run和get_worker_group两个待实现接口
- SimpleElasticAgent:抽象类,提供更具体的策略接口和实现框架
- PyTorch包,实现了_rendezvous,run等接口,_start_workers等接口待实现
- LocalElasticAgent:专注于本地环境的弹性调度
- PyTorch包,实现了SimpleElasticAgent中待实现的接口
- ElasticTrainingAgent:增加了对分布式训练的支持,能够动态调整训练资源
- DLRover实现,继承LocalElasticAgent,做了基于master获取组网信息等变化
- NodeCheckElasticAgent:增加了节点健康检查能力
- DLRover实现,重写run函数,只检查节点状态,不训练