pytorch - SLURM 和 Pytorch 如何一起处理多节点多 GPU 训练
问题描述
我想问一下,在使用 Slurm 管理工作负载的集群中使用多节点多 GPU 进行训练时,梯度如何聚合。代码是使用 Pytorch 编写的。
例如,当train.py
在 Slurm 中启动脚本以在 4 个节点上训练模型时,每个节点有 4 个 GPU,如下所示,该srun
命令究竟做了什么?
srun python train.py
它写在srun
用于在由 Slurm 管理的集群上运行并行作业的文档中。但是,我想知道它执行了哪些步骤。我想它将脚本复制到 16 个 GPU,每个 GPU 将同时运行脚本。那是对的吗?
如果我torch.distributed.init_process_group()
在脚本中使用处理多 GPU 训练,Slurm 将如何处理从每个 GPU 和 Pytorch 收集的梯度?我假设有一个主端口(它是由 Slurm 分配的节点中的一个 GPU 设备)来收集梯度。由于这个torch.distributed
包,4 个节点中的所有 16 个 GPU 都会将梯度传输到这个主端口?Slurm 有助于分配资源,但它在梯度聚合中没有任何作用?
我也不确定是否应该srun
像上面那样启动脚本,还是应该torch.distributed.launch
在我的命令中指定如下。我想确保正确收集渐变。
# NGPU equals to number of GPUs/node
export NGPU=4
srun python -m torch.distributed.launch --nproc_per_node=$NGPU train.py
预先感谢您的帮助!
解决方案
推荐阅读
- typescript - 如何禁用 tsconfig.json 自动生成?
- azure - APIM 缓存策略中的“变化”
- scala - 为什么 scala 函数的后续运行速度要快几个数量级?
- python - 如何在未释放 Ctrl 的情况下修复键盘模块中的问题 (Windows)
- swift - 想在swift中使用healthkit同步获取睡眠数据
- java - Spring boot @ElementCollection:“字段列表”中的未知列“user_roles”
- python - Python 日志模块 - 日志文件命名
- kubernetes - 使用 Kubernetes 调度构建
- mysql - 在 SQL 查询中使用 Promise?
- git - 是否可以通过 git&github 访问本地 pc 上某人的文件?