计算化学公社

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

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

  [复制链接 Copy URL]

254

帖子

4

威望

4744

eV
积分
5078

Level 6 (一方通行)

本帖最后由 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 32
威望 +1 eV +132 收起 理由
Reason
Huschein + 5 谢谢分享
sigma-jlu + 4
ddddnight + 2
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 牛!

查看全部评分 View all ratings

166

帖子

0

威望

3347

eV
积分
3513

Level 5 (御坂)

172#
发表于 Post on 2024-1-10 23:04:30 | 只看该作者 Only view this author
本帖最后由 neocc 于 2024-1-16 14:59 编辑
wanlichuan 发表于 2023-10-29 10:48
neocc层主可能还没看到,自己解答一下吧。
找了很多方案都无法真正解决,只有下面的方法成功了:
1. Ad ...

centos8好像不能按照ubuntu的方法去修改
另外,wsl2不是grub的引导办法

125

帖子

0

威望

2054

eV
积分
2179

Level 5 (御坂)

171#
发表于 Post on 2023-10-29 10:48:46 | 只看该作者 Only view this author
neocc 发表于 2022-7-11 20:51
请问singlarity最近报错,提示
FATAL:   container creation failed: mount /proc/self/fd/3->/usr/local/ ...

neocc层主可能还没看到,自己解答一下吧。
找了很多方案都无法真正解决,只有下面的方法成功了:
1. Add `max_loop=256` to the `GRUB_CMDLINE_LINUX` value in `/etc/default/grub` (put it in between the " ")
2. Run `update-grub2` as root.
3. Reboot the system.
4. `cat /proc/cmdline` and verify `max_loop=256` is present.


参考网页(https://code-aster.org/forum2/viewtopic.php?id=26901

125

帖子

0

威望

2054

eV
积分
2179

Level 5 (御坂)

170#
发表于 Post on 2023-10-29 09:26:46 | 只看该作者 Only view this author
neocc 发表于 2022-7-11 20:51
请问singlarity最近报错,提示
FATAL:   container creation failed: mount /proc/self/fd/3->/usr/local/ ...

请问您这个问题解决了吗?我最近也遇到了同样的问题。谢谢。

103

帖子

0

威望

3829

eV
积分
3932

Level 5 (御坂)

169#
发表于 Post on 2023-8-4 14:55:01 | 只看该作者 Only view this author
本帖最后由 LittlePupil 于 2023-8-4 18:27 编辑
djjj148 发表于 2023-8-4 14:49
多节点并行,需要在主机上安装mpi,且保证该mpi和镜像中的一致,具体要求:
(1)mpi种类和版本一致
( ...

这个我有看到,目前我用和官方镜像相同的参数编译了gcc和mpich, 但多节点并行效率依然很低。

尝试按照您编译mpich的参数重新编译了一版(虽然两版mpich编译参数的区别仅在于“--with-device”选项),但并行效率依然没有改善,很遗憾。
顺便一提,您在原帖中的表述或许可以修改一下,只有在使用队列系统跑多节点并行任务时才需要自行编译MPI
「狩りってのは先に焦せった方の負けだ、ハンターも獲物もな」

254

帖子

4

威望

4744

eV
积分
5078

Level 6 (一方通行)

168#
 楼主 Author| 发表于 Post on 2023-8-4 14:49:38 | 只看该作者 Only view this author
LittlePupil 发表于 2023-8-4 14:16
您好,请问您的这个问题解决了吗?我尝试楼主分享的2023.1-avx2镜像以及官方提供的2023.1-generic及2023. ...

多节点并行,需要在主机上安装mpi,且保证该mpi和镜像中的一致,具体要求:
(1)mpi种类和版本一致
(2)编译mpi的参数一致
(3)编译mpi的gcc一致

cp2k-2023.1的docker-singularity安装方法
http://bbs.keinsci.com/forum.php ... 6&fromuid=15641
(出处: 计算化学公社)

103

帖子

0

威望

3829

eV
积分
3932

Level 5 (御坂)

167#
发表于 Post on 2023-8-4 14:16:41 | 只看该作者 Only view this author
wth1219 发表于 2021-12-20 16:16
老师们好,我在学校集群上测试时发现通过此方法得到的镜像文件在单节点(24核或80核)上运行效率优异,但多 ...

您好,请问您的这个问题解决了吗?我尝试楼主分享的2023.1-avx2镜像以及官方提供的2023.1-generic及2023.1-avx512镜像也遇到了同样的问题
「狩りってのは先に焦せった方の負けだ、ハンターも獲物もな」

181

帖子

0

威望

2199

eV
积分
2380

Level 5 (御坂)

166#
发表于 Post on 2023-3-24 23:27:09 | 只看该作者 Only view this author
请问这个报错是什么原因呢

202303242327004222..png (61.06 KB, 下载次数 Times of downloads: 59)

202303242327004222..png

181

帖子

0

威望

2199

eV
积分
2380

Level 5 (御坂)

165#
发表于 Post on 2023-3-24 22:30:42 | 只看该作者 Only view this author
ggdh 发表于 2021-10-26 22:17
感谢大佬提示,
最后的脚本里面singularity后面加个选项--bind "/home:/home" 就搞定了

请问具体如何加呢,这样么 singularity exec /root/software/cp2k2023.1.sif  mix_cp2k.inp --bind "/home:/root"

1

帖子

0

威望

17

eV
积分
18

Level 1 能力者

164#
发表于 Post on 2023-2-28 11:22:13 | 只看该作者 Only view this author
Yaochen 发表于 2022-9-19 20:48
楼主,第一步我就卡住了。这里显示spglib的安装包连接不上。一开始我以为是github被墙了,但是我fq之后,仍 ...

想问一下目前解决了吗,修改了github链接,但是还是不能安装,谢谢

2

帖子

0

威望

345

eV
积分
347

Level 3 能力者

163#
发表于 Post on 2022-10-31 11:07:41 | 只看该作者 Only view this author
太强了

93

帖子

1

威望

1399

eV
积分
1512

Level 5 (御坂)

162#
发表于 Post on 2022-10-20 12:21:54 | 只看该作者 Only view this author
wkq 发表于 2022-9-2 17:51
求助一下大家,有没有遇到过这种情况呀,感谢感谢

[root@localhost test]# mpirun -np 2 singularity ex ...

看看我上面的回复

93

帖子

1

威望

1399

eV
积分
1512

Level 5 (御坂)

161#
发表于 Post on 2022-10-20 11:44:08 | 只看该作者 Only view this author
wanlichuan 发表于 2022-8-5 14:02
我在centOS7.6系统中用楼主的方法编译cp2k9.1,前面都很顺利。一直到修改完/.singularity.d/env/91-environ ...

经过我多次的试错,终于总结出了正确调用容器执行任务的逻辑:当你使用 “singularity exec /opt/cp2k91.sif cp2k.popt cp2k.inp” 命令的时候,期望的是sif会读取当前目录下的cp2k.inp,然而此时sif实际是去容器内的路径去寻找这个文件的,这个帖子里所有报错说文件不存在的都是这个原因。看了前面的讨论,我把命令改成了“singularity exec --bind /opt:/opt /opt/cp2k91.sif cp2k.popt cp2k.inp” ,表示将host的/opt路径映射到容器内的/opt路径,这时文件不存在的报错不出现了,而是出现了层主这个报错,原因是此时sif内的opt路径已经被替换了,source的时候肯定会报错。说了一大堆,那么如何解决呢,就是随便新建一个不与上面所述的设置冲突的目录,然后再映射到sif内,例如:“singularity exec --bind /opt/test:/opt/test /opt/cp2k91.sif cp2k.popt cp2k.inp” ,问题就解决了。

1478

帖子

0

威望

4539

eV
积分
6017

Level 6 (一方通行)

160#
发表于 Post on 2022-10-19 10:03:32 | 只看该作者 Only view this author
喵喵喵??第一步就被劝退了,不支持发行版rocky
又菜又爱玩

166

帖子

0

威望

3347

eV
积分
3513

Level 5 (御坂)

159#
发表于 Post on 2022-10-7 23:07:47 | 只看该作者 Only view this author
请问楼主
1.如果想做QM/MM,是不是可以在install_cp2k_toolchain.sh里面修改Dockerfile,然后运行docker build -t cp2k/toolchain . (cp2k-2022.2\tools\toolchain\scripts\stage6 里面有plumed,新的2022.2安装逻辑都变了)
2.开启GPU加速对显卡类型有限制吗?install_cp2k_toolchain.sh里面只有 K20X, K40, K80, P100, V100 and no 这几个选项,20,30系列用不了吗
3.Dockerfile.cuda_mkl只有很少的代码,需要将Dockerfile.cuda_mkl整合进Dockerfile才能使用GPU吗


请参考:Gromacs与cp2k联动使用plumed做QM/MM增强采样(http://bbs.keinsci.com/thread-21783-1-1.html)

181

帖子

0

威望

2199

eV
积分
2380

Level 5 (御坂)

158#
发表于 Post on 2022-9-21 09:33:49 | 只看该作者 Only view this author
请问下,我把您分享的镜像cp2k2022.1_avx2.sif复制到singularity 的/opt中,然后执行./test.sh出现如下报错

FATAL:   could not open image /opt/cp2k2022.1_avx2.sif: failed to retrieve path for /opt/cp2k2022.1_avx2.sif: lstat /opt/cp2k2022.1_avx2.sif: no such file or directory

test.sh如下:
#!/bin/sh
export EXE="singularity exec /opt/cp2k2022.1_avx2.sif"
## cpu cores
export cpu_cores=24
ulimit -s unlimited

mpirun -np ${cpu_cores} ${EXE} cp2k2022.1_avx2.sif cp2k.inp 1>cp2k.out 2>cp2k.err

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

GMT+8, 2025-8-14 03:15 , Processed in 0.196334 second(s), 31 queries , Gzip On.

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