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 | 资源预留 | 重要任务保障 |
提高集群利用率
- 使用 Backfill 调度填补碎片时间
- 设置合理的
--time避免资源浪费 - 小任务使用
--gpus-per-node而非独占节点 - 检查点保存后释放资源(弹性训练)
网络故障
InfiniBand 链路故障会导致 NCCL 超时。建议:1) 配置 NCCL_TIMEOUT=30min;2) 定期运行 ibstat 检查链路状态;3) 设置健康检查脚本。