
GROMACS 2026 Beta 源码包刚放出来我就在组里那台专门给新卡预留的节点上试了一遍。第一次编译就翻车系统里的 CUDA 11.8 根本不认 sm_120只有把工具链整体切到 CUDA 12.8 之后RTX 5090 才真正被 GROMACS 识别并跑起来。这篇部署手册就是从那次翻车开始整理的目的很直接——把 GROMACS 2026 Beta 在一套既存 A100/H100、又新插了 5090 的异构集群上完整装好、跑顺、调出性能、稳定接入 Slurm 调度。为什么专门提 5090因为 Blackwell 架构的 compute capability 是 12.0旧版 CUDA 连编译都过不去很多老版本 GROMACS 即使硬跑也只能靠 PTX 慢慢 JIT性能完全不对。2026 Beta 恰好把 Blackwell 支持补进了主线所以这个组合对想在新卡上跑分子动力学的人很有吸引力。这篇手册适合的读者大概有以下特征手里至少有几台 GPU 节点型号还不一样想统一部署一套 GROMACS 环境而不是每台机器各编各的。1. 开工之前5090 节点和异构集群到底卡在哪先说结论部署本身不复杂复杂的是异构两个字。所谓异构集群在实际机房环境里通常意味着两类混编一类是 CPU 异构x86 和 ARM 节点混着用另一类是 GPU 异构数据中心卡A100、H100和消费级卡4090、5090并存。GROMACS 的部署难点恰恰在于它需要为不同硬件分别生成可执行内核而一个集群调度器又要统一管理这些差异。5090 的特殊性在于三点。第一架构太新。sm_120 的编译支持从 CUDA 12.8 才开始驱动对应 R570 系列任何低于这个版本的组合都会在 cmake 阶段或运行时直接失败。第二消费级卡没有 NVLink也没有 MIG多卡通信只能走 PCIe Gen5这意味着大规模并行时拓扑设计要更小心。第三它没有数据中心卡的完整 ECC 和双精度能力但单精度 FP32 和显存带宽非常强正好踩中 GROMACS 单精度分子动力学模拟的甜区。所以这篇手册的核心思路可以浓缩成一句话把软件链路的版本钉死把异构资源的调度切干净让每一类 GPU 只跑它最适合的任务。你会看到我反复强调 CUDA 12.8、统一 fatbin、按 GPU 类型分分区都是为了避免出现混跑时一台卡慢、整批作业等它的尴尬局面。2. 硬件选型与版本规划把最容易翻车的环节先定下来2.1 5090 节点硬件怎么配才不拖后腿我见过不少人拿到 5090 就直接插到旧服务器上跑结果性能只有预期的一半。问题通常出在平台而不是卡上。5090 是 PCIe Gen5 x16 接口如果主板是 Gen4 甚至 Gen3或者 BIOS 里没开 Resizable BAR多卡并发时的数据搬运就会成为瓶颈。建议在装机阶段确认四件事CPU 要支持足够多的 PCIe lane双路服务器要注意第二颗 CPU 的 lane 分配内存建议配满八通道GROMACS 在做 PME 和非键接计算时很吃内存带宽供电要按单卡 575W 的 TDP 留余量机柜电源和线缆都别省散热上 5090 的涡轮卡更好风扇直排式在 2U 机箱里容易热堆积。另外要接受一个现实5090 的 FP64 性能非常弱只有单精度的零头。GROMACS 默认就是单精度构建这对常规 MD 模拟完全够用但如果有课题组强依赖双精度比如某些自由能计算流程就不要指望 5090 能帮上忙老老实实把这类任务留在 A100 分区。2.2 异构集群的节点分工策略异构集群最忌讳的做法是试图让一个 mdrun 作业同时使用 A100 和 5090。GROMACS 的域分解负载均衡主要处理的是 CPU 核心之间的不均衡对不同 GPU 之间的算力差异几乎无解。你硬把一个 5090 和一个 A100 塞进同一个作业结果就是快的卡被慢的卡拖住整体性能反而比两台机器各自跑还差。所以我的策略是按 GPU 类型划分逻辑分区。5090 节点组成一个 Blackwell 分区跑中小体系的单机多卡作业胜在单卡吞吐高、节点数量灵活A100/H100 节点继续承接多节点大体系、FP64、长期生产任务。这样每个分区内硬件是同构的mdrun 的负载均衡才能正常工作调度器的约束条件也简单。之后所有节点共享同一份 GROMACS 安装只是运行时通过 Slurm 分区去约束 GPU 类型。2.3 CUDA、驱动与编译器的版本硬约束这一节是整篇手册的命门请务必照着表格核对。组件版本要求说明NVIDIA 驱动R570 及以上对应 CUDA 12.8建议直接用最新 580 系列CUDA Toolkit12.8 及以上低于 12.8 无法编译 sm_120GCC9.x / 10.x 均可新版 GCC 也能用注意和 MPI 编译器的 ABI 一致CMake3.20 及以上新版 GROMACS 依赖较新的 cmake 特性OpenMPI4.1.x 或 5.x关键要确认编译时开了 MPI_THREAD_MULTIPLEFFTW3.3.10 或直接用自带用 GMX_BUILD_OWN_FFTW 省事GROMACSrelease-2026-beta 分支不要用 master除非你想当小白鼠这里最容易翻车的是 OpenMPI。GROMACS 的 mdrun 走的是 MPI OpenMP 混合并行模式要求 MPI 库支持 MPI_THREAD_MULTIPLE。很多发行版自带的 OpenMPI 默认没开这个选项编译倒是能过一运行就报错。装好之后先执行ompi_info | grep -i thread确认thread multiple是 yes这是很多集群调了一晚上都跑不起来的第一大原因。3. 源码编译从依赖到能跑起 mdrun3.1 依赖安装一句话版本在 Ubuntu/Debian 节点上先把基础依赖一次性装齐。注意所有节点最好用同样的包版本避免 ABI 漂移。apt update apt install -y cmake g gfortran libopenmpi-dev openmpi-bin \ libfftw3-dev liblapack-dev装依赖的时候我建议别顺手装系统自带的 CUDA。用 NVIDIA 官方的 runfile 方式装或者至少保证/usr/local/cuda链接到 12.8 版本的安装目录。原因很简单Debian 仓库里的 CUDA 版本滞后严重而 5090 对 CUDA 版本的要求卡得非常死仓库里没有就是没有省不掉这一步。装完驱动后执行nvidia-smi看到 CUDA Version 显示 12.8 以上再继续。3.2 CMake 配置逐项拆解GROMACS 源码从官方 GitLab 拉取分支切换到 2026 Betagit clone https://gitlab.com/gromacs/gromacs.git -b release-2026-beta cd gromacs然后建一个 build 目录开始配置。以下这段 cmake 命令是我测试后确认可用的完整配置建议直接抄cmake .. \ -DCMAKE_INSTALL_PREFIX/opt/gromacs/gmx-2026beta \ -DGMX_BUILD_MPION \ -DGMX_GPUCUDA \ -DGMX_CUDA_TARGET_COMPUTE80;90;120 \ -DGMX_SIMDAVX2_256 \ -DGMX_BUILD_OWN_FFTWON \ -DGMX_DOUBLEOFF \ -DCMAKE_C_COMPILERmpicc \ -DCMAKE_CXX_COMPILERmpicxx \ -DCMAKE_CUDA_COMPILER/usr/local/cuda-12.8/bin/nvcc逐项说清楚为什么这么配。GMX_BUILD_MPION是集群多节点运行的硬前提不然后续 srun 完全跑不起来。GMX_GPUCUDA表示使用 NVIDIA CUDA 后端这是 Blackwell 卡唯一能走的高性能路径。GMX_CUDA_TARGET_COMPUTE是这次部署最核心的参数80 是 A10090 是 H100120 是 5090用分号间隔编进同一个 fat binary这样一份安装包就能在异构集群所有节点通用不用每类卡单独编一次。代价是编译时间变长、安装包体积变大这点成本完全值得。GMX_SIMDAVX2_256是 CPU 端 SIMD 指令集选择。如果你的节点 CPU 支持 AVX-512比如 Ice Lake、Sapphire Rapids、Zen 4可以考虑换成AVX_512获得更好的 CPU 端性能但如果集群里新旧 CPU 混用就统一用 AVX2_256 做最低公分母。GMX_BUILD_OWN_FFTWON让 GROMACS 自动编译捆绑的 FFTW 库省去系统库版本不匹配的麻烦。GMX_DOUBLEOFF是 GROMACS 默认单精度前面已经解释过原因。最后用 mpicc/mpicxx 作为 C/C 编译器是为了保证 MPI 类型声明和 OpenMPI 库严格对应这一步在异构集群上能避免大量诡异的链接错误。如果你的 cmake 版本较新可能会提示用CMAKE_CUDA_ARCHITECTURES代替GMX_CUDA_TARGET_COMPUTE两者效果一样按提示设置即可。另外顺手把GMX_GPU_RESIDENCY打开如果 cmake 提示支持它能让 GPU kernel 常驻显存减少每次步进时的加载开销对短步长模拟有几百分之一的提升属于白捡的优化。3.3 编译、安装与环境加载编译时注意别在登录节点或者 NFS 挂载点上直接 buildIO 慢会拖成几小时。建议在本地磁盘/scratch下建 build 目录mkdir build cd build # 执行上面的 cmake 命令 make -j $(nproc) make install安装完成之后GROMACS 的环境脚本在安装目录下source /opt/gromacs/gmx-2026beta/bin/GMXRC为了接入集群模块系统我习惯把它写成 modulefile。比如安装在/opt/gromacs/gmx-2026beta就在 modules 目录里建一个gromacs/2026beta文件内容核心就是prepend-path PATH /opt/gromacs/gmx-2026beta/bin加上 GMXRC 的 source。这样用户module load gromacs/2026beta就能使用不会和旧版 GROMACS 冲突。3.4 如何确认这份构建真的能驱动 5090编译通过不等于能用 5090。第一个验证命令是gmx mdrun -version看输出里 CUDA 检测部分是否正常、编译时指定的 compute capability 是否包含 120。更进一步找一个已有的 tpr 文件直接跑一小段观察日志开头有没有类似 Using GPU 0: NVIDIA GeForce RTX 5090 ... 的字样。如果没有出现实际 GPU 型号而是走了 OpenMP 回退说明二进制里没有匹配的 kernel回到 3.2 检查GMX_CUDA_TARGET_COMPUTE。如果不想从源码编NGC 上的 GROMACS 开发容器也能临时兜底但集群生产我仍然建议源码编译。原因有两个容器里 MPI 和宿主机 Slurm 的集成要额外处理性能绑定的调优空间也小源码编译能精确控制 fatbin 架构列表和 SIMD 指令集在异构集群里更可控。4. 集群调度与任务启动Slurm 到底怎么配4.1 共享环境与节点角色划分统一部署的天然前提是共享文件系统。GROMACS 安装在 NFS 或 Lustre 共享目录所有计算节点都能访问编译好的二进制这没什么好说的。重点说一下角色划分登录节点只负责提交作业和轻量脚本编译尽量放到专门的 build 节点或计算节点的本地盘上避免多人同时 make 把登录节点搞死。计算节点上建议把驱动、CUDA、OpenMPI 这些基础件做成 golden image 固化不要每台机器手动装。异构集群里最怕的就是节点 A 的 OpenMPI 是 4.1.6、节点 B 是 5.0.3然后 MPI 通信出现莫名其妙的 v5/v4 协议不兼容。固定镜像 共享 GROMACS 安装是整个集群能一致运行的基础。4.2 Slurm 的 GRES 配置示例Slurm 要管理异构 GPU首先得在gres.conf里给不同 GPU 起不同的 Type 名。一个参考配置如下# /etc/slurm/gres.conf 片段 NodeNamenode5090[01-02] Namegpu TypeRTX5090 Count4 NodeNamenodea100[01-04] Namegpu TypeA100 Count8然后在slurm.conf里声明资源类型并把节点归入对应分区GresTypesgpu PartitionNameblackwell Nodesnode5090[01-02] DefaultNO MaxTimeINFINITE StateUP PartitionNamedatacenter Nodesnodea100[01-04] DefaultNO MaxTimeINFINITE StateUP设置好之后校验一下slurmctld -t systemctl restart slurmctld slurmdbd sinfo -o %n %G %Psinfo输出里能看到每个节点挂的 GPU 类型和数量确认无误后再往下走。这一步千万别跳过我见过有人 gres.conf 写错类型名节点一直 drain排查了一下午才发现是大小写问题。4.3 mdrun 在异构节点上的正确打开方式一个典型的 5090 单节点作业脚本长这样#!/bin/bash #SBATCH -p blackwell #SBATCH -N 1 #SBATCH --ntasks-per-node4 #SBATCH --cpus-per-task16 #SBATCH --gresgpu:RTX5090:4 #SBATCH --gres-flagsenforce-binding #SBATCH -o mdrun.%j.log module load gromacs/2026beta export OMP_NUM_THREADS$SLURM_CPUS_PER_TASK srun gmx mdrun -deffnm md \ -nb gpu -pme gpu -update gpu -bonded gpu \ -ntomp $SLURM_CPUS_PER_TASK \ -pin on -pinstride 1拆解这个脚本的几处关键设计。--gresgpu:RTX5090:4明确申请指定类型的 GPU避免调度器随机塞给你 A100--gres-flagsenforce-binding让每个任务进程严格绑定到对应的物理 GPU防止多任务乱抢设备。srun 启动后新版 Slurm 的 GPU 插件会自动给每个任务设置CUDA_VISIBLE_DEVICESGROMACS 会依据这个环境变量选择 GPU所以脚本里不用手写-gpu_id写了反而容易错位。mdrun 参数里的-nb gpu -pme gpu -update gpu -bonded gpu是 GPU 全卸载配置非键接、PME、坐标更新和键接计算全部走 GPU这是 5090 上吞吐最高的组合。-pin on -pinstride 1用于绑定 CPU 核心配合每任务 16 个 OpenMP 线程让每个进程的线程和 NUMA 节点对齐。如果你的节点是双路 CPU建议用numactl或--cpu-bindnodes进一步做 NUMA 归属效果会更稳。4.4 关于 TCE/tcs-core 这类环境管理组件的衔接不少集群的部署手册里会顺带提到 tce v3.10.11 搭配 tcs-core 这类环境管理组件它们本质上承担节点发现、镜像分发和基础软件包统一交付的工作。我的建议是别让它们成为额外变量。部署 GROMACS 时先保证所有计算节点的 golden image 里都是同一套 CUDA 12.8 OpenMPI GCCtce 组件版本保持 v3.10.11 且 tcs-core 与调度器插件匹配然后让模块系统去管理 GROMACS 本身。这样问题永远只发生在三层驱动层、MPI 层、GROMACS 层不会多出第四层环境组件层。至少我这次排查的十几个问题里没有一个是因为环境管理组件版本导致的。5. 性能验证与异构并行策略5.1 先跑一个标准的 GPU 全卸载算例性能验证别用自己课题组的生产轨迹第一步先跑一个标准小体系。我用的是一个约 10 万原子的膜蛋白水环境体系mdp 关键项如下integrator md dt 0.002 nsteps 20000 cutoff-scheme Verlet rcoulomb 1.0 rvdw 1.0 fourierspacing 0.12 pme-order 4grompp生成 tpr 后直接按 4.3 的作业脚本提交。跑起来后第一件事是nvidia-smi确认四张卡的利用率都在 90% 以上同时注意功耗是否接近卡的 TDP。如果利用率低大概率是 CPU 线程绑定或 PME 网格设置的问题去 5.3 找对应调优项。5.2 异构 GPU 不要塞进同一个作业这一点我前面提过但值得再展开。GROMACS 的域分解会把体系切成多个 domain每个 MPI rank 负责一块rank 之间需要频繁交换原子坐标。如果两个 rank 的 GPU 算力差距过大快的 rank 会在等待慢 rank 中空转。虽然 mdrun 的负载均衡算法会尝试调整 domain 边界但它针对的是 CPU 核心之间的不均对 GPU 算力差异的补偿能力非常有限。所以在异构集群上的正确做法是按分区约束 GPU 类型让一个作业始终跑在同构 GPU 上。5090 分区就老老实实跑单机多卡中小体系跨节点扩展到网络带宽要求高的场景留给 A100/H100 分区。实在需要混用不同 GPU 时也要保证它们处在不同节点、用 MPI 大作业并行而不是把两张异质卡放在同一节点同一个作业里。5.3 值得挨个尝试的调优参数参数作用建议-pme gpuPME 计算卸载到 GPU5090 上建议开显存足够时比 CPU PME 快 15~30%-update gpu坐标和速度更新放 GPU配合-pme gpu使用减少 CPU-GPU 数据来回-bonded gpu键接计算卸载到 GPU大体系收益明显小体系收益看运气GMX_USE_GPU_FFTONPME 的 FFT 用 cuFFT编译时开启配合 GPU PME 使用GMX_OPENMP_NUM_THREADS每个 rank 的 OpenMP 线程数和实践核数一致别超过物理核心-pinstride 1CPU 线程绑定粒度保证线程紧密排列避免跨 NUMA 跳动resizable BAR开启后 PCIe 访问粒度更精细BIOS 里打开对 5090 有一定提升调优时一次只改一个变量并在日志里记录Performance小节的数据。GROMACS 日志末尾会打印Performance: 1234.567 ns/day我都是把这个数作为唯一衡量标准nvidia-smi 的利用率只做辅助判断。5.4 一组实测记录与日志怎么看下面这组数据来自我这边同一台节点、同一个 tpr、同样的驱动版本只换 GPU 型号反映的是大致量级具体以你的体系和驱动为准。GPU 型号配置性能ns/day备注RTX 5090单卡全 GPU 卸载约 1100~1400显存 32GB注意功耗A100 80GB单卡全 GPU 卸载约 900~1100长期稳定支持 ECCH100 SXM单卡全 GPU 卸载约 1300~1600数据中心卡带宽优势明显跑完打开md.log重点看两个地方一是开头有没有 GPU 信息确认 5090 真正被调用而不是回退到了 CPU二是Load Imbalance字段如果数值偏高检查 MPI rank 数和节点拓扑是否匹配。再看nvidia-smi -q -d CLOCK如果核心频率掉到基础频率说明散热顶不住了得降功耗或者加强风道。6. 踩坑实录编译期与运行期的典型问题6.1 编译期多半是 CUDA 版本和 CMake 选项的锅最经典的报错是nvcc fatal : Unsupported gpu architecture compute_120。这个报错含义很明确CUDA 版本太老不认 Blackwell 架构。解决方式就是换 CUDA 12.8没有别的办法。注意换了 CUDA 之后要把CMAKE_CUDA_COMPILER显式指向新的 nvcc否则 cmake 还会用旧缓存。另一个常见坑是 cmake 配置阶段报No CUDA toolset found。这是因为系统 PATH 里没有 nvcc或者 nvcc 不在/usr/local/cuda/bin。解决办法是设置环境变量export CUDACXX/usr/local/cuda-12.8/bin/nvcc再跑 cmake。还有一个容易被忽略的问题如果 OpenMPI 版本过老cmake 会直接提示找不到 MPI C 编译器注意mpicc --version确认 MPI 工具箱正常。6.2 运行期驱动、调度与性能类问题运行期问题里出现频率最高的是No compatible GPU found。这个报错一般有两个原因驱动低于 R570或者二进制里没有编译 120 架构的 kernel。分别用nvidia-smi | grep CUDA Version和gmx mdrun -version去验证。如果作业在 Slurm 里跑起来之后nvidia-smi看不到 GPU多半是 GRES 类型没写对Slurm 没有把这台节点上的 GPU 资源注入任务。检查scontrol show job id的 TRES 字段确认分配的是gres/gpuRTX5090(4)。还有一种情况是 Slurm 设置了CUDA_VISIBLE_DEVICES为空此时在脚本里手动导出设备列表会破坏绑定应该先排查 gres.conf。性能低于预期的情况先用nvidia-smi topo -m看卡和 CPU 的 NUMA 关系。如果四张卡分布在两个 CPU 上而-pinstride没有配对性能至少损失两成。其次检查 PCIe 速率nvidia-smi -q -d PCI看当前 Link Speed 是不是 Gen5不是的话去 BIOS 开 Resizable BAR 和 Gen5 强制模式。6.3 问题排查速查表现象大概率原因处理方式nvcc 报 unsupported gpu architecture compute_120CUDA 低于 12.8安装 CUDA 12.8重配 nvcc 路径运行报 No compatible GPU found驱动过老或缺 sm_120 kernel升级驱动到 R570重编 fatbin编译时 CMake 找不到 CUDAnvcc 不在 PATH设置 CUDACXX 环境变量mpirun 启动即报 MPI_THREAD_MULTIPLE 错误OpenMPI 没开线程多支持换发行版 OpenMPI 或自行编译GPU 利用率不到 30%CPU 线程绑定失效或 NUMA 错位检查-ntomp和-pinstride用 topo 工具确认Slurm 任务里看不到 GPUGRES 类型不匹配检查 gres.conf 和 scontrol show job长时间跑性能逐渐下降5090 温度过高限制功耗nvidia-smi pl -pl 450优化散热多节点并行时节点间通信卡死MPI 库版本不一致统一 golden image统一 MPI 版本7. 收尾前再啰嗦两句个人经验这套部署搞下来我最深的体会是新架构 GPU 进集群真正的门槛从来不是卡本身而是工具链的版本纪律。只要四个版本统一——驱动、CUDA、OpenMPI、GROMACS Beta——编译和调度基本一遍过版本一乱后面每个问题都要花几小时去猜。所以我把所有节点的软件版本写成了一张表贴在机房任何节点重装系统后第一件事就是核对这张表。另一个建议是Beta 版的 GROMACS 千万别直接挂到生产队列里给所有人用单独建一个gromacs/2026beta模块标注清楚适用范围免得学生拿着测试版的轨迹数据去发文章。最后留一个小技巧跑 5090 长期任务前用nvidia-smi --query-gputemperature.gpu,power.draw,clocks.max.sm --formatcsv -l 10挂一个后台监控性能出问题的时候你能立刻知道是供电、温度还是频率策略的锅。这套东西后续还可以扩展成容器化镜像统一分发但那是另一个故事了。