conda build系列教程·deepmd的构建③|libdeepmd

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

成功构建libtensorflow_cc后,我们便可以参照之前的方法,构建libdeepmd了。

deepmd-kit-recipes/libdeepmd-feedstockrecipe/meta.yaml文件中,我们把包的名称设置为{{ PKG_BUILDNUM }}_cuda{{ cuda_compiler_version }}_{{ dp_variant }},其中把{{ dp_variant }}放在最后,就可以确保用*cpu或者*gpu就可以搜寻到指定的版本。

1
2
3
4
5
6
7
8
build:
number: 1
string: "{{ PKG_BUILDNUM }}_cuda{{ cuda_compiler_version }}_{{ dp_variant }}" # [float_prec == 'high']
string: "{{ PKG_BUILDNUM }}_cuda{{ cuda_compiler_version }}_{{ dp_variant }}_{{float_prec}}" # [float_prec != 'high']
run_exports:
- libdeepmd {{ version }} *{{ dp_variant }} # [float_prec == 'high']
- libdeepmd {{ version }} *{{ dp_variant }}_{{ float_prec }} # [float_prec != 'high']
skip: true # [not linux]

同时,设置了run_exports,可以确保把libdeepmd加入构建(host)依赖的package,自动把相同版本的libdeepmd加入运行时(run)的依赖。

和前两个package类似,libdeepmd的依赖就是gcclibtensorflow_cccudatoolkit以及其它构建工具:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
requirements:
build:
- {{ compiler('c') }}
- {{ compiler('cxx') }}
- cmake
- git
host:
- cudatoolkit {{ cuda_compiler_version }}* # [cuda_compiler_version != 'None']
- cudnn {{ cudnn }}* # [cuda_compiler_version != 'None']
- libtensorflow_cc {{ tf }}*
run:
- libtensorflow_cc {{ tf }}*
- {{ pin_compatible('cudatoolkit', max_pin='x.x') }} # [cuda_compiler_version != 'None']
- {{ pin_compatible('cudnn') }} # [cuda_compiler_version != 'None']

这里,如何指定tf的版本?这是在meta.yaml最上方实现的,可以根据不同的cuda_compiler_version设置不同的dp_varianttf_version,之后再将两者拼接起来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{% if cuda_compiler_version == "None" %}
{% set dp_variant = "cpu" %}
{% else %}
{% set dp_variant = "gpu" %}
{% endif %}

{% if cuda_compiler_version == "None" %}
{% set dp_variant = "cpu" %}
{% set tf_version = "2.3" %}

{% else %}
{% set dp_variant = "gpu" %}

{% if cuda_compiler_version == "10.1" %}
{% set tf_version = "2.3" %}
{% elif cuda_compiler_version == "10.0" %}
{% set tf_version = "2.1" %}
{% else %}
{% set tf_version = "2.1" %}
{% endif %}

{% endif %}

{% set tf = "{} {}".format(tf_version, dp_variant) %}

libtensorflow_cc一样,我们在conda_build_config.yaml里面仍然把gcc的版本设为5.4,因为cudatoolkit仍然不支持用gcc 7.3编译。

1
2
3
4
c_compiler_version:
- 5.4
cxx_compiler_version:
- 5.4

build.sh文件比较简单。在使用cmake编译时,我们只需要把CMAKE_INSTALL_PREFIX和其它目录均设为${PREFIX}即可。

1
2
3
4
5
6
7
8
9
set -e
mkdir -p source/build
cd source/build
cmake -DTENSORFLOW_ROOT=${PREFIX} -DCMAKE_INSTALL_PREFIX=${PREFIX} -DFLOAT_PREC=${float_prec} -DCMAKE_CXX_FLAGS="-lrt -pthread" -DCMAKE_SHARED_LINKER_FLAGS_INIT="-lrt -pthread" -DCMAKE_LINK_WHAT_YOU_USE=TRUE ..
make -j${CPU_COUNT}
make install
make lammps
mkdir -p ${PREFIX}/share
mv USER-DEEPMD ${PREFIX}/share

${CPU_COUNT}conda-build检测到的核心数。现在,大功告成!接下来我们就可以开始编译集成了DP的LAMMPS以及AmberTools。