Deepmd-lammps在集群上的编译方法(以南方科大的集群为例)

   Deepmd是一款高效的神经网络势函数训练软件,只需要有一些Linux和基本的lammps分子动力学基础的使用者即可上手。Deepmd具有很好的lammps接口。但是对于初学者而言,deepmd-lammps编译不是一件容易的事,编译过程中的坑非常非常多。即便deepmd官网上手册中有打包好conda包,但由于不同的编译环境,编译出来的结果有可能是报错的。除此之外,官网的一键安装包在编译过程中没有采用intel的加速功能,实际测试与本方法相比速度慢了大约1倍左右(原因是因为lammps官网有个加速的包需要手动make)。因此建议自己编译,实现最大程度的加速效果。笔者在编译以及调试deepmd-lammps大概花费了一周左右,写本文的目的是记录在编译过程的各种报错以及相应的通用解决办法,为后续deepmd-lammps的使用者在编译上提供一定的便利。本笔记根据官网编译源码手段编译,并详细记录了编译过程中的各种坑。在编译过程中,非常感谢Sustech 科学计算中心高级计算工程师Yusen YangHong TangZhuo Chou,湖南大学硕士生Jian He,以及美国罗格斯大学Jinze Zeng博士在编译过程中提供的帮助。本人水平有限,如有槽点,还请轻喷。

2021年4月22日

Jia'ao WANG

 

 

废话不多说,直接贴编译方法。(南方科大太乙集群修改路径后直接可以运行以下代码,速度比直接使用deepmd官网一键安装包的速度快大概1倍)

module load python/anaconda3/2020.7
module load python/3.7.0
conda create python=3.7 -n dpdev -y
conda activate dpdev


module load python/anaconda3/2020.7
module load python/3.7.0
module add cuda/10.2
module add cmake/3.12.2
module load cmake/3.12.2
module load git/2.18.0

 

cd ~
mkdir software
cd ~/software
wget https://github.com/bazelbuild/bazel/releases/download/0.25.1/bazel-0.25.1-installer-linux-x86_64.sh
chmod +x bazel-0.25.1-installer-linux-x86_64.sh
./bazel-0.25.1-installer-linux-x86_64.sh --user
export PATH="$HOME/bin:$PATH"
git clone https://github.com/tensorflow/tensorflow -b v2.0.0 --depth=1       !!!(这里要改成2.4版本)
cd tensorflow
./configure

bazel build -c opt --verbose_failures //tensorflow:libtensorflow_cc.so
cd ..
mkdir tensorflowc++
cd tensorflowc++
export tensorflow_root=`pwd`

cd   /work/para-test/software/tensorflow
mkdir -p $tensorflow_root
mkdir $tensorflow_root/lib
cp -d bazel-bin/tensorflow/libtensorflow_cc.so* $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_framework.so* $tensorflow_root/lib/

cd ..
chmod -R +w ./tensorflowc++/
cd tensorflow

mkdir -p $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_cc.so* $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_framework.so* $tensorflow_root/lib/

cp -d $tensorflow_root/lib/libtensorflow_framework.so.2 $tensorflow_root/lib/libtensorflow_framework.so
mkdir -p $tensorflow_root/include/tensorflow 
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-genfiles/ $tensorflow_root/include/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' tensorflow/cc $tensorflow_root/include/tensorflow/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' tensorflow/core $tensorflow_root/include/tensorflow/
rsync -avzh --include '*/' --include '*' --exclude '*.cc'  third_party/ $tensorflow_root/include/third_party/
rsync -avzh --include '*/' --include '*' --exclude '*.txt' bazel-tensorflow/external/eigen_archive/Eigen/ $tensorflow_root/include/Eigen/
rsync -avzh --include '*/' --include '*' --exclude '*.txt' bazel-tensorflow/external/eigen_archive/unsupported/ $tensorflow_root/include/unsupported/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-tensorflow/external/com_google_protobuf/src/google/ $tensorflow_root/include/google/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-tensorflow/external/com_google_absl/absl/ $tensorflow_root/include/absl/

cd ..

git clone --recursive https://github.com/deepmodeling/deepmd-kit.git deepmd-kit
cd deepmd-kit

git clone --recursive https://github.com/deepmodeling/dargs dargs
cd dargs

pip install --upgrade pip --user
pip install .  --user

cd ..

pip install . --user

cd ~/software
mkdir deepmdc++
git clone https://github.com/deepmodeling/deepmd-kit
mkdir /work/para-test/software/deepmd-kit/source/build
cd  /work/para-test/software/deepmdc++
export deepmd_root=`pwd`

cd   /work/para-test/software/deepmd-kit/source/build

cmake -DUSE_CUDA_TOOLKIT=true -DTENSORFLOW_ROOT=$tensorflow_root -DCMAKE_INSTALL_PREFIX=$deepmd_root ..


make -j40 && make install
make lammps

cp -r USER-DEEPMD/ /work/para-test/apps/lammps-29Oct20/src

cd   /work/para-test/apps/lammps-29Oct20/src

module load intel/2020.4
module load mpi/intel/2020.4

make yes-user-deepmd
make yes-kspace
make yes-user-intel

make intel_cpu_intelmpi -j40
 

在其他的集群直接运行上述代码极有可能是报错的,因此下面我们将对每一步骤进行解释,尽可能清晰地讲清楚每一步执行的目的,以便帮助读者在一个新的集群上编译成功。

接下来我们对每一行代码进行细致的剖析,以及逐行对在编译过程中容易出现的错误进行解释。编译对于新手来说并不是一件容易的事情。如有报错请按照以下分析耐心debug,请一步一步慢慢来。耐心debug

 

总的来说 安装deepmd-lammps分为三个步骤:

第零:环境的检查与准备;

第一:tensorflow的安装&tensorflow C++库的编译;

第二:deepmd-kit的安装&deepmd-kit C++库的编译;

第三:lammps的下载与c++库建立链接、编译。

 

第零:环境的检查。此步极其重要,请仔细检查。

请检查环境anaconda安装情况(建议用anaconda 2020.7之后的版本)具体的anaconda安装方法以及加载请参考https://blog.csdn.net/ychgyyn/article/details/82258136在此不多赘述。

gcc 4.8.5    CUDA 10.2    intel/2020.4  mpi/intel/2020.4   cmake/3.12.2    lammps-29Oct20 压缩包   python3    anaconda 2020.7   tensorflow为2.4版本(请注意)

 

 

第一:tensorflow的安装&tensorflow C++库的编译;

加载好环境之后,进入(base)模式,如果在环境变量中设置了登录时启动,则忽略此步骤。

conda activate

定义一个新的conda环境,命名为"deepmd",我们在此环境下(deepmd)(base)安装tensorflow。因为tensorflow对于环境依赖性非常强。

module load python/anaconda3/2020.7
module load python/3.7.0
conda create python=3.7 -n deepmd -y

启动我们定义好的环境

conda activate deepmd

在环境里面加载一下module,版本号可能对应不上,如有报错请检查。

module load python/anaconda3/2020.7
module load python/3.7.0
module add cuda/10.2
module add cmake/3.12.2
module load cmake/3.12.2
module load git/2.18.0

创建一个software的目录放在home目录下(当然放在哪里都行,方便为主)

cd ~
mkdir software
cd ~/software

下载bazel模块。请注意,一定要用0.25.1,既不要高也不要低,这是个大坑。笔者在编译过程中用了或高或低的版本,都遇到了报错,反复试了很多遍才搞定。

./bazel-0.25.1-installer-linux-x86_64.sh --user  后面建议加--user,否则会遇到permission的报错。因为放在自己的bin下不会被拒绝访问,不加user会放在管理员账户上,造成权限受限。

这一步如果出现grpc的gettid函数的报错,请关注湖南大学硕士生何健同学的解决方案。https://zhuanlan.zhihu.com/p/367794526

wget https://github.com/bazelbuild/bazel/releases/download/0.25.1/bazel-0.25.1-installer-linux-x86_64.sh
chmod +x bazel-0.25.1-installer-linux-x86_64.sh
./bazel-0.25.1-installer-linux-x86_64.sh --user

下载2.0.0版本的tensorflow,git命令如果受限,请手动在官网下载包,然后进行配置

./configure命令一路回车下来即可(对于cpu版本)


export PATH="$HOME/bin:$PATH"
git clone https://github.com/tensorflow/tensorflow -b v2.0.0 --depth=1     !!(这里要改成2.4版本)
cd tensorflow
./configure

开始编译tensorflow,这步骤时间很长,请耐心等待,如有报错,大概率是conda环境没有加载好的问题,请返回仔细查看(此步骤及其耗费资源,会自动占慢登录节点,用此步骤前请提前联系管理员不要把进程kill掉)

bazel build -c opt --verbose_failures //tensorflow:libtensorflow_cc.so

在software下创建一个tensorflowc++目录,用于存放tensorflowc++的链接地址。定义一个tensorflow_root的环境变量,指向tensorflowc++文件夹。


cd ..
mkdir tensorflowc++
cd tensorflowc++
export tensorflow_root=`pwd`

注意/work/para-test/software修改为自己的目录

cd   /work/para-test/software/tensorflow
mkdir -p $tensorflow_root
mkdir $tensorflow_root/lib
cp -d bazel-bin/tensorflow/libtensorflow_cc.so* $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_framework.so* $tensorflow_root/lib/

注意将tensorflowc++/更改写入权限,否则bazel-bin对其写入会受到权限问题从而报错。这是个大坑,请注意

cd ..
chmod -R +w ./tensorflowc++/
cd tensorflow

mkdir -p $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_cc.so* $tensorflow_root/lib/
cp -d bazel-bin/tensorflow/libtensorflow_framework.so* $tensorflow_root/lib/cp -d $tensorflow_root/lib/libtensorflow_framework.so.2 $tensorflow_root/lib/libtensorflow_framework.so
mkdir -p $tensorflow_root/include/tensorflow 
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-genfiles/ $tensorflow_root/include/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' tensorflow/cc $tensorflow_root/include/tensorflow/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' tensorflow/core $tensorflow_root/include/tensorflow/
rsync -avzh --include '*/' --include '*' --exclude '*.cc'  third_party/ $tensorflow_root/include/third_party/
rsync -avzh --include '*/' --include '*' --exclude '*.txt' bazel-tensorflow/external/eigen_archive/Eigen/ $tensorflow_root/include/Eigen/
rsync -avzh --include '*/' --include '*' --exclude '*.txt' bazel-tensorflow/external/eigen_archive/unsupported/ $tensorflow_root/include/unsupported/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-tensorflow/external/com_google_protobuf/src/google/ $tensorflow_root/include/google/
rsync -avzh --include '*/' --include '*.h' --include '*.inc' --exclude '*' bazel-tensorflow/external/com_google_absl/absl/ $tensorflow_root/include/absl/

cd ..

 

第二:deepmd-kit的安装&deepmd-kit C++库的编译;

这一步直接在git下载1.3.3的deepmd-kit即可,用pip安装deepmd-kit,注意,要安装一下dargs,否则在安装过程会报错。这个在官网上也提到过,请注意。

git clone --recursive https://github.com/deepmodeling/deepmd-kit.git deepmd-kit
cd deepmd-kit

git clone --recursive https://github.com/deepmodeling/dargs dargs
cd dargs

pip install --upgrade pip --user
pip install .  --user

cd ..

pip install . --user

接下来编译deepkit C++库 ,定义一个deepmd_root的环境变量,指向deepmdc++文件夹。 在编译过程中,如果服务器意外掉线,请重新定义$tensorflow_root 和$deepmd_root,因为如果掉线,就会丢失环境指针。

cd ~/software
mkdir deepmdc++
git clone https://github.com/deepmodeling/deepmd-kit
mkdir /work/para-test/software/deepmd-kit/source/build
cd  /work/para-test/software/deepmdc++
export deepmd_root=`pwd`

cd   /work/para-test/software/deepmd-kit/source/build

cmake -DUSE_CUDA_TOOLKIT=true -DTENSORFLOW_ROOT=$tensorflow_root -DCMAKE_INSTALL_PREFIX=$deepmd_root ..

直接用gcc的make进行编译即可,j后面的数字代表你使用登录节点cpu的数目,例如南科大太乙的的登录节点是72核,我们使用40核进行编译(目的是不拖慢大家在登录节点的速度。)

make -j40 && make install
make lammps

cp -r USER-DEEPMD/ /work/para-test/apps/lammps-29Oct20/src

至此结束,生成的USER-DEEPMD拷贝到lammps中的src,等待make。

 

 

第三:lammps的下载与c++库建立链接、编译。

进入src目录

cd   /work/para-test/apps/lammps-29Oct20/src

加载intel以及mpi的module,建议使用较新版本

module load intel/2020.4
module load mpi/intel/2020.4

这步骤将官网的更新包自动加入编译,加入之后,运行速度比不加快1倍,亲测。

make lib-kim args="-b -a everything" 

之后加入deepmd模块进行makelist

make yes-user-deepmd
make yes-kspace
make yes-user-intel

利用mpi或者intel_cpu_intelmpi进行正式编译

make intel_cpu_intelmpi -j72

至此会生成lmp或者intel_lmp文件,编写提交脚本之后(请不要私信询问如何写提交作业脚本问题),可以得到deepmd内嵌的lammps。该版本lammps可以直接使用deepmd训练出来的势函数.pb文件,具体用法不再此赘述。

 

如有在编译过程中遇到细节问题,欢迎电邮本人[email protected]

 

 

Jia’ao WANG

22:34 2021-04-22 于南方科大工学院

 

你可能感兴趣的:(Deepmd,tensorflow,神经网络,机器学习)