计算化学公社

 找回密码 Forget password
 注册 Register
Views: 2601|回复 Reply: 10
打印 Print 上一主题 Last thread 下一主题 Next thread

[CP2K] 计算集群上CP2K 2024.1多进程多线程并行测试分子动力学的性能分析

[复制链接 Copy URL]

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

跳转到指定楼层 Go to specific reply
楼主
本帖最后由 Uus/pMeC6H4-/キ 于 2024-12-15 15:26 编辑

计算集群上CP2K 2024.1多进程多线程并行测试分子动力学的性能分析

前帖提到,在某Slurm集群上安装并行版CP2K 2024.1之际,调用集群自带OpenMPI模块会使COSMA包安装报错,通过--with-openmpi=install自行另装OpenMPI可解决,后续编译正常完成。但此操作引入的非原装OpenMPI 4.1.5能否合理分配集群计算资源仍需考量,故秉承第一性原理培训讲义“用psmp版时若恰当搭配MPI进程和OpenMP线程数,可能性能高于popt版,但怎么搭配效率最高需要针对具体任务和计算机做测试”的精神,欲观察分子动力学模拟每步耗时来测试性能。

取一预平衡毕水溶液.xyz结构(1K+1Cl+50H2O)(编辑:应实验室要求确认此结构和下文涉及的结构为合理的简化模型),采取DFT-D3校正的PBE泛函,结合DZVP-MOLOPT-SR-GTH基组、相应的GTH赝势及800 Ry截断能,开展NVT系综下CSVR热浴控温360 K的分子动力学模拟,把氢原子质量设为2,计划以1 fs/步跑500步。以上输入文件和设置固定,仅改变psmp版任务提交脚本的资源分配设定。在其他非Slurm集群上以56核跑此任务可正常完成,平均22.21秒每步,而本Slurm集群上用56核心、每核心1个线程跑的速度与之相当。这一耗时勉强满足实际需要,希望增加计算资源进一步优化。

已知此Slurm集群每个节点均有两个分区,其中一个处理计算队列;用sinfo查知每分区有2个插槽、每插槽56个核心、每核心2个线程、每分区总内存500 GB(由112个核心平分),ulimit返回unlimited。以下脚本中用#SBATCH书写Slurm集群的资源分配参数时,选112的若干因子作为进程数$NP,(112/$NP)作为每进程分配线程数$NT,不开启超线程而设核心数$NC与$NT相等,Slurm系统自动按$NC分配内存。

用自行另装的OpenMPI的mpirun指令时,参考第一性原理培训讲义和此帖消除某警告的设置写作
  1. mpirun --mca btl "^openib" -np $NP -x OMP_NUM_THREADS=$NT cp2k.psmp -i md.inp -o md.out
复制代码

结果发现耗时过长,只得提前中断。已跑的步数和最终平均每步耗时如下,耗时随进程数增加先降后升的趋势符合预期。

  1. $NP $NT steps tavg
  2. 001 112 0054 864.4
  3. 002 056 0107 438.6
  4. 004 028 0319 148.5
  5. 008 014 0500 85.91
  6. 016 007 0500 81.48
  7. 028 004 0176 269.0
  8. 056 002 0060 787.0
  9. 112 001 0002 22546
复制代码


用Slurm集群的内置srun指令时,因资源分配设定已存在,直接写作
  1. srun cp2k.psmp -i md.inp -o md.out
复制代码

结果截然不同,耗时随进程数增加而减少且明显低于mpirun指令,但进程数较少时出现各种报错而异常终止。

  1. $NP $NT steps tavg error
  2. 001 112 0043 562.7 SCF not converged
  3. 002 056 0037 291.2 Segmentation fault
  4. 004 028 0076 147.9 KS energy is an abnormal value
  5. 008 014 0500 91.84 -
  6. 016 007 0500 47.78 -
  7. 028 004 0500 30.29 -
  8. 056 002 0500 19.63 -
  9. 112 001 0500 16.43 -
复制代码

另外,前述mpirun中消除的警告在此处用srun时出现,且出现次数与核心数相等。

鉴于srun亦可执行其他bash脚本,试图将任务提交脚本一拆为二,使sbatch直接提交的脚本包含集群资源分配设定和srun指令,srun执行的另一脚本则如前文般写mpirun指令。结果耗时仍然过长,进程数较多时出现各种报错而异常终止,明显不如单纯mpirun指令那样稳定。

评分 Rate

参与人数
Participants 1
eV +8 收起 理由
Reason
sobereva + 8

查看全部评分 View all ratings

√546=23.36664289109

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

2#
 楼主 Author| 发表于 Post on 2024-7-27 01:25:17 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2024-7-27 01:34 编辑

说明一下,这帖虽然显示刚刚审核通过,但是一些内容从五天之前就开始写了。当时写了一半保存草稿,发现已经确定了帖子编号和日期,可以编辑标题和文字但是不能删除。后来又添加了一些细节,思索再三才决定昨天发出来。要是帖子能预览显示效果的话不存草稿本来也行的,现在延迟发布草稿的副作用之一就是把还没人看到的新帖子埋没到第三页。再考虑到原帖已经比较冗长,所以另发个回复顶顶\)(/

说实话这次性能分析结果并不理想。怀疑自行编译OpenMPI或者CP2K时有所疏漏,使mpirun指令运行时并未真正适配Slurm集群的资源分配,导致总体被严重拖慢。另一边内置srun指令运行的速度倒是够快,但是每步耗时随进程数增加、线程数减少而单调减少的趋势感觉不像“恰当搭配进程和线程数”那种耗时先增后减的样子;进程数较少时出的几个无规律错误似乎表明线程间共享数据不太顺畅,又与本Slurm集群的手册所写的“支持多进程多线程混合并行分配资源的设置”对不太上。目前就等一个解释,再看看后续怎么操作。
√546=23.36664289109

94

帖子

0

威望

1051

eV
积分
1145

Level 4 (黑子)

3#
发表于 Post on 2024-7-27 15:06:36 | 只看该作者 Only view this author
OpenMP并行的时候,只有在非常多核心的情况下才有性能提高。

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

4#
 楼主 Author| 发表于 Post on 2024-9-11 11:41:59 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2024-9-11 11:52 编辑

哎,其实要加速分子动力学模拟,分配集群计算资源只是一方面,编写输入文件也很重要。在相同的集群和CP2K版本上,同样是分配112个进程、每进程1个线程、不开超线程、用srun指令运行,仍可把平均每步模拟的耗时压缩近一半。

查CRC手册找到溶液的数据后,用packmol构建接近现实密度的结构。在与分子动力学模拟相同的计算级别和资源分配下先做结构的几何优化,这样既能消除不合理的原子接触,又能产生-RESTART.wfn波函数信息和.restart文件给分子动力学模拟启动时原位读取。另外,根据CP2K手册对长时间AIMD模拟的建议,还在&GLOBAL字段下添加了FFTW_PLAN_TYPE PATIENT设置。

如此操作后,对一个新建的1K+1Cl+55H2O结构,即使采用比原先更高的1200 Ry截断能,也能在温度还未稳定的预平衡阶段就达到平均每步11秒的速度。另一个1K+1Cl+100H2O的结构则可在预平衡达平均每步19秒,与之前分子数更少的结构相当。虽然这类结构的几何优化大约需要两三个小时,但从后续的加速来看很划算;若减小截断能、放宽收敛限或可进一步压缩。

编辑:原帖就氢原子的问题稍微修改了一下。实际计算中,只是在CP2K的&FORCE/&SUBSYS/&KIND H里设置氢的质量为2当成氘,这是为了配合1 fs/步的大步长。构建初始结构时还是按普通的水而非重水来查溶液数据确定密度。
√546=23.36664289109

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

5#
 楼主 Author| 发表于 Post on 2024-10-12 20:19:27 | 只看该作者 Only view this author
悲报:这个计算速度在实验室同学眼里太慢了(汗)

他们在同一超算平台用的CP2K是9.1版,来自一个几年前编译好程序后做的压缩包,编译具体步骤的记录不好找到。我感觉太古老了,就趁着参加第一性原理培训的机会从头走了一遍2024.1版的安装流程,当时还自己配置依赖库解决了一些故障,具体看一楼所说的前帖的链接。

组会汇报时同学发现计算进度的问题,找出先例:一个Na一个OH和109个H2O的体系用相同泛函、赝势基组和高达2000 Ry的截断能做分子动力学,平衡后在那个9.1版的CP2K里一步约17.1秒。把这个NaOH水溶液的输入文件拷过来用我装的2024.1版算,SCF还是相同迭代步数后收敛且能量等数据也一致,但一步的时间拖到了25秒。

考虑到超算平台对单个任务限时一周,为了获得足够长的MD轨迹还是需要继续优化速度。如何排查问题?
√546=23.36664289109

158

帖子

2

威望

3556

eV
积分
3754

Level 5 (御坂)

6#
发表于 Post on 2024-10-13 12:54:03 | 只看该作者 Only view this author
使用 OpenMPI 的话试试 srun --mpi=pmix_v*,集群具体支持的pmix 版本用 srun --mpi=list 查看。

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

7#
 楼主 Author| 发表于 Post on 2024-10-16 23:38:44 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2024-10-17 14:17 编辑
Santz 发表于 2024-10-13 12:54
使用 OpenMPI 的话试试 srun --mpi=pmix_v*,集群具体支持的pmix 版本用 srun --mpi=list 查看。

之前查slurm系统srun指令的手册时也看到了,srun --mpi=list可以查看配备的MPI版本,默认为none,但还有cray_shasta, pmi2, pmix, pmix_v2这几个选项。OpenMPI里面支持PMIx。

测试发现用srun指令运行cp2k.psmp时,--mpi=pmix和--mpi-pmix_v2大致相当,比--mpi=none平均每步耗时短一点点,但仍然不能达到那个古老的9.1版的速度。(据github的某个issue ,建议环境变量加一条export PMIX_MCA_psec=^munge 以消除有关psec框架下munge组件找不到的报错。)

(这段是后面编辑添加的)用古老的9.1版执行cp2k.psmp -v,输出结果为

  1. CP2K version 9.1
  2. Source code revision git:d8d7100
  3. cp2kflags: omp fftw3 libxc parallel mpi3 scalapack cosma xsmm plumed2 spglib mkl libvori libbqb
  4. compiler: Intel(R) Fortran Intel(R) 64 Compiler Classic for applications running on Intel(R) 64, Version 2021.7.0 Build 20220726_000000
  5. compiler options:
  6.    -I/opt/system/app/intel/2022.3/mpi/2021.7.0/include -I/opt/system/ap
  7.    p/intel/2022.3/mkl/2022.2.0/include -I/opt/system/app/intel/2022.3/m
  8.    kl/2022.2.0/include/fftw -I/home/yyyyyy/make/cp2k-9.1/tools/toolch
  9.    ain/install/libxc-5.1.7/include -I/home/yyyyyy/make/cp2k-9.1/tools
  10.    /toolchain/install/libxsmm-1.17/include -I/home/yyyyyy/make/cp2k-9
  11.    .1/tools/toolchain/install/COSMA-2.5.1/include -I/home/yyyyyy/make
  12.    /cp2k-9.1/tools/toolchain/install/spglib-1.16.2/include -I/home/yyyy
  13.    yy/make/cp2k-9.1/src/start/ -I/home/yyyyyy/make/cp2k-9.1/obj/loc
  14.    al/psmp/exts/dbcsr -I/opt/system/app/intel/2022.3/mpi/2021.7.0//incl
  15.    ude -I/opt/system/app/intel/2022.3/mpi/2021.7.0/include -c -fopenmp
  16.    -nofor-main -xHost -m64 -D__LIBXSMM -D__parallel -D__MKL -D__PLUMED2
  17.     -D__FFTW3 -D__SCALAPACK -D__LIBXC -D__COSMA -D__SPGLIB -D__LIBVORI
  18.    -D__COMPILE_ARCH="local" -D__COMPILE_DATE="Mon May 22 19:29:07 JST 2
  19.    023" -D__COMPILE_HOST="yy" -D__COMPILE_REVISION="git:d8d7100"
  20.    -D__DATA_DIR="/home/yyyyyy/make/cp2k-9.1/data" -D__SHORT_FILE__="s
  21.    tart/cp2k.F"
复制代码


其中有一个mpi3,不知道属于Intel MPI还是Open MPI。这里面也没有elpa库。

我怀疑这个计算集群对单个用户通过toolchain另外下载安装的Open MPI支持不佳,而对某个系统已有的MPI支持更好;用module avail看到其中大部分是Intel MPI,Open MPI有4.1.5_intel-2022.3版的。然而除了用toolchain装的这个Open MPI,尚未有其他MPI成功编译CP2K的经验,需要多尝试几下。
√546=23.36664289109

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

8#
 楼主 Author| 发表于 Post on 2024-10-22 19:00:17 | 只看该作者 Only view this author
本帖最后由 Uus/pMeC6H4-/キ 于 2024-10-22 19:12 编辑
组会汇报时同学发现计算进度的问题,找出先例:一个Na一个OH和109个H2O的体系用相同泛函、赝势基组和高达2000 Ry的截断能做分子动力学,平衡后在那个9.1版的CP2K里一步约17.1秒。把这个NaOH水溶液的输入文件拷过来用我装的2024.1版算,SCF还是相同迭代步数后收敛且能量等数据也一致,但一步的时间拖到了25秒。

破案了,这个速度差异大部分源自计算集群上不同配置的节点的选择(笑哭)虽然节点都在用同代Intel Xeon的CPU,但是有的节点注重高内存容量、有的注重高内存带宽。先例中平均17.1秒的速度其实是在内存带宽高的节点跑出来的,在今天之前都没注意到而交到另一个节点了。

现在重新到高内存带宽的节点提交用此输入文件算100步的任务(注意这里的体系和1楼相比原子数多了一倍,原子种类和截断能亦不同),同样是112核并行,几个CP2K的平均每步速度都从5楼的25秒多降低到17秒多。由于没有初猜,第一步SCF迭代轮数较多,故比较100步总的耗时。

GCC 8.5.0 + OpenMPI 4.1.5的CP2K 2024.1(这帖写的),36分18秒
Intel OneAPI 2022.3 classic compiler + Intel MPI的CP2K 2024.1(这帖写的),34分01秒
Intel OneAPI 2023.2 classic compiler + Intel MPI的CP2K 2024.1(类似上一个),33分38秒
古老的CP2K 9.1,32分26秒

剩下一点速度差异不清楚是否来自CP2K版本更新的代码变化。另外也能看出,用Intel编译器和MPI安装CP2K虽然很折腾,但能比GCC/OpenMPI的快一些。Intel的坑可能有两个:(1)toolchain除了写--with-intel=system外还要加上--with-intel-classic=yes,指定采用经典编译器(icc, icpc)而不是新版编译器(icx, icpx);(2)toolchain默认--with-elpa=install,安装ELPA库时可能会抱怨“Your MPI implementation does not provide a sufficient threading level for OpenMP”,我按照ELPA安装指导提到的解决方案三修改toolchain文件夹下scripts/stage5/install_elpa.sh添加选项重新安装可以(暂时)解决。
√546=23.36664289109

266

帖子

0

威望

937

eV
积分
1203

Level 4 (黑子)

9#
发表于 Post on 2025-1-20 22:05:02 | 只看该作者 Only view this author
我不是很懂超算。我用mpirun提交任务。我的体系1Fe+400多个H,O,N+2个Br,24个核是每帧20s,48个核是15s的样子。PBE/DZVP-MOLOPT-SR-GTH (D3BJ),截断能300。用的是学校超算

894

帖子

3

威望

1684

eV
积分
2638

Level 5 (御坂)

傻傻的木瓜

10#
 楼主 Author| 发表于 Post on 2025-1-20 22:54:31 | 只看该作者 Only view this author
ljh123 发表于 2025-1-20 22:05
我不是很懂超算。我用mpirun提交任务。我的体系1Fe+400多个H,O,N+2个Br,24个核是每帧20s,48个核是15s的样 ...

怎么翻出这帖来了……研究进展早已不允许我再折腾不同编译方法了,目前用的CP2K是Intel OneAPI的编译器及MPI安装的,mpirun提交前先module load加载相应的Intel模块。最近跑的一个简单无机钾盐稀溶液有132个水分子,在800 Ry截断能下平均一步36秒左右。这是8楼说的高内存容量的节点上用112核并行跑的结果,另一个节点虽然能计算更快但实测会超出内存。

不知道你的研究内容对能量和受力的计算精度要求如何,反正在我这300 Ry是肯定不够的,不便降低截断能来提速。
√546=23.36664289109

266

帖子

0

威望

937

eV
积分
1203

Level 4 (黑子)

11#
发表于 Post on 2025-1-20 23:27:52 | 只看该作者 Only view this author
本帖最后由 ljh123 于 2025-1-20 23:29 编辑

我主要是考虑到成本,因为在做元动力学模拟构建自由能面。我看了些文献,用的也基本是300左右。感觉你这似乎确实有点慢,我们学校超算的配置是:双路AMDEPYC965496核 CPU,每节点共192核 768GDDR5内存,基频2.4G。提交任务前我也是module学校超算安装好的openmpi/4.1.5

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-15 22:06 , Processed in 0.176767 second(s), 22 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list