MatRIS: Toward Reliable and Efficient Pretrained Machine Learning Interatomic Potentials
Official PyTorch implementation of MatRIS (Materials Representation and Interaction Simulation), a pretrained interatomic potential for materials simulation.
Update
Oct 2026
- Optimized kernels and
torch.compilesupport (~5× faster inference). - TorchSim integration.
- New models: OMat24 and the MatPES PBE/r2SCAN family.
Installation
- Python ≥ 3.12, PyTorch ≥ 2.11
- NumPy, ASE, pymatgen, nvalchemi-toolkit-ops, Ninja
Pretrained Models
We offer seven pretrained models:
| Model key | Checkpoint | Dataset | Target |
|---|---|---|---|
matris_10m_omat |
Download | OMat24 | efs |
matris_10m_oam |
Download | OMat24 → sAlex + MPtrj | efsm |
matris_10m_mp |
Download | MPtrj | efsm |
matris_4m_matpes_pbev1 |
Download | MatPES-PBE (2025.1) | efs |
matris_4m_matpes_pbev2 |
Download | MatPES-PBE (2025.2) | efs |
matris_4m_matpes_r2scanv1 |
Download | MatPES-r2SCAN (2025.1) | efs |
matris_4m_matpes_r2scanv2 |
Download | MatPES-r2SCAN (2025.2) | efs |
If you need other models, feel free to contact me.
Usage
There are some examples how to use MatRIS, including calculator, geometry optimization, molecular dynamics and TorchSim.
ASE Calculator
from ase.build import bulk
import torch
from matris.applications.base import MatRISCalculator
device = "cuda" if torch.cuda.is_available() else "cpu"
calc = MatRISCalculator(
model="matris_10m_oam", # model name or checkpoint path
task="efsm",
device=device,
mode="fast", # optimized kernel + compile; "torch" for eager mode
activation_checkpoint=True, # set True for adaptive memory-saving recomputation
tf32=False, # set True to allow TF32 in interaction blocks (~1.5x faster)
)
atoms = bulk("Cu", cubic=True)
atoms.calc = calc
energy = atoms.get_potential_energy() # total energy, eV
forces = atoms.get_forces() # eV/A
stress = atoms.get_stress() # eV/A^3, ASE convention
magmoms = atoms.get_magnetic_moments() # muB
Structure Optimization
from ase.build import bulk
import torch
from matris.applications.relax import StructOptimizer
device = "cuda" if torch.cuda.is_available() else "cpu"
optimizer = StructOptimizer(
model="matris_10m_oam",
task="efsm",
optimizer="FIRE",
device=device,
mode="fast",
activation_checkpoint=False,
tf32=False,
)
atoms = bulk("Cu", cubic=True)
result = optimizer.relax(
atoms=atoms,
verbose=True,
steps=500,
fmax=0.05,
relax_cell=True,
ase_filter="FrechetCellFilter",
)
final_structure = result["final_structure"]
trajectory = result["trajectory"]
Molecular Dynamics
from ase.build import bulk
from matris.applications import MolecularDynamics
atoms = bulk("Cu", cubic=True)
md = MolecularDynamics(
atoms=atoms,
model="matris_10m_oam",
ensemble="nvt",
temperature=300,
starting_temperature=300,
timestep=1,
trajectory="md_out.traj",
logfile="md_out.log",
loginterval=100,
task="efsm",
device="cuda",
mode="fast",
activation_checkpoint=False,
tf32=True,
)
md.run(1000)
md.set_atoms(new_atoms) restarts the integrator and step count for a new system,
retains the calculator, and appends trajectory output. Reattach custom ASE
observers to md.dyn after replacing atoms.
TorchSim
Install torch-sim-atomistic, then use pretrained names or local weights:
import torch
import torch_sim as ts
from ase.build import bulk
from matris.applications.torchsim import MatRISTorchSimModel
model = MatRISTorchSimModel(
model="matris_10m_oam",
target="efsm", # OAM/MP: efsm; OMat/MatPES: efs
device="cuda",
mode="fast",
activation_checkpoint=True,
tf32=False,
)
state = ts.io.atoms_to_state(
[bulk("Si", "diamond", a=5.43)], device=model.device, dtype=torch.float32,
)
results = model(state) # energy (eV), forces (eV/Å), stress (eV/ų), magmoms (μB)
state = ts.integrate(
state, model, integrator=ts.Integrator.nvt_langevin,
n_steps=100, temperature=300, timestep=0.001, # ps
)
Citation
If you use MatRIS in your work, please cite:
@inproceedings{
zhou2026matris,
title={Mat{RIS}: Toward Reliable and Efficient Pretrained Machine Learning Interatomic Potentials},
author={Yuanchang Zhou and Siyu Hu and Xiangyu Zhang and Hongyu Wang and Guangming Tan and Weile Jia},
booktitle={The Fourteenth International Conference on Learning Representations},
year={2026},
url={https://openreview.net/forum?id=5xBT5Ziute}
}
License
MatRIS is licensed under the BSD-3-Clause License. See LICENSE for details.
Metadata
Release files for matris 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| matris-1.0.0.tar.gz | 81.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| matris-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 167.4 kB
Release files / matris-1.0.0.tar.gz
| Download URL | matris-1.0.0.tar.gz |
|---|---|
| Size | 81.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
35564980ba57a47eb128a52cabffc046c7cf3ddc3eb7a85d7b897f0bb8653bd3
|
|
BLAKE2b-256 checksum How to use checksums |
02d2e6b642589fca0af1f1d0c214f58cdf4f4c1b72ffd33d91b1c9a209957f93
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|
Release files / matris-1.0.0-py3-none-any.whl
| Download URL | matris-1.0.0-py3-none-any.whl |
|---|---|
| Size | 85.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3c8495ee8a9010f52d8c75c6e2ec6da2c66a8a2b7703ba1ecd3b621203fe871a
|
|
BLAKE2b-256 checksum How to use checksums |
15c0962a380445ed4dd33b372a0b57d8f15ad5fbee1447f2dbd9d29f5f3c1c03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.13
|