AI服务器集群管理:用Slurm和监控把多机训练管起来
多台GPU服务器放在一起不等于集群。
AI服务器集群管理要解决三件事:节点之间环境一致、训练任务能排队调度、GPU和温度状态能随时看到。
下面按“准备节点、装调度器、配监控、验证排错”的顺序走一遍,适合刚接手几台到几十台训练机的运维或算法同学。
先把节点环境统一,再谈调度
集群管理最怕每台机器CUDA版本、驱动版本、用户目录都不一样。
动手前先做三件事:
- 所有节点安装相同版本的GPU驱动和CUDA,用
nvidia-smi确认驱动版本一致。 - 配置主机名和hosts解析,确保管理节点能用主机名ping通计算节点。
- 创建统一的普通用户(如
train),并配置SSH免密登录,后面Slurm和分发文件都依赖它。
检查主机名和解析:
hostnamectl set-hostname gpu01
cat >> /etc/hosts <<'EOF'
192.168.1.11 gpu01
192.168.1.12 gpu02
EOF
ping -c 2 gpu02
配置免密(在管理节点执行,把公钥推到各计算节点):
ssh-keygen -t rsa -b 4096
ssh-copy-id train@gpu02
ssh train@gpu02 hostname
避坑:不要在每台机器上单独建不同的conda环境再指望调度器帮你对齐。
训练镜像或环境目录最好放在共享存储(NFS)上,挂载路径保持一致,比如都挂到 /data/envs。
安装Slurm,让训练任务排队跑
Slurm是常用的开源作业调度器,作用是接收训练脚本、按GPU资源排队、分配到具体节点执行。
管理节点装 slurmctld,计算节点装 slurmd。
以Ubuntu为例:
apt install -y slurm-wlm munge
systemctl enable --now munge
核心配置在 /etc/slurm/slurm.conf,最小可用片段如下(主机名按实际替换):
ClusterName=ai-cluster
SlurmctldHost=gpu01
AuthType=auth/munge
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
GresTypes=gpu
NodeName=gpu01 CPUs=64 RealMemory=256000 Gres=gpu:8 State=UNKNOWN
NodeName=gpu02 CPUs=64 RealMemory=256000 Gres=gpu:8 State=UNKNOWN
PartitionName=train Nodes=gpu01,gpu02 Default=YES MaxTime=INFINITE State=UP
计算节点还需要一个 gres.conf 告诉Slurm每台有几块GPU:
NodeName=gpu01 Name=gpu File=/dev/nvidia0
NodeName=gpu01 Name=gpu File=/dev/nvidia1
实际有几块卡就写几行,或使用自动检测工具生成。
改完后重启服务并检查:
systemctl restart slurmctld
systemctl restart slurmd
sinfo
scontrol show node gpu01
sinfo 里节点状态从 unknown 变成 idle 就说明注册成功。
提交一个测试任务验证调度:
srun -N1 --gres=gpu:1 nvidia-smi
能看到GPU信息,说明从排队到执行这条链路通了。
避坑:slurm.conf 改了之后所有节点都要同步并重启对应服务,只改管理节点会出现节点状态对不上;Gres 写错数量会导致任务一直排队等资源。
配一套能看GPU和温度的监控
调度器只管分配,不负责告诉你哪张卡快过热了。
最轻量的做法是每台节点跑一个指标采集,把GPU利用率、显存、温度汇总到管理节点。
可以用 dcgm-exporter 配合Prometheus和Grafana,也可以先用脚本定时采集做过渡。
快速检查单节点GPU状态的命令:
nvidia-smi --query-gpu=index,utilization.gpu,memory.used,temperature.gpu --format=csv
如果要批量看所有节点,可以写个简单循环:
for h in gpu01 gpu02; do
echo "== $h =="
ssh $h nvidia-smi --query-gpu=utilization.gpu,temperature.gpu --format=csv,noheader
done
监控至少要盯三个指标:GPU利用率长期为0但任务在跑(可能是数据加载瓶颈)、显存接近打满(容易OOM)、温度持续超过阈值(触发降频)。
把这些做成面板,比事后翻日志高效得多。
常见故障怎么定位
任务提交后一直排队,先看资源是否真的空闲:
squeue -l
scontrol show job
如果节点显示 idle 但任务不动,检查分区是否匹配、Gres 是否写对。
节点掉线时,sinfo 会显示 down 或 drain,用 scontrol update NodeName=gpu02 State=RESUME 恢复前,先登录节点确认 slurmd 是否在运行、munge服务是否正常。
多机训练通信失败,优先排查节点间网络和主机名解析,再确认训练框架用的网卡和IP是否一致。
这类问题靠日志里的报错定位,不要盲目重装环境。
验证集群是否真的可用
搭完后按这几点验收:
sinfo所有节点为idle,无down。srun单卡任务能正常执行并输出GPU信息。- 提交一个多节点任务,确认跨机通信正常。
- 监控面板能看到各节点GPU温度和利用率实时变化。
AI服务器集群管理不是装完调度器就结束,节点一致性、资源配额和监控告警要持续维护。
建议先把单节点和调度链路跑通,再逐步接入共享存储和告警,避免一次性铺太大导致问题难定位。