maltefranke commited on
Commit
7611e15
·
verified ·
1 Parent(s): 3bba754

Place training config bundles alongside each model and simplify documentation

Browse files
README.md CHANGED
@@ -45,7 +45,7 @@ discovery for all models in the table. Install it in a Python environment:
45
  ```bash
46
  python -m pip install 'huggingface_hub>=1.0,<2'
47
  hf auth login
48
- hf download maltefranke/morph --revision da1c241d83f2628b172fc510e1bc724ef4429db2 \
49
  --local-dir morph-runtime \
50
  --include 'geom/explicit_h/runtime/*'
51
  python -m pip install ./morph-runtime/geom/explicit_h/runtime
@@ -138,83 +138,28 @@ supports all three published model variants.
138
 
139
  ## Reproducibility
140
 
141
- ### Generate with a fixed release
142
-
143
- Pin the **runtime code and dependencies** as well as the **model bundle**.
144
- This installs the archived shared inference runtime, independently of changes
145
- to this repository or the model catalog. Install [uv](https://docs.astral.sh/uv/)
146
- and authenticate with an account that can access the model repository:
147
-
148
- ```bash
149
- uv tool install 'huggingface_hub==1.33.0'
150
- hf auth login
151
- hf download maltefranke/morph \
152
- --revision da1c241d83f2628b172fc510e1bc724ef4429db2 \
153
- --include 'geom/explicit_h/runtime/*' --local-dir morph-runtime
154
- cd morph-runtime/geom/explicit_h/runtime
155
- uv sync --frozen --no-dev --python 3.13.7
156
- source .venv/bin/activate
157
-
158
- # Run on a compute worker. Save all attempts and their validity flags.
159
- MORPH_COMPILE=0 MORPH_ATTENTION_BACKEND=sdpa MORPH_FLASH_ATTN=0 \
160
- morph generate --model maltefranke/morph --subfolder geom/explicit_h \
161
- --revision b839af108eaade757a5d2d668d05498e8c733c1e --epoch 50 \
162
- --device cuda --ema --steps 100 --seed 42 --batch 64 --batch-size 16 \
163
- --save-trajs --output geom-e50-seed42.sdf
164
- uv pip freeze > environment.txt
165
- nvidia-smi --query-gpu=name,driver_version --format=csv > gpu.csv
166
- ```
167
-
168
- Choose another published run by changing these three options:
169
-
170
- | `--subfolder` | `--revision` | `--epoch` |
171
- | --- | --- | --- |
172
- | `chembl3d/explicit_h` | `ab9bea92f499f03450ebc99459fce04461504a41` | `200`, `300`, `400` |
173
- | `chembl3d/implicit_h` | `ab9bea92f499f03450ebc99459fce04461504a41` | `100`, `200`, `300` |
174
- | `geom/explicit_h` | `b839af108eaade757a5d2d668d05498e8c733c1e` | `50` |
175
-
176
- Keep the seed, batch size, integration steps, EMA selection, precision, attention
177
- backend and software/hardware environment fixed when comparing samples. A seed
178
- alone does not guarantee identical samples across GPU models or library versions.
179
- The checkpoint SHA-256 hashes are in each bundle's `metadata.json`.
180
 
181
- ### Repeat a training recipe
 
 
 
 
 
182
 
183
- The [training archives](https://huggingface.co/maltefranke/morph/tree/main/reproduction)
184
- contain the original source (including `run.py`), saved training config, launcher,
185
- dependency versions, and a portable `train.sh`. They use **2 RTX 4090s, seed 42,
186
- and bf16 mixed precision**. Run installation and training in a compute allocation:
187
 
188
  ```bash
189
- # Start from a directory outside the inference environment above.
190
- run=geom-explicit-h # Or chembl3d-explicit-h, chembl3d-implicit-h, qm9-explicit-h
191
- hf download maltefranke/morph --revision d0332f1c022345956470bb948ada79e5702ed8dc \
192
- "reproduction/$run.tar.gz" reproduction/SHA256SUMS --local-dir morph-training
193
- cd morph-training/reproduction
194
- sha256sum --ignore-missing -c SHA256SUMS
195
- tar -xzf "$run.tar.gz"
196
- cd "$run"
197
- uv venv --python 3.13.7 .venv
198
- uv pip install --python .venv/bin/python -r pyproject.toml \
199
- -c reproduction/requirements-environment.txt
200
- source .venv/bin/activate
201
- export MORPH_DATASET_ROOT=/absolute/path/to/geom # Contains processed/
202
- export MORPH_OUTPUT_DIR="$PWD/outputs/repeat-01"
203
- bash train.sh
204
  ```
205
 
206
- All portable recipes evaluate every epoch and retain every fifth epoch; QM9
207
- retains every **25th** epoch. The archives start fresh and stop at 400 epochs for
208
- explicit-H ChEMBL3D, 300 for implicit-H ChEMBL3D, 50 for GEOM, or 3000 for QM9.
209
- Override the stopping point with `bash train.sh trainer.trainer.max_epochs=100`.
210
- QM9 currently has a training recipe but no published checkpoint.
211
-
212
- These commands reproduce the documented setup, not an exact replay of every
213
- historical run: explicit-H ChEMBL3D resumed at epoch 5 and GEOM at epoch 48;
214
- the older explicit-H ChEMBL3D run also evaluated every five epochs. Data caches
215
- and those intermediate resume checkpoints are not included in the archives.
216
- See [reproducibility details](reproduction/README.md) for the data requirements,
217
- original settings, environment provenance and resume instructions.
218
 
219
  ## Hydrogen handling and training data
220
 
@@ -253,16 +198,17 @@ Each model directory contains:
253
  filenames and checkpoint SHA-256 hashes.
254
  - `training_config.yaml`: the original training configuration for provenance.
255
  - `runtime/`: archived source, configs and dependency specifications.
 
 
256
  - `validation.json`: results of checkpoint loading and sampling checks.
257
 
258
  The published bundles were checked for strict current/EMA weight loading and
259
  end-to-end sampling. These are functionality checks, not validity benchmarks.
260
  The GEOM release also passed remote file-size and hash verification.
261
 
262
- The [ChEMBL3D release manifest](https://huggingface.co/maltefranke/morph/blob/ab9bea92f499f03450ebc99459fce04461504a41/manifest.json)
263
- describes the original ChEMBL3D release at its pinned revision, including its
264
- historical model card. GEOM has its own
265
- [bundle manifest](https://huggingface.co/maltefranke/morph/blob/b839af108eaade757a5d2d668d05498e8c733c1e/geom/explicit_h/manifest.json).
266
  Original training configs contain historical cluster paths; use `config.yaml`
267
  through the inference loader for portable generation.
268
 
 
45
  ```bash
46
  python -m pip install 'huggingface_hub>=1.0,<2'
47
  hf auth login
48
+ hf download maltefranke/morph \
49
  --local-dir morph-runtime \
50
  --include 'geom/explicit_h/runtime/*'
51
  python -m pip install ./morph-runtime/geom/explicit_h/runtime
 
138
 
139
  ## Reproducibility
140
 
141
+ Each model has a **training bundle** with its original training configuration,
142
+ launch settings, frozen source, dependency versions and data references.
143
+ The bundles live alongside the corresponding model files on Hugging Face:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
 
145
+ | Model | Configuration and source |
146
+ | --- | --- |
147
+ | ChEMBL3D, explicit H | [Training bundle](https://huggingface.co/maltefranke/morph/resolve/main/chembl3d/explicit_h/training_bundle.tar.gz) |
148
+ | ChEMBL3D, implicit H | [Training bundle](https://huggingface.co/maltefranke/morph/resolve/main/chembl3d/implicit_h/training_bundle.tar.gz) |
149
+ | GEOM-Drugs, explicit H | [Training bundle](https://huggingface.co/maltefranke/morph/resolve/main/geom/explicit_h/training_bundle.tar.gz) |
150
+ | QM9, explicit H (no published weights yet) | [Training bundle](https://huggingface.co/maltefranke/morph/resolve/main/qm9/explicit_h/training_bundle.tar.gz) |
151
 
152
+ For example, download and unpack the GEOM training bundle:
 
 
 
153
 
154
  ```bash
155
+ hf download maltefranke/morph geom/explicit_h/training_bundle.tar.gz --local-dir .
156
+ tar -xzf geom/explicit_h/training_bundle.tar.gz
 
 
 
 
 
 
 
 
 
 
 
 
 
157
  ```
158
 
159
+ Each bundle also includes a portable training recipe; its changes from the
160
+ original run are recorded alongside it. See the [training bundle guide](reproduction/README.md)
161
+ for setup, data requirements and resuming. Version identifiers and checksums
162
+ are recorded in the release metadata and bundle manifests.
 
 
 
 
 
 
 
 
163
 
164
  ## Hydrogen handling and training data
165
 
 
198
  filenames and checkpoint SHA-256 hashes.
199
  - `training_config.yaml`: the original training configuration for provenance.
200
  - `runtime/`: archived source, configs and dependency specifications.
201
+ - `training_bundle.tar.gz`: original run configuration, source, environment and a
202
+ portable training recipe; `training_bundle.json` records its checksum and provenance.
203
  - `validation.json`: results of checkpoint loading and sampling checks.
204
 
205
  The published bundles were checked for strict current/EMA weight loading and
206
  end-to-end sampling. These are functionality checks, not validity benchmarks.
207
  The GEOM release also passed remote file-size and hash verification.
208
 
209
+ The [ChEMBL3D release manifest](https://huggingface.co/maltefranke/morph/blob/main/manifest.json)
210
+ describes the original ChEMBL3D release, including its historical model card. GEOM has its own
211
+ [bundle manifest](https://huggingface.co/maltefranke/morph/blob/main/geom/explicit_h/manifest.json).
 
212
  Original training configs contain historical cluster paths; use `config.yaml`
213
  through the inference loader for portable generation.
214
 
chembl3d/explicit_h/training_bundle.json ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "chembl3d-explicit-h",
3
+ "source_snapshot": "chembl3d_recovery_20260927_v2",
4
+ "published_completed_epochs": [
5
+ 200,
6
+ 300,
7
+ 400
8
+ ],
9
+ "original_resume_completed_epoch": 5,
10
+ "original_validation_every_epochs": 5,
11
+ "reproduction_validation_every_epochs": 1,
12
+ "checkpoint_every_epochs": 5,
13
+ "seed": 42,
14
+ "devices": 2,
15
+ "gpu": "NVIDIA GeForce RTX 4090",
16
+ "batch_per_gpu": 320,
17
+ "accumulation": 1,
18
+ "precision": "bf16-mixed",
19
+ "recipe_changes": [
20
+ "Portable data/output paths",
21
+ "Fresh initialization; no historical resume",
22
+ "Epoch limit instead of allocation timer",
23
+ "W&B disabled",
24
+ "Evaluation every epoch; best and retained checkpoints every 5 epochs (QM9: 25)"
25
+ ],
26
+ "environment_note": "Python 3.13.7. Installed package versions captured from the shared training environment on 2026-10-08; not an original per-job environment lock.",
27
+ "limits": "Data and historical resume checkpoints are not distributed. Same recipe and seed do not imply a bitwise replay across resumes, hardware or software changes.",
28
+ "archive": "training_bundle.tar.gz",
29
+ "bytes": 422898,
30
+ "sha256": "d72608eb7ce5ce3fced959544c7c5a869ff6ae574d2b9e87e2d7aa1ac0ac1f4a",
31
+ "directory": "chembl3d-explicit-h",
32
+ "model_folder": "chembl3d/explicit_h",
33
+ "source_release": {
34
+ "repo_id": "maltefranke/morph",
35
+ "revision": "d0332f1c022345956470bb948ada79e5702ed8dc",
36
+ "filename": "reproduction/chembl3d-explicit-h.tar.gz"
37
+ },
38
+ "checkpoint_release": {
39
+ "repo_id": "maltefranke/morph",
40
+ "subfolder": "chembl3d/explicit_h",
41
+ "revision": "ab9bea92f499f03450ebc99459fce04461504a41",
42
+ "epochs": [
43
+ 200,
44
+ 300,
45
+ 400
46
+ ]
47
+ },
48
+ "files": {
49
+ "original_config": "reproduction/original_training_config.yaml",
50
+ "portable_config": "configs/reproduce.yaml",
51
+ "original_launcher": "reproduction/original_launcher.sbatch",
52
+ "environment": "reproduction/environment.sh",
53
+ "dependencies": "reproduction/requirements-environment.txt",
54
+ "data_reference": "reproduction/dataset_reference.json",
55
+ "provenance": "reproduction/provenance.json"
56
+ }
57
+ }
chembl3d/explicit_h/training_bundle.tar.gz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d72608eb7ce5ce3fced959544c7c5a869ff6ae574d2b9e87e2d7aa1ac0ac1f4a
3
+ size 422898
chembl3d/implicit_h/training_bundle.json ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "chembl3d-implicit-h",
3
+ "source_snapshot": "chembl3d_implicit_20260928_v2",
4
+ "published_completed_epochs": [
5
+ 100,
6
+ 200,
7
+ 300
8
+ ],
9
+ "original_resume_completed_epoch": null,
10
+ "original_validation_every_epochs": 1,
11
+ "reproduction_validation_every_epochs": 1,
12
+ "checkpoint_every_epochs": 5,
13
+ "seed": 42,
14
+ "devices": 2,
15
+ "gpu": "NVIDIA GeForce RTX 4090",
16
+ "batch_per_gpu": 320,
17
+ "accumulation": 1,
18
+ "precision": "bf16-mixed",
19
+ "recipe_changes": [
20
+ "Portable data/output paths",
21
+ "Fresh initialization; no historical resume",
22
+ "Epoch limit instead of allocation timer",
23
+ "W&B disabled",
24
+ "Evaluation every epoch; best and retained checkpoints every 5 epochs (QM9: 25)"
25
+ ],
26
+ "environment_note": "Python 3.13.7. Installed package versions captured from the shared training environment on 2026-10-08; not an original per-job environment lock.",
27
+ "limits": "Data and historical resume checkpoints are not distributed. Same recipe and seed do not imply a bitwise replay across resumes, hardware or software changes.",
28
+ "archive": "training_bundle.tar.gz",
29
+ "bytes": 241231,
30
+ "sha256": "7add66a5db756b459e15c6c9d0bf75bf6110d007c17f2cc30fbcde4c58ef9695",
31
+ "directory": "chembl3d-implicit-h",
32
+ "model_folder": "chembl3d/implicit_h",
33
+ "source_release": {
34
+ "repo_id": "maltefranke/morph",
35
+ "revision": "d0332f1c022345956470bb948ada79e5702ed8dc",
36
+ "filename": "reproduction/chembl3d-implicit-h.tar.gz"
37
+ },
38
+ "checkpoint_release": {
39
+ "repo_id": "maltefranke/morph",
40
+ "subfolder": "chembl3d/implicit_h",
41
+ "revision": "ab9bea92f499f03450ebc99459fce04461504a41",
42
+ "epochs": [
43
+ 100,
44
+ 200,
45
+ 300
46
+ ]
47
+ },
48
+ "files": {
49
+ "original_config": "reproduction/original_training_config.yaml",
50
+ "portable_config": "configs/reproduce.yaml",
51
+ "original_launcher": "reproduction/original_launcher.sbatch",
52
+ "environment": "reproduction/environment.sh",
53
+ "dependencies": "reproduction/requirements-environment.txt",
54
+ "data_reference": "reproduction/dataset_reference.json",
55
+ "provenance": "reproduction/provenance.json"
56
+ }
57
+ }
chembl3d/implicit_h/training_bundle.tar.gz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7add66a5db756b459e15c6c9d0bf75bf6110d007c17f2cc30fbcde4c58ef9695
3
+ size 241231
geom/explicit_h/training_bundle.json ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "geom-explicit-h",
3
+ "source_snapshot": "geom_resume_e48_20261008",
4
+ "published_completed_epochs": [
5
+ 50
6
+ ],
7
+ "original_resume_completed_epoch": 48,
8
+ "original_validation_every_epochs": 1,
9
+ "reproduction_validation_every_epochs": 1,
10
+ "checkpoint_every_epochs": 5,
11
+ "seed": 42,
12
+ "devices": 2,
13
+ "gpu": "NVIDIA GeForce RTX 4090",
14
+ "batch_per_gpu": 320,
15
+ "accumulation": 1,
16
+ "precision": "bf16-mixed",
17
+ "recipe_changes": [
18
+ "Portable data/output paths",
19
+ "Fresh initialization; no historical resume",
20
+ "Epoch limit instead of allocation timer",
21
+ "W&B disabled",
22
+ "Evaluation every epoch; best and retained checkpoints every 5 epochs (QM9: 25)"
23
+ ],
24
+ "environment_note": "Python 3.13.7. Installed package versions captured from the shared training environment on 2026-10-08; not an original per-job environment lock.",
25
+ "limits": "Data and historical resume checkpoints are not distributed. Same recipe and seed do not imply a bitwise replay across resumes, hardware or software changes.",
26
+ "archive": "training_bundle.tar.gz",
27
+ "bytes": 423904,
28
+ "sha256": "d61d4edc6c530d8efe03016316beecdb30cff1b8228f7c433bb4f98f59606695",
29
+ "directory": "geom-explicit-h",
30
+ "model_folder": "geom/explicit_h",
31
+ "source_release": {
32
+ "repo_id": "maltefranke/morph",
33
+ "revision": "d0332f1c022345956470bb948ada79e5702ed8dc",
34
+ "filename": "reproduction/geom-explicit-h.tar.gz"
35
+ },
36
+ "checkpoint_release": {
37
+ "repo_id": "maltefranke/morph",
38
+ "subfolder": "geom/explicit_h",
39
+ "revision": "b839af108eaade757a5d2d668d05498e8c733c1e",
40
+ "epochs": [
41
+ 50
42
+ ]
43
+ },
44
+ "files": {
45
+ "original_config": "reproduction/original_training_config.yaml",
46
+ "portable_config": "configs/reproduce.yaml",
47
+ "original_launcher": "reproduction/original_launcher.sbatch",
48
+ "environment": "reproduction/environment.sh",
49
+ "dependencies": "reproduction/requirements-environment.txt",
50
+ "data_reference": "reproduction/dataset_reference.json",
51
+ "provenance": "reproduction/provenance.json"
52
+ }
53
+ }
geom/explicit_h/training_bundle.tar.gz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d61d4edc6c530d8efe03016316beecdb30cff1b8228f7c433bb4f98f59606695
3
+ size 423904
qm9/explicit_h/training_bundle.json ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model": "qm9-explicit-h",
3
+ "source_snapshot": "qm9_launch_20261008",
4
+ "published_completed_epochs": [],
5
+ "original_resume_completed_epoch": null,
6
+ "original_validation_every_epochs": 1,
7
+ "reproduction_validation_every_epochs": 1,
8
+ "checkpoint_every_epochs": 25,
9
+ "seed": 42,
10
+ "devices": 2,
11
+ "gpu": "NVIDIA GeForce RTX 4090",
12
+ "batch_per_gpu": 1024,
13
+ "accumulation": 2,
14
+ "precision": "bf16-mixed",
15
+ "recipe_changes": [
16
+ "Portable data/output paths",
17
+ "Fresh initialization; no historical resume",
18
+ "Epoch limit instead of allocation timer",
19
+ "W&B disabled",
20
+ "Evaluation every epoch; best and retained checkpoints every 5 epochs (QM9: 25)"
21
+ ],
22
+ "environment_note": "Python 3.13.7. Installed package versions captured from the shared training environment on 2026-10-08; not an original per-job environment lock.",
23
+ "limits": "Data and historical resume checkpoints are not distributed. Same recipe and seed do not imply a bitwise replay across resumes, hardware or software changes.",
24
+ "archive": "training_bundle.tar.gz",
25
+ "bytes": 423543,
26
+ "sha256": "06aa71e19be7423097ccb08540a463bb7f4fa6d99152428fff0cc47eb0ae8c8f",
27
+ "directory": "qm9-explicit-h",
28
+ "model_folder": "qm9/explicit_h",
29
+ "source_release": {
30
+ "repo_id": "maltefranke/morph",
31
+ "revision": "d0332f1c022345956470bb948ada79e5702ed8dc",
32
+ "filename": "reproduction/qm9-explicit-h.tar.gz"
33
+ },
34
+ "checkpoint_release": null,
35
+ "files": {
36
+ "original_config": "reproduction/original_training_config.yaml",
37
+ "portable_config": "configs/reproduce.yaml",
38
+ "original_launcher": "reproduction/original_launcher.sbatch",
39
+ "environment": "reproduction/environment.sh",
40
+ "dependencies": "reproduction/requirements-environment.txt",
41
+ "data_reference": "reproduction/dataset_reference.json",
42
+ "provenance": "reproduction/provenance.json"
43
+ }
44
+ }
qm9/explicit_h/training_bundle.tar.gz ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:06aa71e19be7423097ccb08540a463bb7f4fa6d99152428fff0cc47eb0ae8c8f
3
+ size 423543
reproduction/README.md CHANGED
@@ -1,76 +1,61 @@
1
- # Reproducing models and training runs
2
 
3
- The [README](../README.md#reproducibility) contains complete commands for pinned
4
- inference and training. The model repository is
5
- [maltefranke/morph](https://huggingface.co/maltefranke/morph).
 
6
 
7
- ## Published inference
8
 
9
- Pin both the installed source and the checkpoint/assets. The shared inference
10
- runtime at Hub revision `da1c241d83f2628b172fc510e1bc724ef4429db2` supports all
11
- published models; its `uv.lock` pins dependencies. The README installs that
12
- runtime with Python 3.13.7. Installing a different checkout of Morph changes the
13
- implementation even when `load_pretrained(..., revision=...)` selects the same
14
- weights: that argument pins the model bundle, not the installed Python code.
15
 
16
- With that environment active, this is the Python equivalent of the pinned
17
- GEOM example. Set the environment variables before importing Morph:
 
 
 
 
 
 
18
 
19
  ```python
20
- import os
21
-
22
- os.environ["MORPH_COMPILE"] = "0"
23
- os.environ["MORPH_ATTENTION_BACKEND"] = "sdpa"
24
- os.environ["MORPH_FLASH_ATTN"] = "0"
25
-
26
- from morph.inference import load_pretrained
27
-
28
- model = load_pretrained(
29
- "maltefranke/morph",
30
- subfolder="geom/explicit_h",
31
- revision="b839af108eaade757a5d2d668d05498e8c733c1e",
32
- epoch=50,
33
- device="cuda",
34
- steps=100,
35
- use_ema=True,
36
- )
37
- trajectories, validity, vocab, coordinate_std = model.generate(
38
- n_mols=64, batch_size=16, seed=42, return_traj=True,
39
- )
40
- print("Model revision:", model.bundle.revision)
41
- print("Valid attempts:", sum(validity), "/", len(validity))
42
  ```
43
 
44
- Direct repository IDs bypass catalog lookup. To use a short model name while
45
- freezing discovery, pass a pinned catalog:
46
 
47
- ```python
48
- from morph.inference import load_catalog, load_pretrained
49
-
50
- catalog = load_catalog(
51
- repo_id="maltefranke/morph",
52
- revision="377e8b52505d564df8529fe6fef2da9c77f57661",
53
- )
54
- model = load_pretrained(
55
- "chembl3d-implicit-h", catalog=catalog, epoch=300,
56
- device="cuda", steps=100, use_ema=True,
57
- )
58
  ```
59
 
60
- Changing batch size can change random-number consumption and generated samples.
61
- Record the generation count, batch size, seed, steps, EMA/current choice,
62
- precision, backend, source revision, package versions, GPU and driver. The CLI's
63
- SDF includes valid molecules only; `--save-trajs` preserves every attempt and
64
- its validity flag. Coordinates are already in Angstrom.
65
 
66
- Seeds and fixed releases provide controlled comparisons, but CUDA kernels and
67
- changes to hardware, dependencies or precision can prevent bitwise equality.
68
- The historical training configuration uses `deterministic: warn`, which is not
69
- a guarantee that every operation has a deterministic implementation.
 
 
70
 
71
- ## Training archives
72
 
73
- Download from `reproduction/` at immutable Hub revision `d0332f1c022345956470bb948ada79e5702ed8dc`.
74
  Each archive contains:
75
 
76
  - The original `run.py`, `src/`, `configs/`, `pyproject.toml`, and `uv.lock`
@@ -88,20 +73,22 @@ Each archive contains:
88
  per-job environment capture; Python 3.13.7 is the reference interpreter.
89
 
90
  The archives are roughly 0.2–0.5 MB each and contain no datasets or weights.
91
- `reproduction/SHA256SUMS` verifies the archives; each archive's manifest verifies
92
- its files. Preserve the archive and immutable revision with your results.
 
 
93
 
94
- The new launcher records package versions, GPU/driver information, requested
95
  overrides, recipe provenance and data references in `MORPH_OUTPUT_DIR`.
96
  Hydra records the effective configuration in `.hydra/`. Choose a new output
97
  directory for each run, and retain these records alongside checkpoints.
98
 
99
- | Archive | Batch per GPU | Accumulation | Effective batch | Original validation cadence | Portable validation / save cadence |
100
  | --- | ---: | ---: | ---: | --- | --- |
101
- | `chembl3d-explicit-h.tar.gz` | 320 | 1 | 640 | Every 5 epochs | Every 1 / 5 epochs |
102
- | `chembl3d-implicit-h.tar.gz` | 320 | 1 | 640 | Every epoch | Every 1 / 5 epochs |
103
- | `geom-explicit-h.tar.gz` | 320 | 1 | 640 | Every epoch | Every 1 / 5 epochs |
104
- | `qm9-explicit-h.tar.gz` | 1024 | 2 | 4096 | Every epoch | Every 1 / 25 epochs |
105
 
106
  All recipes use two RTX 4090 GPUs, seed 42, bf16 mixed precision, SDPA attention,
107
  compiled networks and 4096 generation attempts per validation epoch. GEOM uses
@@ -109,6 +96,10 @@ Muon with CUDA graph execution; ChEMBL3D and QM9 use native Muon execution with
109
  DDP compiler graph splitting disabled and compilation fallback enabled.
110
  Environment flags are explicit in each archive's `reproduction/environment.sh`.
111
 
 
 
 
 
112
  The portable configs preserve the saved model, optimizer, schedule and batch
113
  settings. They change data/output paths, disable W&B, remove the historical
114
  resume path and allocation timer, and use a finite epoch limit. They also apply
 
1
+ # Training bundles
2
 
3
+ Each model folder in [maltefranke/morph](https://huggingface.co/maltefranke/morph)
4
+ contains a `training_bundle.tar.gz` with the original configuration, source and
5
+ run settings. The [README](../README.md#reproducibility) links to each bundle.
6
+ No version suffix or commit identifier is needed in the commands below.
7
 
8
+ ## Download and set up
9
 
10
+ With [uv](https://docs.astral.sh/uv/) installed and `hf auth login` completed,
11
+ choose a model folder and download its bundle:
 
 
 
 
12
 
13
+ ```bash
14
+ hf download maltefranke/morph geom/explicit_h/training_bundle.tar.gz \
15
+ geom/explicit_h/training_bundle.json --local-dir morph-training
16
+ cd morph-training
17
+ ```
18
+
19
+ The small JSON file records the archive checksum, original run settings and
20
+ checkpoint release. To verify the download before unpacking:
21
 
22
  ```python
23
+ import hashlib
24
+ import json
25
+ from pathlib import Path
26
+
27
+ folder = Path("geom/explicit_h")
28
+ metadata = json.loads((folder / "training_bundle.json").read_text())
29
+ with (folder / metadata["archive"]).open("rb") as stream:
30
+ assert hashlib.file_digest(stream, "sha256").hexdigest() == metadata["sha256"]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  ```
32
 
33
+ Install and train inside a compute allocation:
 
34
 
35
+ ```bash
36
+ tar -xzf geom/explicit_h/training_bundle.tar.gz
37
+ cd geom-explicit-h
38
+ uv venv --python 3.13.7 .venv
39
+ uv pip install --python .venv/bin/python -r pyproject.toml \
40
+ -c reproduction/requirements-environment.txt
41
+ source .venv/bin/activate
42
+ export MORPH_DATASET_ROOT=/absolute/path/to/geom # Contains processed/
43
+ export MORPH_OUTPUT_DIR="$PWD/outputs/repeat-01"
44
+ bash train.sh
 
45
  ```
46
 
47
+ For another model, use its folder from the table below. The extracted directory
48
+ is the model name, also recorded as `directory` in `training_bundle.json`.
 
 
 
49
 
50
+ | Model folder | Extracted directory |
51
+ | --- | --- |
52
+ | `chembl3d/explicit_h` | `chembl3d-explicit-h` |
53
+ | `chembl3d/implicit_h` | `chembl3d-implicit-h` |
54
+ | `geom/explicit_h` | `geom-explicit-h` |
55
+ | `qm9/explicit_h` | `qm9-explicit-h` |
56
 
57
+ ## Bundle contents
58
 
 
59
  Each archive contains:
60
 
61
  - The original `run.py`, `src/`, `configs/`, `pyproject.toml`, and `uv.lock`
 
73
  per-job environment capture; Python 3.13.7 is the reference interpreter.
74
 
75
  The archives are roughly 0.2–0.5 MB each and contain no datasets or weights.
76
+ The adjacent `training_bundle.json` verifies the archive; each archive's manifest
77
+ verifies its files. The metadata records the underlying source release and model
78
+ release, so their identifiers stay with the bundle. Preserve the downloaded
79
+ archive and metadata with your results.
80
 
81
+ The launcher records package versions, GPU/driver information, requested
82
  overrides, recipe provenance and data references in `MORPH_OUTPUT_DIR`.
83
  Hydra records the effective configuration in `.hydra/`. Choose a new output
84
  directory for each run, and retain these records alongside checkpoints.
85
 
86
+ | Model | Batch per GPU | Accumulation | Effective batch | Original validation cadence | Portable validation / save cadence |
87
  | --- | ---: | ---: | ---: | --- | --- |
88
+ | `chembl3d-explicit-h` | 320 | 1 | 640 | Every 5 epochs | Every 1 / 5 epochs |
89
+ | `chembl3d-implicit-h` | 320 | 1 | 640 | Every epoch | Every 1 / 5 epochs |
90
+ | `geom-explicit-h` | 320 | 1 | 640 | Every epoch | Every 1 / 5 epochs |
91
+ | `qm9-explicit-h` | 1024 | 2 | 4096 | Every epoch | Every 1 / 25 epochs |
92
 
93
  All recipes use two RTX 4090 GPUs, seed 42, bf16 mixed precision, SDPA attention,
94
  compiled networks and 4096 generation attempts per validation epoch. GEOM uses
 
96
  DDP compiler graph splitting disabled and compilation fallback enabled.
97
  Environment flags are explicit in each archive's `reproduction/environment.sh`.
98
 
99
+ The portable recipes stop at 400 completed epochs for explicit-H ChEMBL3D,
100
+ 300 for implicit-H ChEMBL3D, 50 for GEOM, or 3000 for QM9. Override that limit
101
+ with `bash train.sh trainer.trainer.max_epochs=100`.
102
+
103
  The portable configs preserve the saved model, optimizer, schedule and batch
104
  settings. They change data/output paths, disable W&B, remove the historical
105
  resume path and allocation timer, and use a finite epoch limit. They also apply