Running the model in LAMMPS or ASE¶
Dependencies¶
Physics based KIM models can run from LAMMPS or ASE out of the box. You just need to install them as
kim-api-collections-management install system <model name>
However, for running the ML models you need install few dependencies first, namely - libtorch (C++ API for Pytorch) - libtorchscatter and libtorchsparse
Attention
Installing libtorch in same LD_LIBRARY_PATH as Pytorch can crash your pytorch installation (segfaults), which will mean that you will need to remove the libtorch from
the environment path everytime you neet to train. Therefore it is recommended that you create a new conda env, specifically for running the models.
Let us create a fresh environment and install required dependencies
conda create -n kliff_run
conda activate kliff_run
conda install lammps kimpy ase=3.22 python=3.9 unzip -c conda-forge
If you want to use the descriptor based models as well, then install libdescriptor, and set its root path
conda install libdescriptor -c ipcamit -c conda-forge
export LIBDESCRIPTOR_ROOT=$CONDA_PREFIX
Tip
If you are using GPU based systems, then it is advisable to use CMake version 3.18, with recommended CUDA version 11.7. Newer versions of CMake fail to detect CUDA environments correctly. You can install CMake as
conda install cmake=3.18 -c conda-forge
Now, installing libtorch and other dependencies is simple, for most systems you can just download the binaries and use them directly. If you are working in a Linux environment, OpenKIM provides an easy-to-use installation script that you can use as:
wget https://openkim.org/files/MD_173118614730_001/install_dependencies.sh
bash install_dependencies.sh
wget https://gist.githubusercontent.com/ipcamit/25b9de5ab823fe00f8eaae89ef8c60d4/raw/1c2cf62ef3e9f2108e5227feb9cb50d203422a35/install_macos_dependencies.sh
bash install_macos_dependencies.sh
Following the installation, just source the produces env.sh file:
source env.sh
source env.sh
# For runtime
cp $TorchSparse_ROOT/lib/libtorchsparse.dylib $CONDA_PREFIX/lib/
cp $TorchScatter_ROOT/lib/libtorchscatter.dylib $CONDA_PREFIX/lib/
cp $TORCH_ROOT/lib/* $CONDA_PREFIX/lib/
and now you are ready to install the required model driver
Note
KIM-API system install location on MacOS is a hit-or-miss, so it is recommended to use user install location for MacOS.
Also due to older libtorch versions not being available for MacOS, you need to install the TorchML driver manually.
This is mainly because newer versions of libtorch specifically need C++17 support.
kim-api-collections-management install user TorchML__MD_173118614730_000
wget https://openkim.org/download/TorchML__MD_173118614730_000.txz
tar -xvf TorchML__MD_173118614730_000.txz
sed -i '' 's/libdescriptor.so/libdescriptor.dylib/' TorchML__MD_173118614730_000/CMakeLists.txt
sed -i '' 's/PROPERTY CXX_STANDARD 14/PROPERTY CXX_STANDARD 17/' TorchML__MD_173118614730_000/MLModel/CMakeLists.txt
kim-api-collections-management install user TorchML__MD_173118614730_000
Testing the installation¶
Let us install a simple Stillinger-Weber potential for Silicon and test it
kim-api-collections-management install user SW_StillingerWeber_1985_Si__MO_405512056662_006
from ase.calculators.kim.kim import KIM
from ase.build import bulk
si = bulk("Si")
model = KIM("SW_StillingerWeber_1985_Si__MO_405512056662_006")
si.calc = model
print(si.get_potential_energy())
print(si.get_forces())
Using your models¶
You can install you models now as any other KIM model,
kim-api-collections-management install user SchNet1__MO_111111111111_000
Now that your model is installed, you can use it in LAMMPS and ASE,
ASE¶
RUN with SW first.
from ase.calculators.kim.kim import KIM
from ase.build import bulk
si = bulk("Si")
model = KIM("SchNet1__MO_111111111111_000")
si.calc = model
print(si.get_potential_energy())
print(si.get_forces())
LAMMPS¶
Save the following script as in.lammps,
# Define KIM model and get Si diamond lattice parameter for this potential
kim init SchNet1__MO_111111111111_000 metal
# Setup diamond crystal
boundary p p p
lattice diamond 5.44
region simbox block 0 1 0 1 0 1 units lattice
create_box 1 simbox
create_atoms 1 box
mass 1 28.0855
# Define atom type to species mapping
kim interactions Si
# Compute energy
run 0
You can now run the LAMMPS script as
lmp_serial -i in.lammps
Common Errors¶
std::optional error
During the installation of dependencies (from install script) you might get an error looking like
... ATen/core/boxing/impl/make_boxed_from_unboxed_functor.h:201:37: note: 'std::integral_constant<bool, false>::value' evaluates to false
did you forgot #include <optional>
Requires CXX17 support..
This indicates that for some reason you are installing a mismatched version of torch scatter or torchsparse libraries. Either try to download the install script again, or try the copy of latest install script as
wget https://gist.githubusercontent.com/ipcamit/646573856b7f5735edd7048687d9655a/raw/d9e2cd51436b3f0a14ec5366f2335575801831fe/install_dependencies.sh
Python not found
CMake Error at CMakeLists.txt:28 (add_library):
Target "torchscatter" links to target "Python3::Python" but the target was
not found. Perhaps a find_package() call is missing for an IMPORTED
target, or an ALIAS target is missing?
This error usually means that you are using python > 3.9 with CMake == 3.18. CMake 3.18 has hardcoded python version <=3.9 string, making it yield an error. You have two options,
use latest CMAKE and no CUDA/GPU
use CMAKE 3.18 python <= 3.9
Another option for using python >3.9 with CMAKE 3.18 is to patch the the CMAKE python module as
sed -i "25s/set(_\${_PYTHON_PREFIX}_VERSIONS /set(_\${_PYTHON_PREFIX}_VERSIONS $(python -c 'import sys; print(f"{sys.version_info[0]}.{sys.version_info[1]}")') /" $CONDA_PREFIX/share/cmake-3.18/Modules/FindPython/Support.cmake
Tip
This will only work on CMake 3.18, and only do it if you absolutely need the GPU support. It prepends your current python version to the Line 25 of CMake module.
dyld[19429]: symbol not found in flat namespace '_error_top'in lammps
LAMMPS is not properly installed. You can try to reinstall LAMMPS,
conda remove lammps
conda install lammps -c conda-forge
GLIBCXX_3.X.X not found
version `GLIBCXX_3.4.29' not found (required by /opt/mambaforge/mambaforge/envs/kliff_run/lib/libkim-api.so.2)
This error usually means that you are using a different version of GCC than the one used to compile the KIM-API. Just set the following environment variable before running the code,
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
lmp_serial command not found
Sometimes in some conda environments, the LAMMPS binary is called lmp, so try
lmp -in in.lammps
Missing KIM model during ASE/LAMMPS runs
ase.calculators.kim.exceptions.KIMModelNotFound: Could not find model <> installed
in any of the KIM API model collections on this system.
See https://openkim.org/doc/usage/obtaining-models/ for instructions on installing models.
It usually happens when you have multiple kim-api installations, and the ASE/LAMMPS is not able to find the correct one. Easiest solution can be to restart the terminal and load the correct conda environment. If that does not help, try the following (solution i. is recommended),
using kim-api-activate
source kim-api-activate
set LD_LIBRARY_PATH manually
export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH
Making changed permanent¶
Attention
This can potentially mess up your conda install. So only do this if you understand the risks. Also for MacOS you do not need the instructions below, as anyway you are copying the libraries to the conda environment.
If you want to ensure that everytime you activate your conda environment it loads all the dependencies on itself, without source env.sh, you can create activation hooks in conda environment. Please make sure that you are in same folder as your env.sh file and run,
conda activate kliff_run
[[ -f env.sh ]] || { echo "Error: env.sh not found"; return; }
# Create hooks directories
mkdir -p "$CONDA_PREFIX/etc/conda/activate.d" "$CONDA_PREFIX/etc/conda/deactivate.d"
env_prefix=$CONDA_PREFIX
# Generate activation script
echo "#\!/bin/bash" > "$CONDA_PREFIX/etc/conda/activate.d/env_activate.sh"
echo "export _OLD_LD_LIBRARY_PATH=\$LD_LIBRARY_PATH" >> "$CONDA_PREFIX/etc/conda/activate.d/env_activate.sh"
echo "export _OLD_PATH=\$PATH" >> "$CONDA_PREFIX/etc/conda/activate.d/env_activate.sh"
cat env.sh >> "$CONDA_PREFIX/etc/conda/activate.d/env_activate.sh"
conda deactivate
# Generate deactivation script
echo "#\!/bin/bash" > "$env_prefix/etc/conda/deactivate.d/env_deactivate.sh"
echo "export LD_LIBRARY_PATH=\$_OLD_LD_LIBRARY_PATH" >> "$env_prefix/etc/conda/deactivate.d/env_deactivate.sh"
echo "export PATH=\$_OLD_PATH" >> "$env_prefix/etc/conda/deactivate.d/env_deactivate.sh"
echo "unset _OLD_LD_LIBRARY_PATH" >> "$env_prefix/etc/conda/deactivate.d/env_deactivate.sh"
echo "unset _OLD_PATH" >> "$env_prefix/etc/conda/deactivate.d/env_deactivate.sh"
Now everytime you activate the environment, it will automatically load the dependencies. You can test this by opening a new terminal and running
conda activate kliff_run
lmp_serial -in in.lammps