HPC hardening: single-GPU saturation, downstream-WE parallelism, and cleanups#10
Merged
Conversation
Keep large manuscript sources and macOS Finder metadata out of the tree. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SPIBProgress re-featurized the entire growing coordinate buffer on every refresh (~O(N^2) over a long adaptive run) and held full coordinate arrays in host memory. Featurize once when a frame is observed and cache the vectors (features are far smaller than a solvated configuration); an optional max_buffer keeps a most-recent sliding window while preserving the start frame. Results are identical to the previous path when unbounded. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Record each trial's device on TrialResult and run the tau2 runner on the device of the softmax-selected sampler, instead of always the pool's first device. Keeps the commit segment on the same GPU that produced the winner. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…refresh - EnsemblePathRefinerFast.transform gains project_to_real: snap each refined node to the nearest physically realized trajectory frame (needed for 3D macromolecules so PathCV/WE seeds are not unphysical). CPU fallback when CUDA is requested but unavailable. - refiner.py wires project_to_real through PathRefinementConfig and no longer reports converged=True when it breaks on a walker-generation failure. - verify scripts use a true discrete Frechet distance (was mislabeled Hausdorff) for path-to-path convergence, matching the manuscript. - renumber example pipelines (1_generate -> 2_run -> 3_analyze), rename the toy checker to verify_path_refinement.py, and refresh docs/README. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…(OpenMM) Path generation stays single-GPU but no longer runs swarm trials one at a time. OpenMMEngine now backs a pool of interchangeable Contexts on the one card, handed out one-per-thread via a queue with a shared, lock-guarded State cache (States are portable across Contexts of the same System). PathGennieMD sizes the pool from workers_per_device: an int, or 'auto' (CPU cores capped by free GPU memory, probed while the pool is built) and drives it with a ThreadDevicePool. n_workers=1 is exactly the previous single-Context path (no regression); resolve_worker_count and the config schema accept 'auto'. Verified on CPU: a 4-worker run reproduces the serial result with a deterministic integrator. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… the device pool - AMBER/GROMACS runners resolve 'executable' with shutil.which so a bare module-load name (gmx, pmemd.cuda, sander) works instead of failing Path.exists(); example configs switch to bare names. - Forward the backend's ThreadDevicePool into the downstream Weighted Ensemble (run_downstream -> make_stage -> WeightedEnsembleStage) so its walker propagation spreads across the same GPUs/cores the discovery swarm used instead of running serially. OpenMM reuses its concurrent-Context pool. - Remove the superseded amberengine.py (replaced by the device-aware CoreAmberEngine in engine.py). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… tau2-device regression hpc_selfcheck.py confirms the case's configured MD executable resolves the way the backends do (shutil.which) and smoke-tests the OpenMM concurrent-Context pool on the CPU platform; the HPC README documents the single-GPU-saturation model and the new checks. Adds the tau2-runs-on-chosen-device regression to the parallel suite. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Delete unused main2.py / main_clean.py from the standalone we/ package. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… extra MPIExecutor/DaskExecutor never worked — the driver's per-cycle work closes over live engine state that cannot be pickled across nodes — and were wired to no backend. Remove the two classes, the mpi4py/dask '[hpc]' optional dependency, and their package probes. The supported patterns cover every practical PathGennie workload and are now the documented scaling model: path discovery saturates a single GPU with concurrent walkers, the downstream Weighted Ensemble spreads across a node's GPUs/cores, and multi-node throughput comes from running independent pathways/replicates as Slurm/PBS array jobs. A work-queue manager for a single tightly-coupled multi-node run stays on the roadmap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…w self-checks The OpenMM 'gpu_spread' row no longer claims a SerialExecutor/one-Context path; OpenMM now saturates a single card with a concurrent-Context pool. Add triage rows for the executable_resolution and concurrent_openmm self-checks. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Hardens PathGennie for HPC testing on CPU and GPU nodes. The headline change lets the OpenMM backend saturate a single GPU by running many swarm walkers concurrently, and makes the downstream Weighted Ensemble spread across a node's GPUs/cores. It also fixes an executable-resolution bug that broke
module loadbinaries, speeds up on-the-fly SPIB, and removes the non-functional MPI/Dask executors. The path-refinement review fixes and repo hygiene ride along.10 commits; 107 unit tests pass and the HPC self-check is 7/7.
What changed & why
HPC scaling (the focus of this branch)
OpenMMEnginenow backs a pool of interchangeable Contexts on one card, handed out one-per-thread via a queue with a shared, lock-guardedStatecache (States are portable across Contexts of the sameSystem).PathGennieMDsizes the pool fromworkers_per_device— an int, orauto(CPU cores capped by free GPU memory, probed while the pool is built).n_workers=1is exactly the old single-Context path (no regression). Previously trials ran one at a time, leaving the GPU idle for small systems.run_downstream→make_stage→WeightedEnsembleStage, so WE walker propagation spreads across GPUs/cores instead of silently running serially. No algorithm change.executablewithshutil.which, so a baremodule loadname (gmx,pmemd.cuda,sander) works instead of failingPath.exists(); example configs use bare names.SPIBProgresscaches features incrementally (was re-featurizing the whole growing buffer each refresh, ~O(N²)) with an optional bounded sliding window.MPIExecutor/DaskExecutorand the[hpc]extra. They never worked (per-cycle work closes over live, unpicklable engine state) and were wired to no backend.Path refinement (review fixes)
project_to_real); fix theconvergedflag so a walker-generation failure isn't reported as convergence; use a true discrete Fréchet distance for path convergence (was mislabeled Hausdorff); renumber the example pipelines.Repo hygiene
Manuscripts/and.DS_Store; remove the supersededamberengine.pyand unused standalonewe/scratch scripts.Scaling model (reviewer note)
Path discovery is single-GPU, saturated by concurrent walkers. Multi-GPU/CPU belongs to the downstream WE via the device pool. Multi-node is Slurm/PBS array jobs over independent pathways/replicates (how the path-resolved-kinetics workflow already runs channels). There is deliberately no in-process multi-node executor; a work-queue manager for a single tightly-coupled run stays on the roadmap.
Testing
pytest -q tests --ignore tests/hpc→ 107 passed (torch installed so the SPIB lane runs).python tests/hpc/hpc_selfcheck.py→ 7/7, including the newexecutable_resolutionandconcurrent_openmmchecks.tests/hpc/Slurm/PBS job scripts andDEBUGGING.md.Not included / follow-ups
platform: CPU; switch toCUDA+workers_per_device: autofor the saturation test.CHANGELOG.md[Unreleased]).🤖 Generated with Claude Code