conda build系列教程·deepmd的构建④|lammps-dp

本文于2020年11月21日发表于微信公众号,查看原文
本文于2020年11月21日发表于知乎专栏,查看原文

在搞定libdeepmd的构建后,我们终于来到了最后一关:LAMMPS。

这里以今年3月发布的LAMMPS stable_3Mar2020为例。寻常的安装中,我们需要把USER-DEEPMD文件夹拷进src目录下,这次也不例外,我们在build.sh的最开头便做了这件事:

build.sh
1
cp -r ${PREFIX}/share/USER-DEEPMD src/

这里的USER-DEEPMD来自于我们上次构建的libdeepmd,我们自然需要在meta.yaml添加这一依赖。

meta.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
requirements:
build:
- {{ compiler('c') }}
- {{ compiler('cxx') }}
- cmake
- make

host:
- python
- libdeepmd {{ version }} *{{ dp_variant }} # [float_prec == 'high']
- libdeepmd {{ version }} *{{ dp_variant }}_{{ float_prec }} # [float_prec != 'high']
- cudatoolkit {{ cuda_compiler_version }}* # [cuda_compiler_version != 'None']
- plumed
- mpich
- zlib
- fftw
- libpng
- jpeg

可以看到,除了libdeepmd和cudatoolkit外,我们还添加了其它LAMMPS需要的外部依赖,如mpich和zlib等。

值得注意的是,我们拷到src目录下的USER-DEEPMD本质上是一个第三方的package,并没有得到LAMMPS的官方支持。因此,我们要给LAMMPS的cmake文件打上补丁,加上这个package:

deepmd.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Add deepmd
author: Jinzhe

---
cmake/CMakeLists.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
index 0849e03d..a366828d 100644
--- cmake/CMakeLists.txt
+++ cmake/CMakeLists.txt
@@ -181,7 +181,7 @@
USER-MANIFOLD USER-MEAMC USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE
USER-NETCDF USER-PHONON USER-PLUMED USER-PTM USER-QTB USER-REAXC
USER-SCAFACOS USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF
- USER-VTK USER-QUIP USER-QMMM USER-YAFF USER-ADIOS)
+ USER-VTK USER-QUIP USER-QMMM USER-YAFF USER-ADIOS USER-DEEPMD)
set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU)
foreach(PKG ${DEFAULT_PACKAGES} ${ACCEL_PACKAGES})
option(PKG_${PKG} "Build ${PKG} Package" OFF)

现在,我们可以继续编写build.sh了。首先配置plumed:

1
make -C src lib-plumed args="-p $PREFIX -m runtime"

接着,我们用cmake编译LAMMPS,把能开启的包全部开启,尽可能地覆盖大多数用户:

1
2
3
4
5
6
7
8
9
10
11
12
mkdir build
cd build
if [ ${float_prec} == "high" ]; then
export PREC_DEF="-DHIGH_PREC"
fi
if [ ${dp_variant} == "gpu" ]; then
export DEEPMD_CUDA_LINK="-ldeepmd_op_cuda"
fi
ARGS="-D PKG_ASPHERE=ON -DPKG_BODY=ON -D PKG_CLASS2=ON -D PKG_COLLOID=ON -D PKG_COMPRESS=OFF -D PKG_CORESHELL=ON -D PKG_DIPOLE=ON -D PKG_GRANULAR=ON -D PKG_KSPACE=ON -D PKG_MANYBODY=ON -D PKG_MC=ON -D PKG_MEAM=ON -D PKG_MISC=ON -D PKG_MOLECULE=ON -D PKG_PERI=ON -D PKG_REPLICA=ON -D PKG_RIGID=ON -D PKG_SHOCK=ON -D PKG_SNAP=ON -D PKG_SRD=ON -D PKG_OPT=ON -D PKG_KIM=OFF -D PKG_GPU=OFF -D PKG_KOKKOS=OFF -D PKG_MPIIO=OFF -D PKG_MSCG=OFF -D PKG_LATTE=OFF -D PKG_USER-MEAMC=ON -D PKG_USER-PHONON=ON -D PKG_USER-REAXC=ON -D WITH_GZIP=ON -D PKG_USER-MISC=ON -D PKG_USER-COLVARS=ON -D PKG_USER-PLUMED=yes -D PLUMED_MODE=runtime"
cmake -D BUILD_LIB=on -D BUILD_SHARED_LIBS=on -DCMAKE_INSTALL_LIBDIR=lib $ARGS -D PKG_USER-DEEPMD=ON -D FFT=FFTW3 -D CMAKE_INSTALL_PREFIX=${PREFIX} -D CMAKE_CXX_FLAGS="${PREC_DEF} -I${PREFIX}/include -I${PREFIX}/include/deepmd -L${PREFIX}/lib -Wl,--no-as-needed -lrt -ldeepmd_op ${DEEPMD_CUDA_LINK} -ldeepmd -ltensorflow_cc -ltensorflow_framework -Wl,-rpath=${PREFIX}/lib" ../cmake
make -j${NUM_CPUS}
make install

我们通过cmake的参数开启了一坨LAMMPS的package,同时通过配置CMAKE_CXX_FLAGS加入了对libdeepmd的链接。同时,我们通过环境变量配置了两类变体(variant):CPU和GPU、单精度和双精度。最后,编译,成功。

值得一提的是,如果使用者想开启更多的package,最简单的方法是修改配方中build.sh,在conda_build_config.yaml注释掉不想要的variant,然后自己用conda-build重新编译一遍。

我们用BUILD_LIB=onBUILD_SHARED_LIBS=on开启了shared libs模式,这样,LAMMPS会产生三类文件:LAMMPS的library、LAMMPS的执行程序、Python package。如何将它们生成不同的库?这时我们需要用到meta.yaml里的outputs选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
outputs:
- name: liblammps-dp
files:
- lib/liblammps.so*
- lib/pkgconfig/liblammps.pc
- share/cmake/Modules/FindLAMMPS.cmake
- share/lammps
- share/man/man1/lmp*
requirements:
host:
- libdeepmd {{ version }} *{{ dp_variant }} # [float_prec == 'high']
- libdeepmd {{ version }} *{{ dp_variant }}_{{ float_prec }} # [float_prec != 'high']
- cudatoolkit {{ cuda_compiler_version }}* # [cuda_compiler_version != 'None']
- plumed
- mpich
- zlib
- fftw
- libpng
- jpeg
run:
- {{ pin_compatible('libdeepmd', exact=True) }}
- {{ pin_compatible('mpich') }}
- {{ pin_compatible('cudatoolkit', max_pin='x.x') }} # [cuda_compiler_version != 'None']
- plumed >=2
- fftw
- libpng
- jpeg
test:
commands:
- test -f $PREFIX/lib/liblammps.so

- name: lammps-dp
files:
- bin/lmp
requirements:
build:
- {{ compiler('c') }}
- {{ compiler('cxx') }}
host:
- {{ pin_subpackage('liblammps-dp', exact=True) }}
run:
- {{ pin_subpackage('liblammps-dp', exact=True) }}
test:
commands:
- lmp -help

- name: pylammps-dp
build:
noarch: python
files:
- lib/python*/site-packages/lammps.py
requirements:
host:
- python
run:
- python
- {{ pin_subpackage('liblammps-dp', max_pin='x.x') }}
test:
imports:
- lammps

outputs中,我们把生成的文件分到了liblammps-dplammps-dppylammps-dp三个子包内,同时利用pin_subpackage让后两个包依赖第一个包。这样,使用者便可以按需安装自己想要的功能了。

至此,deepmd-kitlibtensorflow_cclibdeepmdlammps-dp已经全部构建完成!下一篇文章中,我们将用constructor将这几个package打包成离线安装包。