指南:Slurm 和多节点训练

本指南假定您已经了解 corenet-train 的工作原理。如果您是 CoreNet 的新手,请先考虑通过这个教程

CoreNet 支持使用 DDP 和 FSDP 进行多节点分布式训练。在以下命令中,我们假设有一个多节点多 GPU 或多节点单 GPU 集群。

  1. # 假设 4 节点 x 8 GPU 集群:
  2. export CFG_FILE="path/to/config.yaml" # 请将其更改为您想要的配置文件路径。
  3. export GPU_PER_NODE="8" # 请将其更改为每个节点上可用的 GPU 数量。
  4. export NUM_NODES="4" # 请将其更改为您的集群中的节点数(即主机/机器数)。
  5. export NODE_RANK="0" # 请将其更改为 [0, $NUM_NODES-1] 范围内的数字。每个节点必须使用唯一的等级。
  6. export MAIN_IP_PORT="tcp://IP_OF_RANK0:PORT" # 请将 "IP_OF_RANK0" 更改为等级为 0 的主机名(应能够从其他节点访问)并更改 "PORT" 为一个空闲的端口号。
  7. export WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE))
  8. export GPU_RANK=$((NODE_RANK * GPU_PER_NODE))
  9. corenet-train --common.config-file $CFG_FILE --common.results-loc results --ddp.rank $GPU_RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url $MAIN_IP_PORT --ddp.backend nccl

注意: 如上面的 WORLD_SIZEGPU_RANK 计算所示,--ddp.rank--ddp.world-size 参数期望 GPU 索引,而不是节点索引。然而,您应该为每个节点运行一次 corenet-train

在 Slurm 集群上运行

请为 Slurm 集群自定义以下模板。同时,请注意,我们尚未在 Slurm 上测试 CoreNet。以下脚本假设有一个 4 节点 x 8 GPU 集群。

  1. #!/bin/bash
  2. #SBATCH --job-name=your-job-name
  3. #SBATCH --nodes=4 # 请将其更改为您的集群中的节点数(即主机/机器数)。
  4. #SBATCH --ntasks-per-node=1 # 即使对于多 GPU 节点,也不需要更改这行。
  5. #SBATCH --gpus-per-node=gpu:8 # 请将其更改为每个节点上可用的 GPU 数量。
  6. export CFG_FILE="path/to/config.yaml" # 请将其更改为您想要的配置文件路径。
  7. export GPU_PER_NODE="$SLURM_GPUS_PER_NODE"
  8. export NUM_NODES="$SLURM_NNODES"
  9. export NODE_RANK="$SLURM_PROCID"
  10. # 灵感来自 https://discuss.pytorch.org/t/distributed-training-on-slurm-cluster/150417/7
  11. export MAIN_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4))
  12. export MAIN_IP="$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)"
  13. export MAIN_IP_PORT="tcp://$MAIN_IP:$MAIN_PORT"
  14. export WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE))
  15. export GPU_RANK=$((NODE_RANK * GPU_PER_NODE))
  16. corenet-train --common.config-file $CFG_FILE --common.results-loc results --ddp.rank $GPU_RANK --ddp.world-size $WORLD_SIZE --ddp.dist-url $MAIN_IP_PORT --ddp.backend nccl