DeepMD-kit安装最佳实践¶
背景:以 Zeus 集群为例,在服务器通过源代码编译安装DeepMD-kit和包含完整接口的LAMMPS。虽然官方已经提供了通过 Conda 一键安装的方法,但由于此法所安装的各个组件均为预编译版本,因而针对课题实际情况无法做更多拓展和改动,且通过 Conda 安装的 Protobuf 存在版本冲突,无法进一步编译其他接口。这里介绍一种方法,通过 Conda 安装通常不需要改动的TensorFlow C++ Interface,其余部分仍手动编译。由于目前新版Lammps已经提供Plugin支持,DeePMD亦支持通过Plugin调用,故可令组件之间相互解耦、减少后续安装的工序。
初始环境说明¶
以下过程以 Zeus 集群为例,操作系统及版本为CentOS 7,管理节点联网,采用module作为环境管理。
以下是预先配置好的环境,对于其他集群,可以此要求准备环境,其中 Intel MPI 可以用 MPICH 代替,其余组件请自行安装。注意CUDA 11.3对Nvidia驱动版本有要求,需要预先检查好(可用nvidia-smi
快速查看)。
- 通过yum安装
- Git >= 1.8.2
- 通过module加载
- CUDA 11.3
- Miniconda 3
- GCC >= 7.4.0
- Intel MPI 2017 (暂未对其他版本进行测试)
版本号仅供参考,实际安装因人而异,参考执行即可。
DeePMD-kit 常用组件关系¶
flowchart TB
tfcpp(TensorFlow C++ Interface) -.-> tfpy(TensorFlow Python Interface)
tfpy --> dppy(DeePMD Python Interface)
dpcpp(DeePMD C++ Interface) -.-> dppy
tfcpp --> dpcpp
dpcpp --> lmp(DeePMD Lammps API)
tfcpp --> lmp
如图所示展示了DeePMD-kit各个常用组件之间的联系,需要声明的是,图示并非对代码的严谨解析,仅仅是对组织结构的直观表现。
势函数训练过程通常依赖于DeePMD Python Interface,这一部分在用 Pip 安装时即依赖于TensorFlow的Python Interface,因此在图中用实线箭头表示。而用Pip安装的TensorFlow Wheel已经预先编译了底层所需的Tensorflow C++ Interface,这一隐含的依赖用虚线箭头表示。类似地,DeePMD-kit在Pip安装时也会调用CMake来编译一部分所需的C++库,因而也存在类似的关系。
当用训练好的势函数来进行MD模拟时,则需要运行Lammps等分子动力学软件调用DeePMD-kit接口。以Lammps为例,现有的两种方式分别是:
- 在Lammps安装时即额外编译DeePMD API(即USER-DEEPMD
)
- 编译DeePMD Plugin,由支持Plugin的Lammps版本调用
这两种方式在编译时均需要调用DeePMD-kit和TensorFlow的C++ Interface,故在图中也用实线表示。而TensorFlow C++ Interface实际上可由源代码结合必要的底层依赖(如GCC、CUDA等)独立编译,DeePMD-kit C++ Interface只需在TensorFlow C++ Interface基础上进行编译(图中实线箭头)。
因而在实际处理安装关系时,我们也可以采用相对独立的编译方式来最大化解耦组件。下文的思路将按以下步骤展开:
- 建立独立的Conda环境,用 Pip 安装 TensorFlow 和 DeePMD-kit,提供势函数训练功能;
- 结合必要的组件、环境等编译Lammps,提供经典分子动力学模拟功能;
- 编译 DeePMD C++ Interface,在此基础上编译 DeePMD-kit Lammps Plugin供Lammps调用,提供 DeePMD 模拟功能;
- 编译 DeePMD CP2K API 和对应的CP2K版本(No free lunch.)
安装DeePMD-kit Python Interface¶
创建新的环境¶
首先准备必要的依赖。
检查可用的模块,并加载必要的模块:
module avail
module add cuda/11.3
module add gcc/7.4.0
注意这里导入的是GCC 7.4.0版本,如果采用低于4.9.4的版本(不导入GCC)则dp_ipi不会被编译。
然后创建虚拟环境,步骤请参考Anaconda 使用指南。
假设创建的虚拟环境名称是 deepmd
,则请将步骤最后的 <your env name>
替换为 deepmd
。若采用该步骤的设置,则虚拟环境将被创建在/data/user/conda/env/deepmd
下(假设用户名为user
)。
conda create -n deepmd python=3.9
conda activate deepmd
注意请务必为创建的虚拟环境安装所需的Python环境。通常不指定Python版本号的情况下(例如文中的步骤conda create -n <your env name> python
)会安装Conda推荐的最新版本,如需要替代请对应指定,如conda create -n deepmd python=3.10
。
对于无法联网的节点,在编译时需要将所需的驱动程序库的符号库libcuda.so
以libcuda.so.1
的名称手动链接到某个具有权限的路径/some/local/path
并分别加入环境变量,以通过编译流程:
ln -s /data/share/apps/cuda/11.3/lib64/stubs/libcuda.so /some/local/path/libcuda.so.1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/share/apps/cuda/11.3/lib64/stubs:/some/local/path
提示
若在Zeus 集群上安装,管理员已事先把libcuda.so.1
链接在/data/share/apps/cuda/11.3/lib64/stubs/
下,故无需额外创建软链接,同理/some/local/path
也无需加入环境变量,但仍需要驱动程序库的符号链接libcuda.so
。注意这一步骤执行后,实际运行时需要从环境变量中移除
安装DeePMD-kit的Python接口¶
以防万一可以升级下pip的版本:
pip install --upgrade pip
接下来安装Tensorflow的Python接口
pip install tensorflow
若提示已安装,请使用--upgrade
选项进行覆盖安装。若提示权限不足,请使用--user
选项在当前账号下安装。
然后下载DeePMD-kit的源代码(注意把v2.1.5
替换为需要安装的版本,如v2.0.3
等)
cd /some/workspace
git clone --recursive https://github.com/deepmodeling/deepmd-kit.git deepmd-kit -b v2.1.5
在运行git clone时记得要--recursive
,这样才可以将全部文件正确下载下来,否则在编译过程中会报错。
提示
如果不慎漏了--recursive
, 可以采取以下的补救方法:
git submodule update --init --recursive
若集群上 CMake 3没有安装,可以用pip进行安装:
pip install cmake
修改环境变量以使得cmake正确指定编译器:
export CC=`which gcc`
export CXX=`which g++`
export FC=`which gfortran`
若要启用CUDA编译,请导入环境变量:
export DP_VARIANT=cuda
随后通过pip安装DeePMD-kit:
cd deepmd-kit
pip install .
安装Lammps¶
注意这一部分可以从DeePMD安装中解耦出来,因而兼顾对Lammps的不同需求,而不必为DeePMD专门编译一个Lammps可执行文件。
环境准备¶
首先加载所需的环境,包括CMake、Intel MPI等。若不需要编译Lammps原生的GPU加速,可不需要加载CUDA环境。注意需要把Intel MPI提供的头文件(mpi.h
等)所在路径加入C_INCLUDE_PATH
中。
仍以Zeus为例,如下所示。注意这里使用的是全局的CMake,如果与上一部分采用同一个环境,可不需重复加载。
module load cmake/3.20
module load intel/17.5.239 mpi/intel/2017.5.239 gcc/7.4.0
# if not included
export C_INCLUDE_PATH=<intel_installation_dir>/impi/2017.4.239/include64:$C_INCLUDE_PATH
若需要编译对应的Lammps组件(如Plumed、NetCDF等),请对应加载所需的环境:
module load netcdf/4.9.0_intel17
module load plumed
如需编译Lammps原生的GPU加速,可加载CUDA环境,注意这会使得编译得到的Lammps无法在不包括GPU的节点上运行。
# gpu acceleration support
module load cuda/11.3
Warning
若编译Lammps原生的GPU加速,请注意原生默认采用半精度。Lammps在开启GPU加速时速度可有较大提升,但精度问题已知可能导致DeePMD势函数模拟误差上升(体现为Model Deviation相比不开启GPU加速显著上升),请针对体系做测试确认误差是否符合预期。DeePMD接口官方未提供Lammps的GPU加速支持,且默认编译的是双精度版本,请务必注意。
配置编译¶
创建文件夹
cd <lammps_source_code>
mkdir build
cd build
进行编译
cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ \
-DCMAKE_Fortran_COMPILER=gfortran \
-D BUILD_MPI=yes -D BUILD_OMP=yes -D LAMMPS_MACHINE=mpi \
-D BUILD_SHARED_LIBS=yes \
-D CMAKE_INSTALL_PREFIX=<lammps_installation_dir> \
-D CMAKE_INSTALL_LIBDIR=lib \
-D CMAKE_INSTALL_FULL_LIBDIR=<lammps_installation_dir>/lib \
-C ../cmake/presets/most.cmake -C ../cmake/presets/nolib.cmake ../cmake
CMAKE_INSTALL_PREFIX
可以根据安装实际路径修改,但这一方法得到的是共享库( *.so
),所以包括Lammps源代码在内都不要移动。
若开启对应插件,请注意在 ../cmake
前插入对应选项,如:
-D PKG_PLUMED=yes -D PLUMED_MODE=shared \
-D PKG_H5MD=yes -D PKG_NETCDF=yes \
-D NETCDF_INCLUDE_DIR=<netcdf_installation_dir>/include
若希望开启GPU加速,请增加选项:
-D PKG_GPU=on -D GPU_API=cuda
开始编译¶
运行
make
make install
编译DeePMD-kit Lammps Plugin¶
方法一:静态编译¶
安装Tensorflow的C++ 接口¶
以下安装,假设软件包下载路径均为 /some/workspace
, 以 TensorFlow 2.7.0版本、DeePMD-kit 2.1.5 版本为例进行说明,其他版本的步骤请参照修改。注意为保证模型兼容性,版本号最好与 Python Interface对应。
本步骤需要使用 Conda,因此在前文基础上进行。
搜索仓库,查找可用的 TensorFlow 的 C++ 接口版本。
conda search libtensorflow_cc -c https://conda.deepmodeling.com
结果如下:
Loading channels: done
# Name Version Build Channel
libtensorflow_cc 1.14.0 cpu_h9a2eada_0
libtensorflow_cc 1.14.0 gpu_he292aa2_0
libtensorflow_cc 2.0.0 cpu_h9a2eada_0
libtensorflow_cc 2.0.0 gpu_he292aa2_0
libtensorflow_cc 2.1.0 cpu_cudaNone_0
libtensorflow_cc 2.1.0 gpu_cuda10.0_0
libtensorflow_cc 2.1.0 gpu_cuda10.1_0
libtensorflow_cc 2.1.0 gpu_cuda9.2_0
libtensorflow_cc 2.3.0 cpu_cudaNone_0
libtensorflow_cc 2.3.0 gpu_cuda10.1_0
libtensorflow_cc 2.4.1 gpu_cuda11.0_0
libtensorflow_cc 2.4.1 gpu_cuda11.1_0
libtensorflow_cc 2.5.0 cpu_cudaNone_0
libtensorflow_cc 2.5.0 gpu_cuda10.1_0
libtensorflow_cc 2.5.0 gpu_cuda11.3_0
libtensorflow_cc 2.7.0 cpu_h6ddf1b9_0
libtensorflow_cc 2.7.0 cuda101h50fd26c_0
libtensorflow_cc 2.7.0 cuda113h3372e5c_0
libtensorflow_cc 2.7.0 cuda113hbf71e95_1
libtensorflow_cc 2.9.0 cpu_h681ccd4_0
libtensorflow_cc 2.9.0 cuda102h929c028_0
libtensorflow_cc 2.9.0 cuda116h4bf587c_0
这里所希望安装的版本是2.7.0的GPU版本,CUDA版本为11.3,因此输入以下命令安装:
conda install libtensorflow_cc=2.7.0=cuda113hbf71e95_1 -c https://conda.deepmodeling.com
若所安装的环境没有实际的GPU驱动(比如集群的登录节点)或需要用到Conda安装CudaToolkit,可能需要参照此处说明强制指定GPU环境。比如:
CONDA_OVERRIDE_CUDA="11.3" conda install libtensorflow_cc=2.7.0=cuda113hbf71e95_1 -c https://conda.deepmodeling.com
请注意 CONDA_OVERRIDE_CUDA
的值需要与GPU支持以及希望用到的CUDA版本相匹配。
提示
注意A100仅支持TF 2.4.0以上、CUDA11.2以上,安装时请对应选择。
提示
个别版本在后续编译时可能会提示需要libiomp5.so
,请根据实际情况确定是否需要载入Intel环境或者conda install intel-openmp
。
提示
conda
命令可能速度较慢,也可以考虑切换为mamba,后者可大幅加速Conda的性能,且完全兼容。只需参照前述链接安装后将conda
替换为mamba
即可
若成功安装,则定义环境变量:
export tensorflow_root=/data/user/conda/env/deepmd
即虚拟环境创建的路径。后文将使用 $tensorflow_root
来指定该路径。
安装DeePMD-kit的C++ 接口¶
下面开始编译DeePMD-kit C++接口:
deepmd_source_dir=`pwd`
cd $deepmd_source_dir/source
mkdir build
cd build
假设DeePMD-kit C++ 接口安装在 /some/workspace/deepmd_root
下,定义安装路径 deepmd_root
:
export deepmd_root=/some/workspace/deepmd_root
在build目录下运行:
cmake -DLAMMPS_SOURCE_ROOT=<lammps_source_code> \
-DTENSORFLOW_ROOT=$tensorflow_root -DCMAKE_INSTALL_PREFIX=$deepmd_root \
-DUSE_CUDA_TOOLKIT=TRUE ..
注意这里的 <lammps_source_code>
对应前文中Lammps的源码路径。
最后编译并安装:
make
make install
若无报错,通过以下命令执行检查是否有正确输出:
$ ls $deepmd_root/lib
deepmd_lmp/ libdeepmd_cc_low.so libdeepmd_gromacs.so libdeepmd_ipi.so libdeepmd_lmp.so libdeepmd_op.so
deepmd_lmp_low/ libdeepmd_cc.so libdeepmd_ipi_low.so libdeepmd_lmp_low.so libdeepmd_op_cuda.so libdeepmd.so
注意应当包含deepmd_lmp/
和libdeepmd_lmp.so
,后两者即为Lammps插件的位置。
方法二:采用TensorFlow Python 版本的库¶
从 DeePMD-kit v2.2 起,cmake
支持设置 -DUSE_TF_PYTHON_LIBS=TRUE
的方式,从而免去了安装 libtensorflow_cc
的麻烦。
cmake -DLAMMPS_SOURCE_ROOT=<lammps_source_code> \
-DUSE_TF_PYTHON_LIBS=TRUE -DUSE_CUDA_TOOLKIT=TRUE \
-DCMAKE_INSTALL_PREFIX=$deepmd_root ..
Tip
请注意,这种方法采用Python Wheel提供的 libtensorflow_framework.so.2
和 _pywrap_tensorflow_internal.so
(作为 libtensorflow_cc.so
的替代)进行编译。
后者依赖 Python 库 libpython3.*.so.*
(因版本不同而异),请注意基于上述库的编译应保证后者路径也在 LD_LIBRARY_PATH
中。
为使得编译好的库文件可以更容易找到上述依赖,请执行以下操作,建立一个伪 tensorflow_root
目录,假设该路径位于 /some/workspace/tensorflow_root
下,同时假设 Conda 环境仍位于 /data/user/conda/env/deepmd
下:
export tensorflow_root=/some/workspace/tensorflow_root
mkdir -p $tensorflow_root/lib
cd $tensorflow
ln -s /data/user/conda/env/deepmd/lib/python3.10/site-packages/tensorflow/include .
cd lib
ln -s /data/user/conda/env/deepmd/lib/python3.10/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so libtensorflow_cc.so
ln -s /data/user/conda/env/deepmd/lib/python3.10/site-packages/tensorflow/libtensorflow_framework.so.2 .
ln -s libtensorflow_framework.so.2 libtensorflow_framework.so
于是,我们便构建了一个伪 tensorflow_root
目录。注意后文的 $tensorflow_root
此时应指向该路径。
调用方法¶
使用前请加载好环境变量。注意若未定义 $deepmd_root
、$tensorflow_root
,请补全为完整路径。这里的 /data/user/conda/env/deepmd
仍是 Conda 环境的路径,请相应替换。
export LD_LIBRARY_PATH=$tensorflow_root/lib:$deepmd_root/lib:/data/user/conda/env/deepmd/lib:$LD_LIBRARY_PATH
export LAMMPS_PLUGIN_PATH=$deepmd_root/lib/deepmd_lmp
Lammps便会自动寻找插件并加载,从而可以实现DeePMD的支持。
pair_style deepmd ../graph.pb
pair_coeff * *
若无法自动找到,也可以手动在 输入文件 中加载,写在 pair_style
上一行即可,注意 $deepmd_root
、$tensorflow_root
须替换为完整路径。
plugin load $deepmd_root/lib/libdeepmd_lmp.so
pair_style deepmd ../graph.pb
pair_coeff * *
运行命令仍然是 lmp_mpi -i <input_file>
。
DP-CP2K 安装指引¶
首先clone对应的安装包:
git clone https://github.com/cp2k/cp2k.git --recursive --depth=1
然后运行相应的Toolchain脚本:
module unload mpi/intel/2017.5.239 # (1)!
module load mpi/openmpi/4.1.6-gcc # (2)!
cd tools/toolchain/
./install_cp2k_toolchain.sh --with-gcc=system --mpi-mode=openmpi --with-deepmd=$deepmd_root
- 新版CP2K会自动检测 Intel MPI 且无视强制使用其他环境如 OpenMPI 的设定,旧版 Intel MPI不被兼容
- 由于
--with-openmpi=install
在 Zeus 上无法正确安装,这里预先安装好了 OpenMPI。
如不需要 MPI 和 DFT 相关功能,可以如下设置以减少步骤(注意后续编译移除掉 psmp pdbg
选项):
cd tools/toolchain/
module unload mpi/intel/2017.5.239 # (1)!
./install_cp2k_toolchain.sh --with-deepmd=$deepmd_root --mpi-mode=no --with-libint=no --with-libxc=no --with-libxsmm=no
- 新版CP2K会自动检测 Intel MPI 且无视强制使用其他环境如 OpenMPI 的设定,旧版 Intel MPI不被兼容
根据脚本运行结尾的提示复制arch文件并source所需的环境变量。
这里的目的是让编译时可以正确链接 libpython3.*.so.*
,因而 /data/user/conda/env/deepmd/
仍旧是 Conda 环境路径。
最后回到主目录进行编译:
make -j 4 ARCH=local VERSION="psmp pdbg ssmp sdbg" # (1)!
- 如不需要 MPI ,请移除掉
psmp pdbg
。
编译正确完成后,可执行文件生成在 exe/
下,即 cp2k.ssmp
或 cp2k.psmp
。
关于 DP-CP2K 的使用,请参考 CP2K: DeePMD插件。