marathon
modular training infrastructure for machine-learning interatomic potentials in JAX
pheidippides would be a great name for a message-passing neural network
marathon is an experimental jax/flax-oriented toolkit for prototyping machine-learning interatomic potentials. It does not provide a finished and polished training loop; instead it provides a few composable parts that can be assembled and adapted as needed for experiments. It's therefore not intended as user-facing production code, instead it aims to make experiments faster and more pleasant.
| Module | Description |
|---|---|
marathon.data |
Process ase.Atoms into padded batches with a flexible properties system |
marathon.evaluate |
Predict energy, forces, stress; compute loss (MSE/Huber) and metrics (MAE, RMSE, R2) |
marathon.emit |
Checkpointing, logging (text, W&B), diagnostic plots |
marathon.io |
Read/write msgpack and yaml; serialize flax.nn.Module instances |
marathon.elemental |
Per-element energy baselines via linear regression |
marathon.grain |
Scalable data pipelines with grain for large datasets |
marathon.extra.edge_to_edge |
Fixed-size neighborhood batching for PET-style edge transformers |
Since the library is aimed at active research and is used and adapted as needed, there is no documentation beyond README.md files at each module level explaining terminology, notation, and sometimes the idea behind the design of a subpackage. This avoids the risk of documentation and code going out of sync -- at the cost of requiring more code reading. (Luckily, the computers can do some of the reading nowadays...)
Anyhow, you are encouraged to fork and adapt marathon for your personal experiments. PRs with self-contained and reusable features are welcome.
Installation
The main dependency is jax; detailed installation instructions are here. Typically, the standard install works fairly well:
pip install "jax[cuda13]" # or jax[cpu] for CPU-only
pip install -e .
marathon provides a number of extras, installable via pip install -e ".[all]". They are required to run some parts of the code but not automatically installed to avoid dependency resolution hell in HPC systems.
pip install -e ".[grain]" # grain pipelines: grain, mmap_ninja, numba
pip install -e ".[dev]" # development: pytest, ruff
pip install -e ".[wandb]" # Weights & Biases logging
pip install -e ".[plot]" # plotting: matplotlib, scipy
For convenience, marathon looks for an environment variable named DATASETS and turns it into a Path at marathon.data.datasets. If the variable is not set, it defaults to the current working directory.
Quick start
For datasets that can be fully fit into (GPU) memory (do this ahead of time to fixed size and shuffle on GPU):
from marathon.data import to_sample, batch_samples, determine_max_sizes
samples = [to_sample(atoms, cutoff=5.0) for atoms in my_atoms]
num_atoms, num_pairs = determine_max_sizes(samples, batch_size=4)
batch = batch_samples(samples, num_atoms, num_pairs, keys=["energy", "forces"])
For large-scale training with grain pipelines (streaming data from disk through a series of transforms):
from marathon.grain import DataSource, DataLoader, IndexSampler, ToSample, ToFixedLengthBatch
ds = DataSource("path/to/prepared/dataset")
sampler = IndexSampler(len(ds), shuffle=True, seed=0)
loader = DataLoader(
data_source=ds,
sampler=sampler,
operations=[ToSample(cutoff=5.0), ToFixedLengthBatch(batch_size=4)],
)
Development
pip install -e ".[dev]"
ruff format . && ruff check --fix .
python -m pytest
Linting and formatting is done by ruff. We use a line length of 92, but it is not enforced by the linter, only by the formatter. This avoids hassle when lines can't be shortened automatically. We also suppress some rules that get in the way of research code: short variable names (E741), lambdas (E731), and non-top-level imports (E402). Import ordering groups numpy and jax before other third-party packages.
The code itself tends towards concise and functional: descriptive names, minimal docstrings (only where behaviour isn't obvious from context), and liberal use of lambdas and comprehensions. Many modules include inline tests at the bottom that run on import.
Logo designed by overripemango.
Release files for marathon-train 0.3.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| marathon_train-0.3.1.tar.gz | 44.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| marathon_train-0.3.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 102.0 kB
Release files / marathon_train-0.3.1.tar.gz
| Download URL | marathon_train-0.3.1.tar.gz |
|---|---|
| Size | 44.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cdc85e478ddd496f6ebac7a4169abe05575daad14b39d2fa9dd88b5034a71924
|
|
BLAKE2b-256 checksum How to use checksums |
3efe71dc48d349b0b9404e8e39741c27768043613ed5bd3d0a4db5dd3f3b03df
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency logRelease files / marathon_train-0.3.1-py3-none-any.whl
| Download URL | marathon_train-0.3.1-py3-none-any.whl |
|---|---|
| Size | 57.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3a1b62ee964d6b68cee0f8f41952eb76d59a230c963f0c431c2d3df204e77ec8
|
|
BLAKE2b-256 checksum How to use checksums |
bb5a510183daaacb602323b6f9a4a0002410b1bf827eaf7dc08eccfdb60ea1d9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 24, 2026.
Transparency log