计算化学公社

 找回密码 Forget password
 注册 Register
Views: 42773|回复 Reply: 163

[CP2K] docker-singularity方法安装可随意移植的cp2k

  [复制链接 Copy URL]

231

帖子

4

威望

2815

eV
积分
3126

Level 5 (御坂)

发表于 Post on 2021-10-16 23:02:03 | 显示全部楼层 Show all |阅读模式 Reading model
本帖最后由 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:
  1. curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
复制代码
  1. systemctl enable docker # 开机自动启动docker
  2. systemctl start docker # 启动docker
  3. systemctl restart docker # 重启dokcer
复制代码


安装singularity:
  1. yum install -y epel-release
  2. yum install -y singularity
复制代码

去官网下载最新的CP2K源代码包cp2k-8.2.tar.bz2并解压:
  1. tar jxf cp2k-8.2.tar.bz2
  2. cd cp2k-8.2/tools/toolchain
复制代码

构建镜像名为cp2k/toolchain的docker镜像,注意最后的点(.)
  1. docker build -t cp2k/toolchain .
复制代码
然后docker就会基于CP2K开发者写的Dockerfile在我们的系统上安装一个容器系统,并在容器系统内使用toolchain命令自动安装CP2K的组件。这里耗时最久,但是一定不会失败。如果运行到一半中止了也只可能是网络不够快,下载组件的安装包失败了而已,再次运行上述命令即可。

docker build命令完成后会输出类似以下的内容:
  1. ========================== usage =========================
  2. Done!
  3. Now copy:
  4.   cp /opt/cp2k-toolchain/install/arch/* to the cp2k/arch/ directory
  5. To use the installed tools and libraries and cp2k version
  6. compiled with it you will first need to execute at the prompt:
  7.   source /opt/cp2k-toolchain/install/setup
  8. To build CP2K you should change directory:
  9.   cd cp2k/
  10.   make -j 48 ARCH=local VERSION="ssmp sdbg psmp pdbg"

  11. arch files for GPU enabled CUDA versions are named "local_cuda.*"
  12. arch files for coverage versions are named "local_coverage.*"

  13. Note that these pre-built arch files are for the GNU compiler, users have to adapt them for other compilers.
  14. It is possible to use the provided CP2K arch files as guidance.
  15. Removing intermediate container 68b68474d16a
  16. ---> 68e78acf2465
  17. Successfully built 68e78acf2465
  18. Successfully tagged cp2k/toolchain:latest
复制代码
编译过CP2K的人都知道这个内容意味着CP2K的组件安装成功了,可以编译CP2K本体了。但要注意,CP2K的组件确实安装成功了,但是是在docker容器的系统内,所以要进容器里去编译。我们现在可以查看构建好的docker镜像,使用docker image ls
  1. $ docker image ls
  2. REPOSITORY       TAG       IMAGE ID       CREATED       SIZE
  3. cp2k/toolchain   latest    68e78acf2465   2 days ago    5.19GB
  4. ubuntu           20.04     597ce1600cf4   2 weeks ago   72.8MB
复制代码
可以看到名为cp2k/toolchain的镜像总大小5.19 G。且使用的基础镜像是ubuntu 20.04系统

========================================================================================
2021-10-17更新,原本我是通过上传和下载镜像将docker镜像转化singularity镜像,经abin老师提醒,可以直接在本地转格式。
  1. docker save 68e78acf2465 -o cp2k82.tar
复制代码
其中68e78acf2465是docker image ls查看到的IMAGE ID
把打包后的docker镜像转为singularity镜像:
  1. 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。
  1. singularity build --sandbox --tmpdir /home cp2k82/ cp2k82.sif
复制代码

运行结束会生成cp2k82/的目录,这就是一个sandbox形式的singularity容器,里面包含了一个操作系统。

复制cp2k-8.2.tar.bz2到sandbox的opt/目录里:
  1. cp cp2k-8.2.tar.bz2 /opt/cp2k82/opt/
复制代码


进入沙箱操作:
  1. [root@master /opt]# singularity shell -w cp2k82
  2. Singularity>
复制代码
可以看到[root@master /opt]#变成了Singularity>,代表我们成功进入了容器的系统,类似Vmware的虚拟机系统。
先给容器的系统安装vim:
  1. apt-get update
  2. apt-get install -y vim
复制代码
开始编译CP2K本体:
  1. cd /opt
  2. tar jxf cp2k-8.2.tar.bz2
  3. cp /opt/cp2k-toolchain/install/arch/* /opt/cp2k-8.2/arch/
  4. source /opt/cp2k-toolchain/install/setup
  5. cd /opt/cp2k-8.2
  6. make -j 24 ARCH=local VERSION="psmp"
复制代码

编译完成后test
  1. make -j 24 ARCH=local VERSION="psmp" test
复制代码
基本上一定会全部成功,系统都用的和官方一模一样的系统,我想不出任何产生"哪怕一个失败例子"的可能
  1. --------------------------------- Timings --------------------------------
  2. Plot: name="timings", title="Timing Distribution", ylabel="time [s]"
  3. PlotPoint: name="100th_percentile", plot="timings", label="100th %ile", y=60.61, yerr=0.0
  4. PlotPoint: name="99th_percentile", plot="timings", label="99th %ile", y=21.241800000000023, yerr=0.0
  5. PlotPoint: name="98th_percentile", plot="timings", label="98th %ile", y=13.995600000000014, yerr=0.0
  6. PlotPoint: name="95th_percentile", plot="timings", label="95th %ile", y=8.11, yerr=0.0
  7. PlotPoint: name="90th_percentile", plot="timings", label="90th %ile", y=5.516000000000008, yerr=0.0
  8. PlotPoint: name="80th_percentile", plot="timings", label="80th %ile", y=3.12, yerr=0.0

  9. --------------------------------- Summary --------------------------------
  10. Number of FAILED  tests 0
  11. Number of WRONG   tests 0
  12. Number of CORRECT tests 3459
  13. Total number of   tests 3459
  14. GREPME 0 0 3459 0 3459 X

  15. Summary: correct: 3459 / 3459; 15min
  16. Status: OK

  17. --------------------------------------------------------------------------
  18. Regtest took 896.00 seconds.
  19. --------------------------------------------------------------------------
  20. Thu Oct 14 13:26:40 CST 2021
  21. *************************** testing ended ********************************
复制代码
  1. vi /.singularity.d/env/91-environment.sh
复制代码

加入cp2k的环境变量,singularity容器里的/.singularity.d/env/91-environment.sh类似于真实linux系统中的~/.bashrc。添加以下内容:
  1. source /opt/cp2k-toolchain/install/setup
  2. export PATH=$PATH:/opt/cp2k-8.2/exe/local
  3. export CP2K_DATA_DIR=/opt/cp2k-8.2/data
复制代码
退出容器系统:
  1. exit
复制代码


现在就可以对容器内的CP2K实际测试一下了,在容器外运行容器内的CP2K,参考以下脚本:
  1. #!/bin/sh
  2. export EXE="singularity exec /opt/cp2k82"
  3. source /opt/intel2018/parallel_studio_xe_2018/psxevars.sh
  4. ## cpu cores
  5. export cpu_cores=24
  6. ulimit -s unlimited

  7. mpirun -np ${cpu_cores} ${EXE} cp2k.popt cp2k.inp 1>cp2k.out 2>cp2k.err
复制代码

测试完成,没有问题的话就可以把singularity打包为sif文件:
  1. singularity build --tmpdir /home cp2k82-1.sif cp2k82/
复制代码


把这个sif文件复制到任何机器上,只要CPU的最高指令集一致,都可以运行,且运行速度不会受到丝毫影响。打包后把运行脚本中的
  1. export EXE="singularity exec /opt/cp2k82"
复制代码
改为
  1. 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

参与人数
Participants 29
威望 +1 eV +121 收起 理由
Reason
amani73986 + 1 谢谢
Billhenry + 3
j5888xm + 5 谢谢
naoki + 5 谢谢
4ftermath + 4 赞!
天然呆 + 5
静哥哥 + 4 精品内容
fanzhi-qin + 4 谢谢!
qczgzly + 5 とてもいい!
chenjinfeng850 + 5 谢谢
zszguangdian + 4 谢谢
努力学习的小喻 + 3 谢谢分享
clwater + 5 谢谢
zorow + 5 GJ!
hyper233 + 5 GJ!
yydy + 1 牛!
xujc1983 + 5 牛!
dmh1998dmh + 5 好物!
昼夏の忧郁 + 5 你太可爱
ChemG + 5 牛!

查看全部评分 View all ratings

1852

帖子

1

威望

4098

eV
积分
5970

Level 6 (一方通行)

发表于 Post on 2021-10-17 09:25:33 | 显示全部楼层 Show all
建议修正一下,
学习一下 docker save。

docker push不是好方案。

既然是100%成功,
又采用的是默认Dockerfile ,
记录使用流程即可。

最后的镜像过大,不利于分享。

只要有Dockerfile
自己执行一下就搞定了。

官方也同时提供了MKL Cuda适配的Dockerfile,
自己运行一下指令就行了。

另,Docker Hub上,
应该可以找到好多小而美的GNU 版本的镜像。

【秒换系统 | Switch Linux OS Instantly-哔哩哔哩】https://b23.tv/R8Bd4n
singularity 的精髓应该在这里……

比如也可以用singularity 来给其他程序提供专用的系统。
比如给Multiwfn提供适配的操作系统……
比如打包一个可用的dushin 等

这里有示例,
https://gitee.com/hpc4you/linux
High-Performance Computing for You
为您专属定制的高性能计算解决方案

更多讯息,请访问:
App,  https://gitee.com/hpc4you/linux
hpc4you toolkit,  https://gitee.com/hpc4you/hpc
电邮hpc4you@163.com VX: hpc4you

231

帖子

4

威望

2815

eV
积分
3126

Level 5 (御坂)

 楼主 Author| 发表于 Post on 2021-10-17 12:34:24 | 显示全部楼层 Show all
abin 发表于 2021-10-17 09:25
建议修正一下,
学习一下 docker save。

感谢提醒。我之前就觉得转个格式应该没必要用网络的。
对于分享镜像,由于我自己的办公电脑就是个很普通的i5处理器,但是用的服务器有512指令集的且不联网,我相信很多人和我情况差不多,这就没办法docker得到avx-512的cp2k了,好在我自己是集群管理员。给计算节点开了网络才编译的,但是我觉得大多数人,无论是课题组集群的普通用户还是租用超算都没有这条件,干脆就送佛送到西了。

1852

帖子

1

威望

4098

eV
积分
5970

Level 6 (一方通行)

发表于 Post on 2021-10-17 13:58:37 | 显示全部楼层 Show all
djjj148 发表于 2021-10-17 12:34
感谢提醒。我之前就觉得转个格式应该没必要用网络的。
对于分享镜像,由于我自己的办公电脑就是个很普通 ...

可以采用按时付费的方式,
租用裸金属服务器,
啥样的硬件都能满足。

大概一个小时4元到20元。
用阿里香港,腾讯香港,
还不用担心github gitlab 被断开的事情。

有一次,我演示从系统最小安装,
采用intel套件编译vasp,
就是租用的阿里云服务器。

原来想着租用费用可能需要200元,
最后结算,只有18元。

合理租用高性能云服务做编译测试,
比买机器划算多了。
High-Performance Computing for You
为您专属定制的高性能计算解决方案

更多讯息,请访问:
App,  https://gitee.com/hpc4you/linux
hpc4you toolkit,  https://gitee.com/hpc4you/hpc
电邮hpc4you@163.com VX: hpc4you

877

帖子

36

威望

4803

eV
积分
6400

Level 6 (一方通行)

发表于 Post on 2021-10-17 18:45:35 | 显示全部楼层 Show all
"如果用的服务器/节点不联网或者没有root权限的话,在自己电脑上装Vmware的Linux虚拟机就行"
这句话没理解,如果自在自己电脑上装虚拟机,那就是在自己电脑上装cp2k了把。
那还是不能用服务器资源把?

132

帖子

0

威望

701

eV
积分
833

Level 4 (黑子)

发表于 Post on 2021-10-17 19:21:29 | 显示全部楼层 Show all
ggdh 发表于 2021-10-17 18:45
"如果用的服务器/节点不联网或者没有root权限的话,在自己电脑上装Vmware的Linux虚拟机就行"
这句话没理解 ...

楼主意思是,本地联网安装好,可以直接移植过去,环境软件打包后简单便携

1852

帖子

1

威望

4098

eV
积分
5970

Level 6 (一方通行)

发表于 Post on 2021-10-17 19:56:09 | 显示全部楼层 Show all
singularity 借用的是系统的硬件,
方案是类似硬件直通模式。
要的是处理器指令集……

不过,稍微仔细看点手册,
指定指令集做编译就行了,
和处理器关系不大……只不过要耗费很多的时间而已……等候更久。
High-Performance Computing for You
为您专属定制的高性能计算解决方案

更多讯息,请访问:
App,  https://gitee.com/hpc4you/linux
hpc4you toolkit,  https://gitee.com/hpc4you/hpc
电邮hpc4you@163.com VX: hpc4you

114

帖子

0

威望

767

eV
积分
881

Level 4 (黑子)

发表于 Post on 2021-10-18 14:28:45 | 显示全部楼层 Show all
请问一下用Ubuntu20.4打包的singularity,如果在red hat上跑,会出现kernal too old的错误吗?
我现在用的超算是red hat6,太难了。

231

帖子

4

威望

2815

eV
积分
3126

Level 5 (御坂)

 楼主 Author| 发表于 Post on 2021-10-18 15:08:48 | 显示全部楼层 Show all
flyingchow 发表于 2021-10-18 14:28
请问一下用Ubuntu20.4打包的singularity,如果在red hat上跑,会出现kernal too old的错误吗?
我现在用的 ...

singularity能正常使用就可以,和什么系统打包的singularity没有关系

114

帖子

0

威望

767

eV
积分
881

Level 4 (黑子)

发表于 Post on 2021-10-19 02:24:07 | 显示全部楼层 Show all
djjj148 发表于 2021-10-18 15:08
singularity能正常使用就可以,和什么系统打包的singularity没有关系

经过我的实测,red hat6是打不开您做的这个sif文件的,显示kernal too old的报错。但是red hat8就可以。我们麻省的超算现在正在进行痛苦的transition。
另外请问您的上传脚本里的“source /opt/intel2018/parallel_studio_xe_2018/psxevars.sh”是什么用意呢? 您提供的sif文件里好像没有这个文件夹。
谢谢您无私的教导。

114

帖子

0

威望

767

eV
积分
881

Level 4 (黑子)

发表于 Post on 2021-10-19 02:56:52 | 显示全部楼层 Show all
老师您好,我用您做的这个sif文件分别在我自己的电脑和超算上试了一下。我自己的电脑运行非常好,在超算上,首先red hat 6是直接报错的。在red hat 8中可以直接运行,但是算到中间也会报错,显示:
“application called MPI_Abort(MPI_COMM_WORLD, 0) - process 0
[unset]: write_line error; fd=-1 buf=:cmd=abort exitcode=0”


我把在我自己电脑上和在超算上的输出文件都上传了,老师们看看是什么问题,谢谢。

test.out

24.4 KB, 下载次数 Times of downloads: 3

test_cluster.out

11.05 KB, 下载次数 Times of downloads: 0

114

帖子

0

威望

767

eV
积分
881

Level 4 (黑子)

发表于 Post on 2021-10-19 03:12:17 | 显示全部楼层 Show all
flyingchow 发表于 2021-10-19 02:56
老师您好,我用您做的这个sif文件分别在我自己的电脑和超算上试了一下。我自己的电脑运行非常好,在超算上 ...

老师,我明白哪里错了,还是不同CPU的指令集不一样。

114

帖子

0

威望

767

eV
积分
881

Level 4 (黑子)

发表于 Post on 2021-10-19 04:20:23 | 显示全部楼层 Show all
djjj148 发表于 2021-10-18 15:08
singularity能正常使用就可以,和什么系统打包的singularity没有关系

在更换了您另一个指令集的sif文件之后,cp2k可以运行的。
但是在启动mpirun的时候,会出现一个错误:
“Singularity> mpirun -np 4 cp2k.popt test.inp |tee test.out        
/bin/sh: /opt/cp2k-toolchain/install/mpich-3.3.2/bin/hydra_pmi_proxy: No such file or directory”
找不到“hydra_pmi_proxy"。
这个错误似乎是因为这个sif里的hydra_pmi_proxy和节点上的冲突了。

114

帖子

0

威望

767

eV
积分
881

Level 4 (黑子)

发表于 Post on 2021-10-19 06:31:46 | 显示全部楼层 Show all
老师您多次说到了指令集的问题,我自己也感受到l了指令集不同运行的情况的确不同。但singularity打包的时候是怎么确定用哪种指令集的呢?谢谢。

231

帖子

4

威望

2815

eV
积分
3126

Level 5 (御坂)

 楼主 Author| 发表于 Post on 2021-10-19 08:24:34 | 显示全部楼层 Show all
本帖最后由 djjj148 于 2021-10-19 08:29 编辑
flyingchow 发表于 2021-10-19 06:31
老师您多次说到了指令集的问题,我自己也感受到l了指令集不同运行的情况的确不同。但singularity打包的时候 ...

Google Linux查看指令集

本版积分规则 Credits rule

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

GMT+8, 2023-2-2 22:27 , Processed in 0.398274 second(s), 25 queries .

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