Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
857f38c
distributed: ShardTensor core and particle-halo primitives
dallasfoster Jun 26, 2026
a3664de
distributed: distribution spec, adapters, and public API
dallasfoster Jun 26, 2026
e42fa5e
distributed: domain-parallel runtime
dallasfoster Jun 26, 2026
add01a0
distributed: torch.compile support for the distributed forward
dallasfoster Jun 26, 2026
cdbed2e
distributed: model-agnostic distribution validator
dallasfoster Jun 26, 2026
ff99b6b
distributed: vendored ShardTensor backend snapshot
dallasfoster Jun 26, 2026
df91180
distributed: model, dynamics, and data integration with tests and docs
dallasfoster Jun 26, 2026
f49928c
benchmark: distributed forward and NVT benchmark suite
dallasfoster Jun 26, 2026
3b57800
Merge main into dallasf/domain-decomposition-shard-tensor
dallasfoster Jun 26, 2026
ac31b25
distributed: fold DDP runtime helpers into the package (merge fixup)
dallasfoster Jun 26, 2026
206560c
test(distributed): add folded DDP runtime symbols to expected public API
dallasfoster Jun 26, 2026
74ef628
test: fix stale neighbor_list import after #65 hooks namespace move
dallasfoster Jun 26, 2026
9bd329e
electrostatics: DD-correct slab correction for PME + Ewald wrappers
dallasfoster Jun 26, 2026
f31525c
test: int32 batch_idx for staged Ewald bindings batched cases
dallasfoster Jun 26, 2026
2c62553
test: multi-GPU slab DD correctness gate (world0 vs world2)
dallasfoster Jun 26, 2026
1f3cb97
test: use a genuinely non-degenerate slab partition by default
dallasfoster Jun 26, 2026
f9fec64
electrostatics: drop unused locals in slab moments (ruff F841)
dallasfoster Jun 26, 2026
aa64dbd
restore claude skills
dallasfoster Jun 26, 2026
9dfab2a
restore misc infra files
dallasfoster Jun 26, 2026
29e924a
remove extra files
dallasfoster Jun 26, 2026
6ce26b7
remove extra files
dallasfoster Jun 26, 2026
75dda8c
hooks: make NL CUDA-graph capture failure non-poisoning
dallasfoster Jun 26, 2026
64a966c
test: update DD tests to current spec/wrapper API
dallasfoster Jun 26, 2026
d42d33c
test: skip warp CUDA-graph capture tests when capture is unsupported
dallasfoster Jun 26, 2026
f09f6d7
models: restore trainable params on AIMNet2 from_checkpoint; align MA…
dallasfoster Jun 26, 2026
40abfc3
test: xfail MACE force-loss training and cueq DD equivalence (known g…
dallasfoster Jun 26, 2026
cfe6fee
test: fix distributed_correctness — model_config attr + non-degenerat…
dallasfoster Jun 26, 2026
e573bf1
distributed: fix cross-rank sharded gather/scatter dispatch (PlainSha…
dallasfoster Jun 26, 2026
d4dbe48
test: size open-cell domain box to atom extent (avoid degenerate part…
dallasfoster Jun 26, 2026
d6db772
test: force x-axis domain split for octane-chain validate tests
dallasfoster Jun 26, 2026
477c2ea
test: use 24-atom chain in e2e helper-diagnosis tests for non-trivial…
dallasfoster Jun 26, 2026
5b43c87
lint: noqa S110/S603 on defensive capture/dispatch + capture-probe; s…
dallasfoster Jun 26, 2026
f774ace
models(mace): restore force/stress-loss training (thread self.training)
dallasfoster Jun 26, 2026
ef8551c
distributed: unfuse cueq MACE conv under DD for halo correctness
dallasfoster Jun 26, 2026
4a558ba
distributed: static-shape cueq symmetric-contraction index under DD
dallasfoster Jun 26, 2026
6c95c47
benchmark(distributed): --run-reference (default off) + steady-state …
dallasfoster Jun 27, 2026
5d8fdbf
distributed: keep cueq MACE conv fused under compiled DD (memory parity)
dallasfoster Jun 27, 2026
3332752
distributed: add graph-parallel DD strategy + polymorphic storage-pol…
dallasfoster Jun 29, 2026
6c0699d
distributed: add node-replicate graph-parallel strategy + wire MACE o…
dallasfoster Jun 29, 2026
5e3e4b0
distributed(uma): node-replicate graph-parallel DD for eSCN
dallasfoster Jun 30, 2026
61541e3
distributed(uma): compile-enable node-replicate GP (turbo)
dallasfoster Jun 30, 2026
0cc5c85
distributed: UMA node-partition graph-parallel + cut per-forward mars…
dallasfoster Jun 30, 2026
f9140dc
distributed: compile-enable UMA node-partition graph-parallel (fully-…
dallasfoster Jun 30, 2026
5a78797
distributed: parallelization Strategy refactor (S0–S5) + global-therm…
dallasfoster Jul 1, 2026
47e0028
benchmark(distributed): config-driven strategy selection for the DD s…
dallasfoster Jul 1, 2026
912a7da
distributed: unify node-partition GP onto halo's otf-off precompute-p…
dallasfoster Jul 2, 2026
4b407ca
distributed: fix MACE cueq+compile halo NVT per-step recompile churn
dallasfoster Jul 2, 2026
6ccc470
examples: add distributed NPT (barostat) MD example
dallasfoster Jul 2, 2026
12cfd01
distributed: dense-neighbor-matrix graph-parallel path + PME on Graph…
dallasfoster Jul 2, 2026
da941a7
distributed: async comm/compute overlap core (strategy-agnostic, spec…
dallasfoster Jul 2, 2026
5ea76e9
distributed: reduce-scatter the graph-parallel force reduction + over…
dallasfoster Jul 2, 2026
3f7ca10
distributed: review fixes — validation, registry, typing, adapter rou…
dallasfoster Jul 2, 2026
cea1d57
data: vectorize default atomic-mass lookup (kill per-atom device->hos…
dallasfoster Jul 2, 2026
d864f79
benchmark(distributed): multinode device-ordinal fix + fairchem-nativ…
dallasfoster Jul 2, 2026
93fa080
docs(distributed): DD scaling talk deck + scaling-sweep results
dallasfoster Jul 2, 2026
48df97e
distributed: UMA-GP async-overlap adapter (edge split by sender resid…
dallasfoster Jul 3, 2026
45f3b56
distributed: env-gated inductor compute/comm overlap for the DD colle…
dallasfoster Jul 3, 2026
1ea3a93
distributed: compile-clean UMA-GP overlap split (eager-published, ind…
dallasfoster Jul 3, 2026
7ec4107
distributed: disjoint UMA-GP overlap split + kill per-forward count s…
dallasfoster Jul 3, 2026
c9f6a40
distributed dynamics: FIRE under DD + FIRE->NVT example
dallasfoster Jul 3, 2026
4d1904c
distributed: DomainParallel over a 2D-mesh domain sub-mesh (pipeline …
dallasfoster Jul 4, 2026
f1bba2b
distributed dynamics: StageGroup + 2D layout resolution + group-done …
dallasfoster Jul 4, 2026
c90f9c9
distributed dynamics: group-to-group handoff primitive (pipeline x DD…
dallasfoster Jul 4, 2026
873d871
distributed dynamics: 2-D-parallel pipeline × domain (pipeline × DD)
dallasfoster Jul 6, 2026
6be316b
distributed: remove async-overlap DD path (deferred to follow-up)
dallasfoster Jul 6, 2026
dd209fa
distributed: Ewald on node-partition graph-parallel
dallasfoster Jul 6, 2026
634d626
models(dftd3): derive per-atom energies without a per-atom-energy ker…
dallasfoster Jul 6, 2026
d4614c4
distributed: run composed models under DomainParallel dynamics
dallasfoster Jul 7, 2026
bddc508
deps: bump aimnet 0.1.1 -> 0.2.0 (torch 2.10 compat)
dallasfoster Jul 7, 2026
6c7eca4
non-degenerate partition hardening for tests
dallasfoster Jul 7, 2026
8add16b
linting
dallasfoster Jul 7, 2026
9a19ac8
remove temp files
dallasfoster Jul 7, 2026
23adc51
examples(distributed): route 03/06/07 through DistributedManager; rew…
dallasfoster Jul 7, 2026
800c7d3
distributed: address PR review — drop presentation/benchmark scratch,…
dallasfoster Jul 8, 2026
b7bb2ff
distributed: compiled-DD stress via strain-autograd + electrostatics …
dallasfoster Jul 9, 2026
60c01da
distributed: correct LJ/DFTD3 halo-DD stress via owned-aware per-atom…
dallasfoster Jul 10, 2026
70f7253
benchmark(distributed): add elongated bcc-Fe builder for 1-D DD scaling
dallasfoster Jul 10, 2026
2db1772
update docs and fix test
dallasfoster Jul 10, 2026
153a15c
Merge branch 'main' into dallasf/domain-decomposition-shard-tensor
dallasfoster Jul 10, 2026
46a2659
data/distributed: bypass validate_assignment when re-attaching migrat…
dallasfoster Jul 10, 2026
2cbde4e
distributed: agree fixed-shape caps across ranks to keep compiled DD …
dallasfoster Jul 11, 2026
77d4d04
distributed: skip the partitioned axis when wrapping positions in the…
dallasfoster Jul 11, 2026
3dc883a
benchmark(distributed): record DD MACE vs LAMMPS+MACE H100 scaling re…
dallasfoster Jul 11, 2026
a7812eb
distributed: neighbor point-to-point halo exchange
dallasfoster Jul 13, 2026
ec81f0a
Merge main into dallasf/domain-decomposition-shard-tensor
dallasfoster Jul 13, 2026
a72ef25
test(distributed): fix AIMNet2 validate gates for symmetry + aimnet 0…
dallasfoster Jul 14, 2026
5cdc347
test(models): mock cueq at the OptionalDependency layer in from_check…
dallasfoster Jul 14, 2026
27c83c0
test(distributed): skip pipeline×DD cross-stage hand-off gates on gloo
dallasfoster Jul 14, 2026
b13d3a8
fix(optional): tolerate missing note attr in OptionalDependencyError
dallasfoster Jul 14, 2026
2664e82
docs(distributed): docstring the storage-policy override methods
dallasfoster Jul 14, 2026
bf656e0
update to toolkit 0.4.0
dallasfoster Jul 14, 2026
ff45b3e
Merge branch 'main' into dallasf/domain-decomposition-shard-tensor
dallasfoster Jul 14, 2026
78d8e88
fix test error on fairchem guard
dallasfoster Jul 14, 2026
536c767
remove uv action
dallasfoster Jul 14, 2026
cc8ddf3
fix uma test error
dallasfoster Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,20 @@ jobs:
with:
python-version: "3.12"

# Install uv via its pinned, checksum-verified installer rather than the
# astral-sh/setup-uv action, which the org action allow-list blocks
# (non-GitHub, not in the permitted patterns). Mirrors the test job.
- name: Setup UV
uses: astral-sh/setup-uv@v7
with:
enable-cache: true
env:
UV_VERSION: "0.9.25"
UV_CHECKSUM: "1e1aea6cead1a07a7cee24f6eaec415b"
run: |
UV_INSTALLER=$(mktemp)
curl -LsSf "https://astral.sh/uv/${UV_VERSION}/install.sh" -o "$UV_INSTALLER"
echo "${UV_CHECKSUM} ${UV_INSTALLER}" | md5sum -c -
sh "$UV_INSTALLER"
rm "$UV_INSTALLER"
echo "$HOME/.local/bin" >> $GITHUB_PATH

- name: Cache pre-commit
uses: actions/cache@v4
Expand Down
79 changes: 79 additions & 0 deletions benchmark/distributed/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
# Distributed benchmarks

Performance + correctness benchmarks for domain-decomposition (DD)
inference and molecular dynamics. Two config-driven runners cover every
model; a model is selected with `--config <model>.yaml`.

| Runner | What it measures |
| --- | --- |
| `benchmark_dd_model_forward.py` | Single-GPU vs multi-GPU forward time, peak memory, and a single-vs-multi **force-equivalence** gate. |
| `benchmark_dd_nvt.py` | End-to-end NVT (`NVTLangevin`) step time across `world ∈ {0, 1, 2}`. |

Shared timing, system builders, force-gathering, and the sweep drivers
live in `_benchmark_common.py`.

## Configs

`configs/<model>.yaml` declares the test system, the model loader, and
the per-mode distribution knobs. Shipped configs:

| Config | System | Forward | NVT |
| --- | --- | :---: | :---: |
| `lj.yaml` | Argon cluster (non-PBC) | ✓ | |
| `ewald.yaml` | NaCl-like lattice (PBC, charged) | ✓ | |
| `pme.yaml` | NaCl-like lattice (PBC, charged) | ✓ | |
| `mace.yaml` | α-quartz SiO₂ supercell | ✓ | ✓ |
| `aimnet2.yaml` | Methane (CH₄) packing | ✓ | ✓ |
| `uma.yaml` | bcc iron supercell | ✓ | ✓ |

Override any config value for a one-off run with `--set` (dotted keys),
no new file needed:

```bash
--set loader.enable_cueq=true --set loader.compile=true # MACE cueq + compile
--set loader.inference=compile # UMA compiled inference
--set dtype=fp32 # MACE same-precision (no cueq)
```

## Running

Single-GPU baseline (force-equivalence still runs single-rank only):

```bash
python benchmark/distributed/benchmark_dd_model_forward.py \
--config benchmark/distributed/configs/lj.yaml --sizes 1000 4000 --single-only
```

Multi-GPU (force-equivalence gate active) — launch with `torchrun`:

```bash
torchrun --nproc_per_node=2 \
benchmark/distributed/benchmark_dd_model_forward.py \
--config benchmark/distributed/configs/mace.yaml --sizes 1000 4000
```

NVT end-to-end — run each `world` mode as a separate job (keeps allocator
pools clean between modes):

```bash
# world=0 (raw integrator) python ... benchmark_dd_nvt.py --config ...
# world=1 (DD wrapper, single rank) torchrun --nproc_per_node=1 ... benchmark_dd_nvt.py --config ...
# world=2 (full DD) torchrun --nproc_per_node=2 ... benchmark_dd_nvt.py --config ...
python benchmark/distributed/benchmark_dd_nvt.py \
--config benchmark/distributed/configs/aimnet2.yaml --sizes 500 2000
```

Without `torchrun` the forward runner reports the single-rank baseline
and the NVT runner reports `world=0`. Omit `--sizes` to use the config's
`default_sizes`. `--help` lists the shared flags (`--iters`, `--warmup`,
`--tolerance`, `--profile`, ...).

### Notes

- **MACE + cueq on multiple ranks** needs
`CUEQUIVARIANCE_OPS_PARALLEL_COMPILE=0` to avoid a cross-rank JIT race.
- **UMA** ships in its own extras group (`uv sync --extra uma`) because
`fairchem-core` pins a newer `e3nn` than the MACE ecosystem; it also
needs `HF_TOKEN` for the gated checkpoints. Keep UMA and MACE in
separate environments.
- cueq (MACE) and the AIMNet2 warp kernels are float32-only.
Loading
Loading