在高性能计算(HPC)领域,SLURM(Simple Linux Utility for Resource Management)作为主流作业调度系统,被广泛用于管理大规模集群资源。然而,传统 SLURM 部署复杂,需要多机配置网络、共享存储和数据库,门槛较高。Docker Compose 提供了一种轻量级解决方案,能在单机或少量主机上模拟多节点 SLURM 集群,支持 MPI 并行作业、共享 NFS 存储,以及 slurmctld(控制器)和 slurmd(节点守护进程)的快速启动。这种方法特别适合开发测试、原型验证和云端 HPC 模拟,避免了物理集群的高成本和维护负担。
观点一:Docker Compose 编排 SLURM 的核心优势在于可移植性和快速迭代。通过单一 docker-compose.yml 文件定义所有服务,包括 slurmctld、slurmd、MySQL(可选,用于会计)和 NFS 服务器,实现 “一键部署”。相比 Kubernetes 等复杂编排工具,Compose 更轻便,适合中小规模模拟。证据显示,slurm-docker-cluster 等开源项目已证明其在本地模拟 2-4 节点集群的有效性,支持 GPU passthrough(通过 --gpus all)和主机网络模式,确保 MPI 通信低延迟。
核心组件拆解如下:
-
slurmctld 服务:SLURM 控制器,负责作业调度和资源分配。Docker 配置示例:
services: slurmctld: image: slurm-docker-cluster:21.08.6 command: ["slurmctld"] volumes: - ./slurm.conf:/etc/slurm/slurm.conf:ro - ./gres.conf:/etc/slurm/gres.conf:ro - slurmdbd:/var/lib/slurmdbd ports: - "6817:6817/udp" - "6817:6817/tcp" - "6818:6818" networks: - slurm-net注意:使用主机网络(network_mode: host)以模拟真实集群通信。
-
slurmd 服务(多节点模拟):每个计算节点一个 slurmd 实例。定义多个服务如 node1、node2:
node1: image: slurm-docker-cluster:21.08.6 command: ["slurmd", "-c"] hostname: node1 volumes: - ./slurm.conf:/etc/slurm/slurm.conf:ro - /var/run/munge:/var/run/munge - nfs-data:/shared privileged: true # 访问主机资源如 GPU networks: slurm-net: ipv4_address: 172.20.0.11通过 hostname 和 slurm.conf 中的 NodeName=node [1-2] 映射节点。
-
共享 NFS 存储:HPC 作业需统一文件系统。添加 NFS 服务:
nfs-server: image: itsthenetwork/nfs-server-alpine volumes: - nfs-data:/nfsshare ports: - "2049:2049"在 slurmd 中挂载:-v nfs-server:/nfsshare:/shared:shared。权限设为 755,确保 MPI 作业读写一致。
-
数据库(可选):MySQL 用于 slurmdbd 持久化作业记录:
mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password volumes: - mysql-data:/var/lib/mysql
slurm.conf 关键参数(落地清单):
ClusterName=virtual-cluster
ControlMachine=slurmctld
SlurmctldPort=6817
SlurmdPort=6818
AuthType=auth/munge
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd
NodeName=node[1-2] Procs=4 RealMemory=8000 State=UNKNOWN
PartitionName=default Nodes=node[1-2] Default=YES MaxTime=INFINITE
gres.conf(GPU 支持):
NodeName=node1 Name=gpus File=/dev/nvidia0 Count=1
启动流程:
docker-compose up -d:后台启动所有服务。docker-compose exec slurmctld ./update_slurmfiles.sh:同步配置。./register_cluster.sh:注册节点(若用数据库)。sinfo:验证节点 idle 状态。- 测试 MPI 作业:
#!/bin/bash #SBATCH --job-name=mpi-test #SBATCH --nodes=2 #SBATCH --ntasks-per-node=2 #SBATCH --time=00:10:00 srun hostname # 或 mpirun -np 4 ./mpi_hellosbatch mpi.slurm提交。
监控要点:squeue -u $USER 查看队列;docker-compose logs -f 尾随日志;Prometheus + Node Exporter 集成 cgroup 指标。阈值建议:SlurmctldTimeout=300s,SlurmdTimeout=300s;节点 Down 时重启 slurmd。
风险与回滚:Docker 网络开销~5-10%(用 host 模式缓解);NFS 权限冲突(统一 UID=1000);生产勿用,转 K8s + Volcano。回滚:docker-compose down -v 清卷重启。
实际案例:eXact lab 的 vhpc 项目使用类似方案模拟 Rocky Linux 9 SLURM 集群,支持多节点 MPI。该方法已在开发环境中验证,ResNet50 多机训练效率达 90% 物理集群水平。
参数调优清单:
- 网络:overlay 网络,driver=overlay。
- 存储:NFS v4,--nfs-version=4。
- MPI:OpenMPI in 容器,LD_LIBRARY_PATH=/usr/lib64/openmpi。
- GPU:--runtime=nvidia,--gpus all。
- 资源限:cpus=4,mem_limit=8g 在 Compose 中。
- 健康检查:healthcheck: test: ["CMD", "sinfo"]。
这种虚拟 SLURM 集群极大降低了 HPC 入门门槛,支持从本地 Mac 到云 ECS 的无缝迁移,最终加速 MPI/OpenMP 应用开发。
资料来源:
- eXact lab vhpc
- slurm-docker-cluster 项目及 CSDN 部署教程
(正文约 1250 字)