本文于2020年11月21日发表于微信公众号,查看原文
本文于2020年11月21日发表于知乎专栏,查看原文
在搞定libdeepmd的构建后,我们终于来到了最后一关:LAMMPS。
这里以今年3月发布的LAMMPS stable_3Mar2020为例。在寻常的安装中,我们需要把USER-DEEPMD
文件夹拷进src
目录下,这次也不例外,我们在build.sh
的最开头便做了这件事:
build.sh1
| cp -r ${PREFIX}/share/USER-DEEPMD src/
|
这里的USER-DEEPMD
来自于我们上次构建的libdeepmd,我们自然需要在meta.yaml
添加这一依赖。
meta.yaml1 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 }} - libdeepmd {{ version }} *{{ dp_variant }}_{{ float_prec }} - cudatoolkit {{ cuda_compiler_version }}* - plumed - mpich - zlib - fftw - libpng - jpeg
|
可以看到,除了libdeepmd和cudatoolkit外,我们还添加了其它LAMMPS需要的外部依赖,如mpich和zlib等。
值得注意的是,我们拷到src
目录下的USER-DEEPMD
本质上是一个第三方的package,并没有得到LAMMPS的官方支持。因此,我们要给LAMMPS的cmake文件打上补丁,加上这个package:
deepmd.patch1 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(-)
@@ -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=on
和BUILD_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 }} - libdeepmd {{ version }} *{{ dp_variant }}_{{ float_prec }} - cudatoolkit {{ cuda_compiler_version }}* - plumed - mpich - zlib - fftw - libpng - jpeg run: - {{ pin_compatible('libdeepmd', exact=True) }} - {{ pin_compatible('mpich') }} - {{ pin_compatible('cudatoolkit', max_pin='x.x') }} - 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-dp
、lammps-dp
和pylammps-dp
三个子包内,同时利用pin_subpackage
让后两个包依赖第一个包。这样,使用者便可以按需安装自己想要的功能了。
至此,deepmd-kit
、libtensorflow_cc
、libdeepmd
和lammps-dp
已经全部构建完成!下一篇文章中,我们将用constructor
将这几个package打包成离线安装包。