Skip to content

GPU 集群管理与调度

大模型训练需要大规模 GPU 集群支撑。高效的集群管理和任务调度是保证训练吞吐和资源利用率的关键基础设施。

GPU集群管理与调度

集群架构

典型 GPU 训练集群架构:

├── 登录节点 (Login Node)
├── 计算节点 (Compute Nodes)
│   ├── 节点 1: 8× A100-80GB + NVLink
│   ├── 节点 2: 8× A100-80GB + NVLink
│   └── ...
├── 存储节点 (Storage)
│   ├── 高性能并行文件系统 (Lustre/GPFS)
│   └── 对象存储 (S3/MinIO)
└── 网络交换
    ├── InfiniBand (计算网络)
    └── Ethernet (管理网络)

Slurm 调度

Slurm 是 GPU 集群最常用的任务调度系统:

bash
# 提交训练任务
sbatch --job-name=llama-pretrain \
    --partition=gpu-a100 \
    --nodes=8 \
    --ntasks-per-node=1 \
    --cpus-per-task=32 \
    --gpus-per-node=8 \
    --time=72:00:00 \
    --output=logs/%j.out \
    train.slurm

训练脚本

bash
#!/bin/bash
#SBATCH --job-name=llama-7b
#SBATCH --nodes=4
#SBATCH --gpus-per-node=8

# 获取所有节点的地址
MASTER_ADDR=$(scontrol show hostname $SLURM_JOB_NODELIST | head -n1)
MASTER_PORT=29500

# 在每个节点上启动训练进程
srun torchrun \
    --nnodes=$SLURM_JOB_NUM_NODES \
    --nproc_per_node=8 \
    --rdzv_id=$SLURM_JOB_ID \
    --rdzv_backend=c10d \
    --rdzv_endpoint=$MASTER_ADDR:$MASTER_PORT \
    train.py \
    --deepspeed ds_config.json \
    --model_name meta-llama/Llama-2-7b-hf

资源监控

bash
# GPU 利用率监控
nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total --format=csv -l 5

# 节点资源状态
sinfo -N -l

# 任务状态
squeue -u $USER

# 历史任务统计
sacct --format=JobID,JobName,Elapsed,MaxRSS,MaxVMSize -j <job_id>

常见调度策略

策略说明适用场景
FIFO先进先出简单场景
Backfill回填小任务提高利用率
Priority优先级调度多团队共享
Reservation资源预留重要任务保障

提高集群利用率

  1. 使用 Backfill 调度填补碎片时间
  2. 设置合理的 --time 避免资源浪费
  3. 小任务使用 --gpus-per-node 而非独占节点
  4. 检查点保存后释放资源(弹性训练)

网络故障

InfiniBand 链路故障会导致 NCCL 超时。建议:1) 配置 NCCL_TIMEOUT=30min;2) 定期运行 ibstat 检查链路状态;3) 设置健康检查脚本。

相关资源

最近更新