A pretrained universal neural network potential for
charge-informed atomistic modeling (see publication)

CHGNet highlights its ability to study electron interactions and charge distribution in atomistic modeling with near DFT accuracy. The charge inference is realized by regularizing the atom features with DFT magnetic moments, which carry rich information about both local ionic environments and charge distribution.
Pretrained CHGNet achieves SOTA performance on materials stability prediction from unrelaxed structures according to Matbench Discovery [repo].
| Notebooks | Links | Descriptions |
|---|---|---|
| CHGNet Basics | Examples for loading pre-trained CHGNet, predicting energy, force, stress, magmom as well as running structure optimization and MD. | |
| Tuning CHGNet | Examples of fine tuning the pretrained CHGNet to your system of interest. | |
| Visualize Relaxation | Crystal Toolkit that visualizes atom positions, energies and forces of a structure during CHGNet relaxation. |
pip install chgnetView API docs.
Pretrained CHGNet can predict the energy (eV/atom), force (eV/A), stress (GPa) and
magmom (
from chgnet.model.model import CHGNet
from pymatgen.core import Structure
chgnet = CHGNet.load()
structure = Structure.from_file('examples/mp-18767-LiMnO2.cif')
prediction = chgnet.predict_structure(structure)
for key, unit in [
("energy", "eV/atom"),
("forces", "eV/A"),
("stress", "GPa"),
("magmom", "mu_B"),
]:
print(f"CHGNet-predicted {key} ({unit}):\n{prediction[key[0]]}\n")Charge-informed molecular dynamics can be simulated with pretrained CHGNet through ASE python interface (see below),
or through LAMMPS.
from chgnet.model.model import CHGNet
from chgnet.model.dynamics import MolecularDynamics
from pymatgen.core import Structure
import warnings
warnings.filterwarnings("ignore", module="pymatgen")
warnings.filterwarnings("ignore", module="ase")
structure = Structure.from_file("examples/mp-18767-LiMnO2.cif")
chgnet = CHGNet.load()
md = MolecularDynamics(
atoms=structure,
model=chgnet,
ensemble="nvt",
temperature=1000, # in K
timestep=2, # in femto-seconds
trajectory="md_out.traj",
logfile="md_out.log",
loginterval=100,
use_device="cpu", # use 'cuda' for faster MD
)
md.run(50) # run a 0.1 ps MD simulationVisualize the magnetic moments after the MD run
from ase.io.trajectory import Trajectory
from pymatgen.io.ase import AseAtomsAdaptor
from chgnet.utils import solve_charge_by_mag
traj = Trajectory("md_out.traj")
mag = traj[-1].get_magnetic_moments()
# get the non-charge-decorated structure
structure = AseAtomsAdaptor.get_structure(traj[-1])
print(structure)
# get the charge-decorated structure
struct_with_chg = solve_charge_by_mag(structure)
print(struct_with_chg)CHGNet can perform fast structure optimization and provide site-wise magnetic moments. This makes it ideal for pre-relaxation and
MAGMOM initialization in spin-polarized DFT.
from chgnet.model import StructOptimizer
relaxer = StructOptimizer()
result = relaxer.relax(structure)
print("CHGNet relaxed structure", result["final_structure"])Fine-tuning will help achieve better accuracy if a high-precision study is desired. To train/tune a CHGNet, you need to define your data in a
pytorch Dataset object. The example datasets are provided in data/dataset.py
from chgnet.data.dataset import StructureData, get_train_val_test_loader
from chgnet.trainer import Trainer
dataset = StructureData(
structures=list_of_structures,
energies=list_of_energies,
forces=list_of_forces,
stresses=list_of_stresses,
magmoms=list_of_magmoms,
)
train_loader, val_loader, test_loader = get_train_val_test_loader(
dataset, batch_size=32, train_ratio=0.9, val_ratio=0.05
)
trainer = Trainer(
model=chgnet,
targets="efsm",
optimizer="Adam",
criterion="MSE",
learning_rate=1e-2,
epochs=50,
use_device="cuda",
)
trainer.train(train_loader, val_loader, test_loader)- The target quantity used for training should be energy/atom (not total energy) if you're fine-tuning the pretrained
CHGNet. - The pretrained dataset of
CHGNetcomes from GGA+U DFT withMaterialsProject2020Compatibilitycorrections applied. The parameter for VASP is described inMPRelaxSet. If you're fine-tuning withMPRelaxSet, it is recommended to apply theMP2020compatibility to your energy labels so that they're consistent with the pretrained dataset. - If you're fine-tuning to functionals other than GGA, we recommend you refit the
AtomRef. CHGNetstress is in units of GPa, and the unit conversion has already been included indataset.py. SoVASPstress can be directly fed toStructureData- To save time from graph conversion step for each training, we recommend you use
GraphDatadefined indataset.py, which reads graphs directly from saved directory. To create saved graphs, seeexamples/make_graphs.py. - The Pytorch
MPSbackend (Apple’s Metal Performance Shaders) is currently disabled until a stable version ofpytorchforMPSis released.
The Materials Project trajectory (MPtrj) dataset used to pretrain CHGNet is available at figshare.
The MPtrj dataset consists of all the GGA/GGA+U DFT calculations from the September 2022 Materials Project. By using the MPtrj dataset, users agree to abide the Materials Project terms of use.
If you use CHGNet or MPtrj dataset, please cite this paper:
@article{deng_2023_chgnet,
title={CHGNet as a pretrained universal neural network potential for charge-informed atomistic modelling},
DOI={10.1038/s42256-023-00716-3},
journal={Nature Machine Intelligence},
author={Deng, Bowen and Zhong, Peichen and Jun, KyuJung and Riebesell, Janosh and Han, Kevin and Bartel, Christopher J. and Ceder, Gerbrand},
year={2023},
pages={1–11}
}CHGNet is under active development, if you encounter any bugs in installation and usage,
please open an issue. We appreciate your contributions!