|
本帖最后由 djjj148 于 2021-10-18 09:57 编辑
1. 前言
CP2K的安装比较耗时且容易出错,相比于VASP,QE它太折腾了,但是它的功能和运行速度是真香。公社里已经有大量的帖子对CP2K的安装进行了讨论。
目前,在CP2K的使用和安装上大概有以下几种情况:
1. 预编译版的ssmp太慢,谁都不想用
2. 自己编译折腾太久且容易出错
3. 好不容易编译出来了,test的时候wrong太多,就算全correct了也不一定能正常使用,比如内存爆浆问题
4. 千辛万苦编译出能正常用的CP2K了,换了一个不太一样的机器还得折腾,因为CP2K对系统环境实在是太敏感了
5. 会编译的人还想编译出速度更快的CP2K
这个帖子能一次解决上述所有问题,总体思路:使用官方的Dockerfile文件在容器里安装CP2K的组件,得到docker镜像后转为singularity镜像编译CP2K本体。
对CP2K最熟悉且能让它稳定运行和跑得最快的人莫过于开发者,此方法能保证得到的CP2K和开发者优化过的完全一致,无论是系统环境还是编译参数等。而且,由于容器技术的优点,编译出来的CP2K可以直接复制到任何相同指令集的机器上即可运行,且速度和稳定性不会打一点折扣。由于个人兴趣,公社里有关编译CP2K的帖子我都看过且自己会动手编译,以安装出性能更优的CP2K。经测试,按照上述方法编译出来的CP2K确实比我编译/接触过的任何一个CP2K的运行速度都要快。还有一点很重要的是,上述方法也是极其省心的,完全不折腾,且成功率很难不是100%。
下面进行具体的操作。
2. docker-singularity方法安装CP2K
这个方法需要使用的Linux系统有网络且在root账户下操作,如果用的服务器/节点不联网或者没有root权限的话,在自己电脑上装Vmware的Linux虚拟机就行,因为是在容器里安装CP2K,是可以随意移植到"任意相同指令集的机器"上的。我用的系统是centos 7.6。
安装docker:
- curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
复制代码- systemctl enable docker # 开机自动启动docker
- systemctl start docker # 启动docker
- systemctl restart docker # 重启dokcer
复制代码
安装singularity:
- yum install -y epel-release
- yum install -y singularity
复制代码
去官网下载最新的CP2K源代码包cp2k-8.2.tar.bz2并解压:
- tar jxf cp2k-8.2.tar.bz2
- cd cp2k-8.2/tools/toolchain
复制代码
构建镜像名为cp2k/toolchain的docker镜像,注意最后的点(.)
- docker build -t cp2k/toolchain .
复制代码 然后docker就会基于CP2K开发者写的Dockerfile在我们的系统上安装一个容器系统,并在容器系统内使用toolchain命令自动安装CP2K的组件。这里耗时最久,但是一定不会失败。如果运行到一半中止了也只可能是网络不够快,下载组件的安装包失败了而已,再次运行上述命令即可。
docker build命令完成后会输出类似以下的内容:
- ========================== usage =========================
- Done!
- Now copy:
- cp /opt/cp2k-toolchain/install/arch/* to the cp2k/arch/ directory
- To use the installed tools and libraries and cp2k version
- compiled with it you will first need to execute at the prompt:
- source /opt/cp2k-toolchain/install/setup
- To build CP2K you should change directory:
- cd cp2k/
- make -j 48 ARCH=local VERSION="ssmp sdbg psmp pdbg"
- arch files for GPU enabled CUDA versions are named "local_cuda.*"
- arch files for coverage versions are named "local_coverage.*"
- Note that these pre-built arch files are for the GNU compiler, users have to adapt them for other compilers.
- It is possible to use the provided CP2K arch files as guidance.
- Removing intermediate container 68b68474d16a
- ---> 68e78acf2465
- Successfully built 68e78acf2465
- Successfully tagged cp2k/toolchain:latest
复制代码 编译过CP2K的人都知道这个内容意味着CP2K的组件安装成功了,可以编译CP2K本体了。但要注意,CP2K的组件确实安装成功了,但是是在docker容器的系统内,所以要进容器里去编译。我们现在可以查看构建好的docker镜像,使用docker image ls:
- $ docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- cp2k/toolchain latest 68e78acf2465 2 days ago 5.19GB
- ubuntu 20.04 597ce1600cf4 2 weeks ago 72.8MB
复制代码 可以看到名为cp2k/toolchain的镜像总大小5.19 G。且使用的基础镜像是ubuntu 20.04系统
========================================================================================
2021-10-17更新,原本我是通过上传和下载镜像将docker镜像转化singularity镜像,经abin老师提醒,可以直接在本地转格式。- docker save 68e78acf2465 -o cp2k82.tar
复制代码 其中68e78acf2465是docker image ls查看到的IMAGE ID
把打包后的docker镜像转为singularity镜像:
- singularity build --tmpdir /home cp2k82.sif docker-archive://cp2k82.tar
复制代码 由于这个过程中会生成较大的临时文件,系统默认的临时文件目录是/tmp,可能不够,会报错,这里用了--tmpdir参数将临时文件目录改为/home
这里解释一下为什么要转格式:
1. 虽然我们可以直接进入docker镜像的对应容器里编译CP2K本体。但是singularity镜像在超算等实际计算应用中更方便,因为它最大的优势就是使用时不需要root等特殊权限。
2. 相比于docker,singularity更简单,更好学,我也更熟悉后者。上传docker镜像是为了用singularity把它下载下来,这样镜像就会转为singularity镜像。
========================================================================================
等待转换完成后,把sif文件改成可更改的沙箱cp2k82,比如在/opt上操作,生成的沙箱就在/opt。
- singularity build --sandbox --tmpdir /home cp2k82/ cp2k82.sif
复制代码
运行结束会生成cp2k82/的目录,这就是一个sandbox形式的singularity容器,里面包含了一个操作系统。
复制cp2k-8.2.tar.bz2到sandbox的opt/目录里:
- cp cp2k-8.2.tar.bz2 /opt/cp2k82/opt/
复制代码
进入沙箱操作:- [root@master /opt]# singularity shell -w cp2k82
- Singularity>
复制代码 可以看到[root@master /opt]#变成了Singularity>,代表我们成功进入了容器的系统,类似Vmware的虚拟机系统。
先给容器的系统安装vim:
- apt-get update
- apt-get install -y vim
复制代码 开始编译CP2K本体:
- cd /opt
- tar jxf cp2k-8.2.tar.bz2
- cp /opt/cp2k-toolchain/install/arch/* /opt/cp2k-8.2/arch/
- source /opt/cp2k-toolchain/install/setup
- cd /opt/cp2k-8.2
- make -j 24 ARCH=local VERSION="psmp"
复制代码
编译完成后test
- make -j 24 ARCH=local VERSION="psmp" test
复制代码 基本上一定会全部成功,系统都用的和官方一模一样的系统,我想不出任何产生"哪怕一个失败例子"的可能- --------------------------------- Timings --------------------------------
- Plot: name="timings", title="Timing Distribution", ylabel="time [s]"
- PlotPoint: name="100th_percentile", plot="timings", label="100th %ile", y=60.61, yerr=0.0
- PlotPoint: name="99th_percentile", plot="timings", label="99th %ile", y=21.241800000000023, yerr=0.0
- PlotPoint: name="98th_percentile", plot="timings", label="98th %ile", y=13.995600000000014, yerr=0.0
- PlotPoint: name="95th_percentile", plot="timings", label="95th %ile", y=8.11, yerr=0.0
- PlotPoint: name="90th_percentile", plot="timings", label="90th %ile", y=5.516000000000008, yerr=0.0
- PlotPoint: name="80th_percentile", plot="timings", label="80th %ile", y=3.12, yerr=0.0
- --------------------------------- Summary --------------------------------
- Number of FAILED tests 0
- Number of WRONG tests 0
- Number of CORRECT tests 3459
- Total number of tests 3459
- GREPME 0 0 3459 0 3459 X
- Summary: correct: 3459 / 3459; 15min
- Status: OK
- --------------------------------------------------------------------------
- Regtest took 896.00 seconds.
- --------------------------------------------------------------------------
- Thu Oct 14 13:26:40 CST 2021
- *************************** testing ended ********************************
复制代码- vi /.singularity.d/env/91-environment.sh
复制代码
加入cp2k的环境变量,singularity容器里的/.singularity.d/env/91-environment.sh类似于真实linux系统中的~/.bashrc。添加以下内容:
- source /opt/cp2k-toolchain/install/setup
- export PATH=$PATH:/opt/cp2k-8.2/exe/local
- export CP2K_DATA_DIR=/opt/cp2k-8.2/data
复制代码 退出容器系统:
现在就可以对容器内的CP2K实际测试一下了,在容器外运行容器内的CP2K,参考以下脚本:- #!/bin/sh
- export EXE="singularity exec /opt/cp2k82"
- source /opt/intel2018/parallel_studio_xe_2018/psxevars.sh
- ## cpu cores
- export cpu_cores=24
- ulimit -s unlimited
- mpirun -np ${cpu_cores} ${EXE} cp2k.popt cp2k.inp 1>cp2k.out 2>cp2k.err
复制代码
测试完成,没有问题的话就可以把singularity打包为sif文件:
- singularity build --tmpdir /home cp2k82-1.sif cp2k82/
复制代码
把这个sif文件复制到任何机器上,只要CPU的最高指令集一致,都可以运行,且运行速度不会受到丝毫影响。打包后把运行脚本中的
- export EXE="singularity exec /opt/cp2k82"
复制代码 改为
- export EXE="singularity exec /opt/cp2k82-1.sif"
复制代码 即可运行。
3. 后记
3.1. 经测试,该镜像中的CP2K的运行速度比“我自己编译的最快的intel-CP2K”还快8%-9.5%。
PS:由于cp2k本身计算速度就太快,特意选的较大体系(使用OT算法每个电子步的循环用时4.7, 2.5, 2.4s)测试,小体系的话(2.1, 1.0, 1.1s)就看不出区别。
3.2. cp2k-8.2版本有bug,要在inp文件里加上PREFERRED_DIAG_LIBRARY SL,但是对比后发现,以docker编译的CP2K加和不加这个参数都一样快,具体如下:
&GLOBAL
...
PREFERRED_DIAG_LIBRARY SL
&END GLOBAL
3.3. 如果在本地自己用toolchain编译cp2k,在做频率计算的时候cp2k.out文件可能会提示:
“ this binary cannot exploit all extensions of this CPU model (x86_avx2).”
这是因为在本地用toolchain编译的cp2k组件(注意这里指的是cp2k的组件,如plumed和sirius等,不是指CP2K本体)没有基于CPU的最高指令集进行优化。这会导致在做频率计算的时候速度不如优化后的cp2k。
但是如果用官方的docker编译,就不会出现这样的提示,意味着对于频率计算,容器内的cp2k更快。经测试,对于我研究的体系,频率任务的运行速度会快12%-19%
4. 总结
4.1. 本文使用了官方的Dockerfile进行CP2K的编译,相比于自己用toolchain脚本在本地编译,可以说是傻瓜式操作了。该方法唯一的缺点就是需要等待的时间比较久,但是好在不折腾,100%成功(我实在想不出怎样可以失败),而且编译一次就几乎一劳永逸了,除非官方出新版本。
4.2. 本帖涉及到一些容器操作,限于篇幅不对相应命令做过多说明,可自行在网上搜索学习。
4.3. docker-singularity方法不是专为CP2K而订做,很多软件的源代码包里都有Dockerfile文件,比如,Pyscf,你品你细品。
4.4. 为了方便大家使用CP2K,我把编译好CP2K的singularity镜像分享出来,对应目前最新的8.2版本,有avx2和avx512指令集两种。但是对于CP2K这样的优秀软件,更新会很频繁,我的镜像早晚会过时,学会钓鱼才不会担心没鱼吃哟。
链接:https://pan.baidu.com/s/12q4oGGNKE_s_vh5vfZSPGQ
提取码:aran
|
评分 Rate
-
查看全部评分 View all ratings
|