本帖最后由 djjj148 于 2023-1-16 12:43 编辑
一、前言
之前写过相关的帖子:
docker-singularity方法安装可随意移植的cp2k
http://bbs.keinsci.com/forum.php?mod=viewthread&tid=25773&fromuid=15641
CP2K-singularity镜像分享
http://bbs.keinsci.com/forum.php?mod=viewthread&tid=30907&fromuid=15641
(出处: 计算化学公社)
温馨提示:阅读此贴前请务必先阅读前两个帖子,帖子里提到过docker-singularity安装方法的普适性、重要性、可移植性、相关概念、操作注释等关键内容。
以下是一些FAQ。
Q:之前的帖子已经比较详细的记录了安装方法,还有必要重新开一个帖子吗?
A:有,因为官方在最新的2023.1版本中更新了一些安装方法,且有一些没有提到的细节和新的坑值得记录和分享。
Q:官方会上传docker镜像,我们直接pull就好了,为什么还要学习安装?
A:理由如下,
1. 因为要追求稳健,官方给的镜像在某些方面上有优化的空间(下文会详细讲)。
2. docker镜像无法在主流的超算平台中使用,比如slurm队列。需要将其转换为singularity镜像,这其中有一些细节和坑值得分享。
3. docker-singularity方法普适性极强,学会了这个对于其他软件的安装有很大帮助。此方法可能看似复杂,实则是很套路化的方法。理解每一个安装步骤后,安装其他软件会非常简单和省心。
同时,此方法编译出来的软件是开发者亲自优化过的,速度最快,bug最少。如果直接pull镜像的话,可能会遇到坑。
4. 官方发布新版本的源代码后,要隔好一段时间才上传镜像,有些版本甚至都不会上传。学会此方法可以更快的尝鲜。
二、安装过程
1. 解压CP2K安装包,进入其中的tools/docker目录
2. 对于2023.1版本,运行build_dockerhub_images.sh即可生成docker image(需要安装docker) 但是要小心,2023.1版本中,build_dockerhub_images.sh脚本里使用的是Dockerfile.prod_generic_psmp,它会在运行install_cp2k_toolchain.sh脚本时添加--target-cpu=generic参数,这个是一个追求稳健的做法,但是会导致程序在编译时不会根据当前CPU的最高指令集对编译过程进行优化,最终引起编译出来的CP2K较慢。而且在跑CP2K的时候,每一步电子步都会有警告,看着很难受(官方的docker镜像也是这样的情况)。
如果生成镜像的机器的CPU和要运行镜像的CPU拥有同样的最高指令集,用Dockerfile.prod_psmp即可解决速度慢和反复警告的问题。 具体做法是把build_dockerhub_images.sh中的Dockerfile.prod_generic_psmp改成Dockerfile.prod_psmp 但是要注意,如果两个机器的CPU的最高指令集不一样,比如前者最高支持avx2,后者支持到avx512,也可能会被反复警告。 此时建议找一个支持512指令集的机器生成镜像,可以考虑租用云服务器。实在不行用Dockerfile.prod_generic_psmp凑合也可以。
3. 根据自己的情况修改好build_dockerhub_images.sh后运行之。脚本会在当前系统上安装一个ubuntu的容器系统,并在里面完成相关软件包的下载和编译、CP2K的编译和测试。 PS:有些安装包需要到github上下载,这需要使用一些科学手段。
4. 脚本运行完成后,会生成一个CP2K的docker image镜像
将其保存到当前目录并命名为cp2k-2023.1.tar: - docker save 8cb745f97725 -o cp2k-2023.1.tar
复制代码
5. 将cp2k-2023.1.tar转为singularity的sandbox: - singularity build --sandbox cp2k-2023.1 docker-archive://cp2k-2023.1.tar
复制代码
6. 进入该sandbox进行一些必要的设置: - singularity shell -w cp2k-2023.1
复制代码
7. 首先查看gcc版本,对于2023.1,用的是gcc-11.3.0:
8. 给容器的系统安装vim: - apt-get update && apt-get install -y vim
复制代码
9. 设置环境变量: - vi /.singularity.d/env/91-environment.sh
复制代码
添加以下内容: - source /opt/cp2k-toolchain/install/setup
- export PATH=$PATH:/opt/cp2k/exe/local
- export CP2K_DATA_DIR=/opt/cp2k/data
复制代码
退出:
10. 将cp2k-2023.1压缩成singularity镜像: - singularity build cp2k-2023.1.sif cp2k-2023.1
复制代码
11. 【可选的操作】 如果使用类似slurm的队列系统来运行CP2K,尤其是多节点并行,需要在主机上安装mpi,且保证该mpi和镜像中的一致,具体要求: (1)mpi种类和版本一致 (2)编译mpi的参数一致 (3)编译mpi的gcc一致 gcc版本我们刚才已经看过了,是11.3.0。进入容器,查看mpi的种类、版本和编译参数:
可以看到官方镜像使用的是mpich-4.0.3,编译参数也一目了然。 按照这些信息在主机上先编译gcc-11.3.0,再用该gcc编译mpich即可。
编译gcc参考: 解压gcc-11.3.0源代码包 - cd gcc-11.3.0
- ./contrib/download_prerequisites
- mkdir build && cd build
- ../configure --prefix=/public/opt/gcc-11.3.0/ --enable-checking=release--enable-languages=c,c++,fortran --disable-multilib && make -j 24 && make install
复制代码
#加载gcc-11.3.0的环境变量 - export PATH=/public/opt/gcc-11.3.0/bin:$PATH
- export LD_LIBRARY_PATH=/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64
- export LD_LIBRARY_PATH=/public/opt/gcc-11.3.0/lib64:$LD_LIBRARY_PATH
复制代码
编译mpich参考: 解压源代码包并进入解压出的目录 - ./configure '--disable-option-checking' '--prefix=/public/home/tom/opt/mpich-4.0.3' '--libdir=/public/home/tom/opt/mpich-4.0.3/lib' 'MPICC=' 'FFLAGS=-O2 -fPIC -fno-omit-frame-pointer-fopenmp -g -mtune=generic -fbacktrace -fallow-argument-mismatch ' 'FCFLAGS=-O2-fPIC -fno-omit-frame-pointer -fopenmp -g -mtune=generic -fbacktrace-fallow-argument-mismatch ' '--without-x' '--enable-gl=no' '--with-device=ch3''CC=/public/opt/gcc/11.3.0/bin/gcc' 'CFLAGS=-O2-fPIC -fno-omit-frame-pointer -fopenmp -g -mtune=generic ' 'LDFLAGS=' 'CXX=/public/opt/gcc/11.3.0/bin/g++' 'CXXFLAGS=-O2 -fPIC-fno-omit-frame-pointer -fopenmp -g -mtune=generic ' 'FC=/public/opt/gcc/11.3.0/bin/gfortran' 'F77=/public/opt/gcc/11.3.0/bin/gfortran''--cache-file=/dev/null' '--srcdir=.' 'LIBS=' 'CPPFLAGS= '
- make -j24
- make install
复制代码
运行CP2K的slurm脚本参考: - #!/bin/bash
- #SBATCH -J cp2k_2023.1
- #SBATCH -p P1
- #SBATCH --nodes=1
- #SBATCH --ntasks-per-node=36
- export EXE="singularity exec /public/opt/cp2k/cp2k2023.1.sif"
- ulimit -s unlimited
- #gcc-11.3.0
- export PATH=/public/opt/gcc/11.3.0/bin:$PATH
- export LD_LIBRARY_PATH=/lib:/lib64:/usr/lib:/usr/lib64:/usr/local/lib:/usr/local/lib64
- export LD_LIBRARY_PATH=/public/opt/gcc/11.3.0/lib64:$LD_LIBRARY_PATH
- #mpich-4.0.3
- export MPI_HOME=/public/home/tom/opt/mpich-4.0.3
- export PATH=$MPI_HOME/bin:$PATH
- export PATH=$PATH:$MPI_HOME/include
- export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$MPI_HOME/lib
- export MANPATN=$MANPATH:$MPI_HOME/man
- mpirun -np $SLURM_NPROCS ${EXE} cp2k.popt cp2k.inp 1>cp2k.out 2>cp2k.err
复制代码
12. 如果不用slurm等类似的队列,想直接在本地机器运行CP2K,就不用额外装gcc和mpi,直接用容器内的mpi即可运行: - export EXE="singularity exec/public/opt/cp2k/cp2k2023.1.sif"
- ${EXE} mpirun -np 36 cp2k.popt cp2k.inp 1>cp2k.out 2>cp2k.err
复制代码
三、后记 如果租用超算,管理员可能不给装singularity,也就无法使用镜像运行CP2K,在花时间学习此方法前建议先调研清楚。
|