在LAMMPS中使用CHGNet

0.前言

CHGNet是一种基于图神经网络的机器学习原子势,近期发表于Nature Machine Intelligence volume 5, pages1031–1041 (2023)。笔者注意到近期有开发者已经完成了CHGNet的LAMMPS接口(https://github.com/CederGroupHub/chgnet/issues/57)。但目前网络上还没有相关的使用教程,因此在此记录一下笔者编译以及测试的过程。

此教程也可用于M3GNet和MatGL接口的使用。

1.安装并配置Anaconda

由于CHGNet使用Python实现,因此需要先确保服务器配置了Python环境,如果没有安装推荐安装Anaconda(官方文档:https://docs.anaconda.com/free/anaconda/install/linux/)来配置Python环境。并需要确保已经安装了chgnet,可以使用下面的命令进行安装。

pip install chgnet

2.获取源代码

实现了CHGNet接口的LAMMPS程序源码可以在Github上获取到(https://github.com/advancesoftcorp/lammps)。提供了2Aug2023和2Aug2023两个版本可供选择,下载源码并解压。Lammps提供了基于CMake和make的两种编译方式,本文使用make进行编译。

3.修改Makefile

进入下载好的源代码的./src/MAKE目录,找到Makefile文件。由于CHGNet接口仅支持调用GPU和OpenMP,而不支持MPI并行,因此本文以编译串行(Serial)版本为例,也就是修改Makefile.serial。共有三处需要修改。

(1)修改CCFLAGS和LINKFLAGS(如果需要使用OpenMP)

根据官网文档(https://docs.lammps.org/Build_extras.html#openmp),使用OpenMP需要修改compiler/linker settings部分的下面两行,加入-fopenmp参数。

CCFLAGS = -g -O3 -std=c++11 -fopenmp
LINKFLAGS = -g -O -std=c++11 -fopenmp

如果使用Intel编译器,则需要将CCFLAGS替换成-qopenmp -restrict,LINKFLAGS替换成-qopenmp。

(2)加入Python相关的includes和library变量

在Makefile的build rules and dependencies之前的位置加入下列内容,your_path/anaconda3需要替换成本地实际的Python路径,python3.x需要替换成实际的python版本号,如python3.11,如果不确定可以通过find命令进行查找。这里需要注意如果服务器上有多个Python环境,务必使用安装了chgnet的环境的路径进行添加

# Python library and includes (for conda)
PYTHON_INC = -I/your_path/anaconda3/include/python3.x
PYTHON_LIB = -L/your_path/anaconda3/lib -lpython3.x

(3)修改EXTRA_INC和EXTRA_LIB,加入Python的相关变量

这两行位于build rules and dependencies部分,分别加入$(PYTHON_INC)和$(PYTHON_LIB)。

EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PYTHON_INC) $(PKG_SYSINC)
EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PYTHON_LIB) $(PKG_SYSLIB) $(DYN_LIB)

修改好Makefile后,我们就可以回到./src目录,开始正式的编译安装了。

4.编译安装

LAMMPS在编译时,如果需要编译额外的可选包,需要使用如下的命令,name需要替换成实际的包名(https://docs.lammps.org/Build_extras.html):

make yes-name

同理也可以使用make no-name删除某个可选包。

在这里,我们需要加入CHGNet和OpenMP(可选),即

make yes-OPENMP
make yes-ML-CHGNET

之后进行正式编译,将-jN中的N替换为编译实际使用的核数。

make serial -jN

这里特别提醒,如果之前编译过其他版本,需要使用下面的命令进行清理再重新进行编译。

make clean-all

完成编译后,如果没有报错,src目录下应该出现了名为lmp_serial的二进制文件,即为我们编译的LAMMPS程序了。可以复制到其他目录,配置环境变量,以方便使用。

5.运行测试

在./examples/CHGNET,我们可以看到开发者提供的输入样例inp.lammps,其中pair_style和pair_coeff格式如下:

pair_style chgnet ../../potentials/CHGNET 
#pair_style chgnet/d3 ../../potentials/CHGNET 
#pair_style chgnet/gpu ../../potentials/CHGNET 
#pair_style chgnet/d3/gpu ../../potentials/CHGNET
# 使用MPtrj预训练模型
pair_coeff    * *  MPtrj-efsm  Zr O
# 使用自己的pt模型
pair_coeff    * *  path ./users_model.pt  Zr O

使用命令env OMP_NUM_THREADS=N lmp_serial -sf omp -in inp.lammps,我们可以使用N个OpenMP threads来执行任务。OpenMP的使用细节可以参考官方文档:https://docs.lammps.org/Speed_omp.html。

此外,需要注意的是,如果要在集群的作业系统上提交,我们还需要在作业脚本中加入LD_LIBRARY_PATH环境变量,与Makefile中的修改类似,将/your_path/anaconda3改成实际的Python目录:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your_path/anaconda3/lib

6.常见问题

(1)LAMMPS运行时警告:WARNING: OpenMp support not enabled during compilation: using 1 thread only.

检查Makefile是否有加入-fopenmp,以及是否有启用make yes-OPENMP。

(2)LAMMPS运行时报错:ERROR: Cannot initialize python for pair_coeff of CHGNet

说明CHGNet的Python环境未正确配置,需要调整Python环境。