Hotdry.
systems-engineering

Docker Compose 编排便携式 SLURM HPC 集群:多节点 MPI 作业与共享 NFS 存储

利用 Docker Compose 快速搭建虚拟 SLURM 集群,支持多节点 MPI 作业、共享 NFS 存储,实现本地/云端 HPC 模拟开发测试。

在高性能计算(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 通信低延迟。

核心组件拆解如下:

  1. 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)以模拟真实集群通信。

  2. 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] 映射节点。

  3. 共享 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 作业读写一致。

  4. 数据库(可选):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

启动流程:

  1. docker-compose up -d:后台启动所有服务。
  2. docker-compose exec slurmctld ./update_slurmfiles.sh:同步配置。
  3. ./register_cluster.sh:注册节点(若用数据库)。
  4. sinfo:验证节点 idle 状态。
  5. 测试 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_hello
    
    sbatch 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 应用开发。

资料来源:

(正文约 1250 字)

查看归档