指南:Slurm 和多节点训练
本指南假定您已经了解 corenet-train
的工作原理。如果您是 CoreNet 的新手,请先考虑通过这个教程
CoreNet 支持使用 DDP 和 FSDP 进行多节点分布式训练。在以下命令中,我们假设有一个多节点多 GPU 或多节点单 GPU 集群。
# 假设 4 节点 x 8 GPU 集群:
export CFG_FILE="path/to/config.yaml" # 请将其更改为您想要的配置文件路径。
export GPU_PER_NODE="8" # 请将其更改为每个节点上可用的 GPU 数量。
export NUM_NODES="4" # 请将其更改为您的集群中的节点数(即主机/机器数)。
export NODE_RANK="0" # 请将其更改为 [0, $NUM_NODES-1] 范围内的数字。每个节点必须使用唯一的等级。
export MAIN_IP_PORT="tcp://IP_OF_RANK0:PORT" # 请将 "IP_OF_RANK0" 更改为等级为 0 的主机名(应能够从其他节点访问)并更改 "PORT" 为一个空闲的端口号。
export WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE))
export GPU_RANK=$((NODE_RANK * GPU_PER_NODE))
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_SIZE
和GPU_RANK
计算所示,--ddp.rank
和--ddp.world-size
参数期望 GPU 索引,而不是节点索引。然而,您应该为每个节点运行一次corenet-train
。
在 Slurm 集群上运行
请为 Slurm 集群自定义以下模板。同时,请注意,我们尚未在 Slurm 上测试 CoreNet。以下脚本假设有一个 4 节点 x 8 GPU 集群。
#!/bin/bash
#SBATCH --job-name=your-job-name
#SBATCH --nodes=4 # 请将其更改为您的集群中的节点数(即主机/机器数)。
#SBATCH --ntasks-per-node=1 # 即使对于多 GPU 节点,也不需要更改这行。
#SBATCH --gpus-per-node=gpu:8 # 请将其更改为每个节点上可用的 GPU 数量。
export CFG_FILE="path/to/config.yaml" # 请将其更改为您想要的配置文件路径。
export GPU_PER_NODE="$SLURM_GPUS_PER_NODE"
export NUM_NODES="$SLURM_NNODES"
export NODE_RANK="$SLURM_PROCID"
# 灵感来自 https://discuss.pytorch.org/t/distributed-training-on-slurm-cluster/150417/7
export MAIN_PORT=$(expr 10000 + $(echo -n $SLURM_JOBID | tail -c 4))
export MAIN_IP="$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)"
export MAIN_IP_PORT="tcp://$MAIN_IP:$MAIN_PORT"
export WORLD_SIZE=$((NUM_NODES * GPU_PER_NODE))
export GPU_RANK=$((NODE_RANK * GPU_PER_NODE))
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