跳转至

Gromacs编译安装

环境:Rocky Linux 8.10, Slurm作业管理系统

安装前必读

安装Gromacs前,先读gromacs官方安装指导,了解编译器、编译选项、数学库支持等等术语。每套集群都安装的有Intel oneAPI编译器,但gromacs官方推荐使用gcc(≥9版本)编译器和FFTW库。

安装cmake

Gromacs 2024需要cmake 3.18.4以上版本才能编译,集群上安装的有3.26.3版本,使用module load cmake-3.26.3调用。
如果是自己的机器,没有安装,可以在cmake官网下载cmake-3.30.3-linux-x86_64.sh,按如下命令安装:

sh cmake-3.30.0-linux-x86_64.sh --prefix=$HOME/soft/cmake-3.30.0 --skip-license
其中,--prefix是指定安装目录,--skip-license是接受license。

安装FFTW

如果服务器或集群能够联网,可不用手动安装,使用-DGMX_BUILD_OWN_FFTW=ON选项,在安装gromacs时可自动下载并安装FFTW库。
如果网络较差这一步安装很慢或者机器不能联网,那就需要手动安装。
判断服务器或集群能否联网:

[userA@quantum ~]$ ping -c3 www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=46 time=27.1 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=46 time=26.6 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=46 time=26.3 ms

--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2236ms
rtt min/avg/max/mdev = 26.327/26.706/27.109/0.319 ms
使用ping -c3 www.baidu.com出现上面信息,代表能联网。
如果屏幕输出为“ping: www.baidu.com: Name or service not known”,代表不能联网,就需手动安装FFTW。下载http://www.fftw.org/fftw-3.3.8.tar.gz, 将其上传到家目录temp(如果没有,可创建或者上传到其他目录都行)下,再解压缩:
[userA@quantum ~]$ cd temp
[userA@quantum temp]$ tar -zxvf fftw-3.3.8.tar.gz
使用configure及其配置选项生成配置文件:
[userA@quantum temp]$ cd fftw-3.3.8
[userA@quantum fftw-3.3.8]$ mkdir -p $HOME/soft/fftw-3.3.8
[userA@quantum fftw-3.3.8]$ ./configure --prefix=$HOME/soft/fftw-3.3.8 --enable-sse2 --enable-avx --enable-avx2 --enable-avx512 --enable-float --enable-shared
configure配置选项中--prefix安装到家目录下的soft/fftw-3.3.8,使用lscpu |grep -c avx512命令,屏幕输出为1,则configure选项就加上--enable-avx512,否则就去掉这个选项。
然后执行make all install命令编译,编译完后,相应库文件可在家目录soft/fftw-3.3.8下找到。之后可以把FFTW的解压目录和压缩包删掉,节省存储空间。

安装GROMACS

下载源码安装包

Gromacs官网下载gromacs-2024.3.tar.gz,并上传到家目录temp目录下,再解压缩

[userA@quantum ~]$ cd temp
[userA@quantum temp]$ tar -zxvf gromacs-2024.3.tar.gz

调用编译器和加载相应库

调用cmake
集群上安装的有3.26.3版本,使用module load cmake-3.26.3调用。
如果是自己安装的cmake(假如安装在家目录的soft/cmake-3.30.0下),需要先设置环境变量,使用export PATH=$PATH:$HOME/soft/cmake-3.30.0

调用gcc
集群上安装的有14.1.0版本,使用module load gcc-14.1.0调用。
如果想自己安装,根据编译器调用和安装的“gcc/gfortran安装”部分进行安装和设置环境变量。
尽管按上面调用或设置了环境变量,但在下一步cmake时还是容易先找/usr/bin下系统默认安装的低版本gcc。为避免此错误,执行:

export CC=/opt/gcc-14.1.0/bin/gcc
export CXX=/opt/gcc-14.1.0/bin/g++
如果不知道上面gcc和g++命令的绝对路径,可以用which gccwhich g++命令查看。

生成cmake配置文件

[userA@quantum temp]$ cd gromacs-2024.3
[userA@quantum gromacs-2024.3]$ mkdir build && cd build
[userA@quantum build]$ cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/soft/gromacs/2024.3 -DGMX_BUILD_OWN_FFTW=ON -DREGRESSIONTEST_DOWNLOAD=ON
cmake配置选项中-DCMAKE_INSTALL_PREFIX指定安装目录,如果服务器或集群不能联网,去掉后面的-DGMX_BUILD_OWN_FFTW=ON -DREGRESSIONTEST_DOWNLOAD=ON
不能联网,需要在cmake这一步前,执行export CMAKE_PREFIX_PATH=$HOME/soft/fftw-3.3.8,添加上我们手动安装的FFTW。
cmake这一步的屏幕输出,也需要关注下CPU指令集的支持,比如下面的相关输出部分:
-- Detecting best SIMD instructions for this CPU
-- Checking for GCC x86 inline asm
-- Checking for GCC x86 inline asm - supported
-- Detected build CPU features - aes apic avx avx2 avx512f avx512cd avx512bw avx512vl avx512secondFMA clfsh cmov cx8 cx16 f16c fma htt intel lahf mmx msr nonstop_tsc pcid pclmuldq pdcm pdpe1gb popcnt pse rdrnd rdtscp sha sse2 sse3 sse4.1 sse4.2 ssse3 tdt x2apic
-- Detected build CPU brand - Intel(R) Xeon(R) Silver 4310 CPU @ 2.10GHz
-- Performing Test C_march_skylake_avx512_FLAG_ACCEPTED
-- Performing Test C_march_skylake_avx512_FLAG_ACCEPTED - Success
-- Performing Test C_march_skylake_avx512_COMPILE_WORKS
-- Performing Test C_march_skylake_avx512_COMPILE_WORKS - Success
-- Performing Test CXX_march_skylake_avx512_FLAG_ACCEPTED
-- Performing Test CXX_march_skylake_avx512_FLAG_ACCEPTED - Success
-- Performing Test CXX_march_skylake_avx512_COMPILE_WORKS
-- Performing Test CXX_march_skylake_avx512_COMPILE_WORKS - Success
-- Detected best SIMD instructions for this CPU - AVX_512
-- Enabling 512-bit AVX-512 SIMD instructions using CXX flags:  -march=skylake-avx512
可看到上面输出,是支持AVX512指令集的。但是这个支持AVX512指令集编译好的Gromacs,在比较久的机器(5-10年前,2013-2018年左右)就没法运行。可以ssh到相应的节点后,然后执行lscpu |grep -c avx512命令,若屏幕都是输出为1,编译的avx512指令集就没问题;但要是屏幕输出的是0,那就需要在cmake选项中添加-DGMX_SIMD=AVX2_256来使用AVX2指令集。
ssh进入到每个节点查看毕竟麻烦,可借用for循环,假如有cu01至cu12共12个节点,执行:
for i in {01..12};do ssh cu$i lscpu |grep -c avx512;done
屏幕输出要是有0,那么cmake选项中需添加-DGMX_SIMD=AVX2_256来使用AVX2指令集。

申请编译节点

集群管理节点一般做了限制,不允许在上面直接运行作业或编译,我们也没专门设置编译节点,因此需要在计算节点上编译。为避免正常作业与编译抢占CPU,我们把编译也按正常作业提交即可。

[userA@quantum build]$ salloc -N1 -n64 -p public -w cu03
salloc: Granted job allocation 5727
salloc: Waiting for resource configuration
salloc: Nodes cu03 are ready for job
-N 申请的计算节点数目;-n 申请的任务核数;-p 申请的作业队列;-w 申请的计算节点名称。
账号可使用队列的名称:可使用sacctmgr show ass user=$(whoami) format=part查看。队列所对应的节点可用sinfo或者pestat命令查看。
这里我们申请一个计算节点,64核,使用public队列,申请计算节点为cu03.

ssh进入申请的编译节点,再次调用cmake和gcc

[userA@quantum build]$ ssh cu03
[userA@cu03 ~]$ cd temp/gromacs-2024.3/
[userA@cu03 gromacs-2024.3]$ module load gcc14.1.0 cmake-3.26.3
[userA@cu03 build]$ export CC=/opt/gcc-14.1.0/bin/gcc
[userA@cu03 build]$ export CXX=/opt/gcc-14.1.0/bin/g++

make进行编译和安装

[userA@cu03 build]$ make -j 64 &>make.log &
[userA@cu03 build]$ make install |tee make.install
几分钟就能编译安装完,在家目录soft/gromacs/2024.3/bin下就能看到可执行文件gmx和相关配置文件。
在$HOME家目录下的.bashrc里添加两行
module load gcc14.1.0
source $HOME/soft/gromacs/2024.3/bin/GMXRC.bash
保存退出后,执行source $HOME/.bashrc或者退出终端再登录,即可使用gmx命令。
在终端执行gmx -version命令,看看是否输出了GROMACS的相关信息,是的话就说明安装成功了。

关于编译mpi版本的Gromacs

上面编译的可执行文件gmx,可在单节点内多核并行计算。要想跨节点并行计算需要MPI库,支持OpenMPI>=1.6、MPICH>=1.4.1。在编译这种GROMACS之前首先要安装MPI库,这里用上面同版本的gcc编译器来编译OpenMPI 4.1.6。
OpenMPI官网下载openmpi-4.1.6.tar.bz2,并上传至家目录的temp目录下。还是在之前申请的cu03节点上编译安装。

[userA@cu03 ~]$ cd temp/
[userA@cu03 temp]$ tar -jxvf openmpi-4.1.6.tar.bz2
[userA@cu03 temp]$ cd openmpi-4.1.6
[userA@cu03 openmpi-4.1.6]$ module load gcc-14.1.0
[userA@cu03 openmpi-4.1.6]$ F77=/opt/gcc-14.1.0/bin/gfortran FC=/opt/gcc-14.1.0/bin/gfortran CC=/opt/gcc-14.1.0/bin/gcc CXX=/opt/gcc-14.1.0/bin/g++ ./configure --prefix=$HOME/soft/openmpi-4.1.6
[userA@cu03 openmpi-4.1.6]$ make all install -j 64 &>make.log &
编译安装后,会在家目录soft/openmpi-4.1.6目录下出现bin、lib、include这些文件夹。
调用OpenMPI,需先设置环境变量,在$HOME/.bashrc里再添加两行:
export PATH=$PATH:$HOME/soft/openmpi-4.1.6/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/soft/openmpi-4.1.6/lib
保存退出后,执行source $HOME/.bashrc或者退出终端再登录即可。
之后编译Gromacs的方法同前,但在cmake那一步需加上-DGMX_MPI=ON选项。编译出来的可执行文件是gmx_mpi,运行命令:mpirun -np 16 gmx_mpi mdrun

关于双精度版本的编译

关于双精度版本的编译,下面完全引用卢天老师457博文中的“注3:编译双精度版本”。
一般计算只需要按照前述编译单精度版本就够了,但如果模拟刚开始就崩溃,有时候用双精度版本可解决,但计算比单精度版慢将近一倍、trr/edr等文件体积大一倍。另外,做正则振动分析时在能量极小化和对角化Hessian矩阵的时候一般也需要用双精度版以确保数值精度。注意,编译双精度版本时不支持GPU加速。
要编译双精度版本的话,先按照前文方式编译一遍单精度版本,毕竟这之后在研究中肯定也得用。然后再重复一遍编译过程,但是在编译FFTW时去掉--enable-float,并且在使用cmake命令时额外加上-DGMX_DOUBLE=ON选项。双精度版本的GROMACS可执行文件是gmx_d,而单精度是gmx,因此单精度和双精度的可执行文件可以同时存在于同一目录,互不冲突。

Gromacs运行及作业提交

例子:在真空中模拟碳纳米管

在卢天老师的帖子使用Gromacs模拟碳纳米管的一个简单例子,下载cnt10.pdb,CNT10.top和md_vacuum.mdp。
预处理,生成tpr文件
预处理一般时间短,可在管理节点直接运行:

gmx grompp -f md_vacuum.mdp -c cnt10.pdb -p CNT10.top -o cnt10.tpr
mdrun模拟
gmx mdrun -ntomp 8 -v -deffnm cnt10
使用8线程并行计算。但管理节点做了核数运行限制,超过1核计算,一会就会被脚本杀掉。所以这一步,需要在slurm作业提交脚本中执行。

Gromacs作业提交脚本

按上面的例子,准备1个作业提交脚本cnt10.slurm文件:

cnt10.slurm
#!/bin/bash
# Job submission script for SLURM:
# Usage: sbatch <this_script>
##############脚本第一部分,声明SLURM作业管理系统的请求资源参数###################
#SBATCH -J cnt10
#SBATCH -o cnt10.o%J
#SBATCH -N 1
#SBATCH --ntasks-per-node=8
#SBATCH -t 2024:03:00
#SBATCH -p gao-grp
########################请求资源参数的解释######################################
#    -J: 作业名称
#    -o: 标准输出stdout
#    -e: 标准错误stderr,不写-e,标准输出stdout和标准错误stderr合并到.ojobid文件中
#    -N: 请求的节点数目
#    -n: 请求的总核数,如果-N后为1,等同于--ntasks-per-node
#    -t: 时间限制
#    -p: 申请的分区
#    -w: 后面跟请求的指定节点名称
##############################################################################

#################脚本第二部分,定义要运行作业软件的环境变量#######################
# go to work dir
cd $SLURM_SUBMIT_DIR

module load gcc14.1.0
source $HOME/soft/gromacs/2024.3/bin/GMXRC.bash
###如果是跨节点,第一部分#SBATCH -N后面不是1而是大于1的整数;还有openmpi变量需声明
###使用多节点并行,下面2行openmpi的设置变量需把“#”去掉
#export PATH=$PATH:$HOME/soft/openmpi-4.1.6/bin
#export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/soft/openmpi-4.1.6/lib

########################脚本第三部分,运行作业的命令#############################

echo "Starting Gromacs run at" `date`

# The program we want to execute,根据自己的作业,主要修改的也是下面这一行
time gmx mdrun -ntomp $SLURM_NTASKS -v -deffnm cnt10
#如果是多节点并行计算,用"#"注释上一行,并使用下面的gmx_mpi,把下面1行的“#”去掉
#time mpirun -np $SLURM_NTASKS gmx_mpi mdrun -ntomp 1 -v -deffnm cnt10

echo "Finished Gromacs run at" `date`
使用sbatch cnt10.slurm提交作业。

Rank和Thread级别并行

这部分内容可参看GROMACS (2019.3 GPU版) 并行效率测试及调试思路,下面主要也是搬运,一是方便直接查看,二是防止帖子内容失效不能再查看。
Rank大概可以翻译成进程,和Processes等价,Thread就线程。Gromacs可以在线程和进程这两个层面上并行。一个Rank可以包含多个thread,在Gromacs并行时,如果使用Rank并行,会使用Domain Decompostion把体系切成小块,每块交给一个Rank去算,而在这个Rank中,多个Thread共同处理这一个小块。
Gromacs的几种并行方式:

  • 外部的mpirun并行(rank级别并行)
    需要安装openmpi,编译安装的时候加上-DGMX_MPI=on选项,编译产生的运行程序名默认是gmx_mpi,可以跨节点运行。实现方式是:
    mpirun -np 4 gmx_mpi mdrun
    
  • 内部thread-mpi并行(rank级别并行)
    Gromacs源码包含,编译时候默认支持,无法跨节点并行,无法和上面的mpirun并行同时使用,单节点运行时,比mpirun稍快,实现方式是:
    gmx mdrun -ntmpi 4
    
  • openmp并行(thread级别并行)
    Gromacs源码包含,编译时候默认支持,无法跨节点并行,可以和上面两种MPI并行同时使用,实现方式是:
    gmx mdrun -ntomp 4
    

总结:

###单节点运行时,通常采用2+3或者只用3的方式运行,运行方式是:
gmx mdrun -ntmpi 4 -ntomp 6           #4个MPI rank, 每个rank使用6个线程,运行时占用24个核

###跨节点运行时,通常采用1+3的方式运行,运行方式是:
mpirun -np 2 gmx_mpi mdrun -ntomp 6   #2个MPI rank, 每个rank使用6个线程,运行时占用12个核

参考

  1. GROMACS的安装方法(含全程视频演示);
  2. 使用Gromacs模拟碳纳米管的一个简单例子;
  3. GROMACS模拟实操:从PDB文件到运行mdrun;
  4. GROMACS (2019.3 GPU版) 并行效率测试及调试思路
本文阅读量  次
本站总访问量  次