GCP上PyTorch Lightning多节点训练不调用worker及Ray Lightning故障咨询
PyTorch Lightning多节点训练故障修复方案
问题1:原生DDP模式下未调度工作节点的解决方法
你当前配置的核心问题是未告知PyTorch Lightning(PL)需要调度的节点总数,导致默认仅使用单节点运行,修复步骤如下:
- 补充
num_nodes参数:从Vertex AI环境变量中读取集群总节点数,再传入Trainer配置,代码示例如下:
import os # Vertex AI训练作业会自动注入该环境变量标识总节点数,默认值1适配单节点场景 num_nodes = int(os.environ.get("CLOUD_ML_JOB_WORKER_COUNT", 1)) trainer = pl.Trainer( max_epochs=num_epochs, weights_summary='full', callbacks=callbacks, # 高版本PL推荐拆分accelerator和strategy配置,替代旧版accelerator='ddp'写法 accelerator="gpu", strategy="ddp", gpus=-1, num_nodes=num_nodes, # 显式指定nccl后端适配GPU分布式训练 process_group_backend="nccl", num_sanity_val_steps=0, limit_train_batches=limit_train_batches, limit_val_batches=limit_val_batches, )
- 确保训练入口代码完全包裹在
if __name__ == "__main__":代码块内,避免DDP多进程启动重复执行逻辑。 - 检查VPC网络配置,确保主节点和工作节点之间的DDP默认端口12345开放,无安全组拦截。
问题2:Ray Lightning初始化报错的修复方案
常见故障原因和对应修复方法如下:
- 修复集群启动时序问题:
os.system('ray up cluster.yml')是异步执行命令,Ray集群还未完成所有工作节点的注册就执行ray.init()会导致初始化失败,需要增加集群就绪等待逻辑,比如轮询Ray节点状态直到所有worker节点上线。 - 修正Trainer配置冲突:使用RayPlugin时不需要单独设置
accelerator='ddp',该配置会和Ray的分布式调度逻辑冲突,调整配置如下:
os.system('ray up cluster.yml') # 增加等待逻辑后再初始化Ray ray.init(address="auto") trainer = pl.Trainer( max_epochs=num_epochs, weights_summary='full', callbacks=callbacks, accelerator="gpu" if use_gpu else "cpu", plugins=[RayPlugin(num_workers=num_workers, use_gpu=use_gpu)], num_sanity_val_steps=0, limit_train_batches=limit_train_batches, limit_val_batches=limit_val_batches, )
- 校验版本兼容性:确保PyTorch Lightning、Ray、Ray Lightning三者版本匹配,推荐使用PL 1.8+搭配Ray 2.3+版本,统一所有节点的依赖版本,避免worker节点出现模块缺失或接口不兼容报错。
- 修正Ray集群配置:检查
cluster.yml中的节点资源配置(GPU数量、CPU核数)和Vertex AI节点池实际配置一致,同时配置runtime_env同步训练代码和依赖,确保工作节点运行环境和主节点对齐。 - 显式指定Ray头节点地址:如果
address="auto"识别失败,可以从cluster.yml中读取头节点内网IP,直接指定ray.init(address="ray://<头节点IP>:10001")。
内容的提问来源于stack exchange,提问作者Yasser H
相关产品推荐
相关产品推荐

