| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
Sorry, something went wrong.
Test Results 5 files ± 0 5 suites ±0 3m 56s ⏱️ +52s Results for commit 37f3324. ± Comparison against base commit bcc0fb5. This pull request removes 2 and adds 58 tests. Note that renamed tests count towards both.tests.test_sites ‑ test_sites_are_read_when_requested[0] tests.test_sites ‑ test_sites_are_read_when_requested[1] tests.test_backend ‑ test_copy_into_on_host tests.test_backend ‑ test_copy_into_rejects_mismatches tests.test_backend ‑ test_host_devices_are_simulated tests.test_gpu_backend ‑ test_too_many_devices_raise tests.test_gpu_backend ‑ test_two_gpus_match_one[full] tests.test_gpu_backend ‑ test_two_gpus_match_one[split] tests.test_gpu_backend ‑ test_two_gpus_raise_the_first_error tests.test_gpu_backend ‑ test_two_gpus_take_device_inputs tests.test_group ‑ test_a_failing_rank_releases_the_others tests.test_group ‑ test_a_group_of_one_runs_inline … ♻️ This comment has been updated with latest results. |
Sorry, something went wrong.
Phase 1 of the plan (#44's own description) called these dead weight. Assisted-by: GitHub Copilot:Claude Opus 5.5
There was a problem hiding this comment.
Cross-device CuPy inputs can fail on a selected single GPU, and obsolete or unsupported documentation claims remain.
4 open findings🤖 AI text below 🤖
Adds single-node multi-GPU SRC sweeps using one thread per device.
Changes:
| File | Description |
|---|---|
| src/src_method/_group.py | Implements device groups and collectives. |
| src/src_method/_sweep.py | Distributes the SRC sweep. |
| src/src_method/_sites.py | Shares staged cores across devices. |
| src/src_method/_plan.py | Plans multi-device memory usage. |
| src/src_method/utils/_backend.py | Adds device and peer-copy helpers. |
| src/src_method/utils/__init__.py | Exports backend helpers. |
| tests/test_group.py | Tests collectives and failures. |
| tests/test_stack.py | Tests distributed sweep behavior. |
| tests/test_sites.py | Tests shared site loading. |
| tests/test_plan.py | Tests multi-device planning. |
| tests/test_gpu_backend.py | Adds multi-GPU tests. |
| tests/test_backend.py | Tests host backend helpers. |
| benches/large/bench_large.py | Adds scaling benchmarks. |
| benches/large/README.md | Documents benchmark usage. |
| README.md | Introduces multi-GPU usage. |
| docs/content/docs/features/large-problems.mdx | Documents multi-GPU execution. |
| docs/content/docs/features/gpu.mdx | Links GPU guidance. |
| docs/content/docs/contributing/testing.mdx | Documents multi-device testing. |
| docs/superpowers/specs/2026-09-25-src-multi-gpu-design.md | Adds the obsolete MPI design. |
| docs/superpowers/plans/2026-09-25-src-multi-gpu.md | Adds the obsolete MPI plan. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Sorry, something went wrong.
A single-GPU sweep reused any CuPy core in place, so with Resources(devices=[d]) a core on another GPU met environments and sketches on GPU d. Reuse a core only when it sits on the sweep's GPU; stage the others through the host buffer as a group does. Addresses the Copilot review on #44. Assisted-by: GitHub Copilot:Claude Opus 5.5
Phase 2 of the multi-GPU plan: one process per GPU, NCCL collectives, the sketch index split among the GPUs, with a communicator passed in Resources. Targets strong scaling at the Phase 1 reference size. Assisted-by: Pi:claude-opus-5-5
An abort method on the communicator, the truncation rank agreed through a callback, output sinks, a logged warning for large in-memory inputs, and MPICH in CI and in the dev shell. Assisted-by: Pi:claude-opus-5-5
Eleven tasks, each test-first, from the communicator to the scaling runs. Written under the no-full-code rule of the design phase: interfaces, pseudocode and test specifications. Assisted-by: Pi:claude-opus-5-5
Phase 1 is merged, logging is the standard library, the docs moved to the Fumadocs site, and the CUDA 13 CuPy needs the cu13 NCCL wheel. Assisted-by: Pi:claude-opus-5.5
Assisted-by: Pi:claude-opus-5.5
Allgather, gather and scatter over peer copies, ordered by events, in a single process. A failing rank aborts the group so that no rank waits forever; on the CPU the devices are simulated for testing. Assisted-by: Pi:claude-opus-5.5
Resources(devices=...) gives each device a contiguous block of the sketch columns. The left-to-right pass needs no communication; per site of the right-to-left pass the sketch is gathered on the first device for the QR, the output core scattered by rows, and the projected environment gathered on every device. Cores are read once and, with peer access, uploaded in slices and gathered over the peer links. One device keeps the previous sweep, bit for bit. Assisted-by: Pi:claude-opus-5.5
Assisted-by: Pi:claude-opus-5.5
Assisted-by: Pi:claude-opus-5.5
Phase 1 of the plan (#44's own description) called these dead weight. Assisted-by: GitHub Copilot:Claude Opus 5.5
A single-GPU sweep reused any CuPy core in place, so with Resources(devices=[d]) a core on another GPU met environments and sketches on GPU d. Reuse a core only when it sits on the sweep's GPU; stage the others through the host buffer as a group does. Addresses the Copilot review on #44. Assisted-by: GitHub Copilot:Claude Opus 5.5
# Conflicts: # benches/large/README.md
There was a problem hiding this comment.
The added superpowers documents contradict both the implemented architecture and the PR’s stated removal of the obsolete MPI design.
0 open findings
4 resolved since last review🧠 Review effort: Balanced
Sorry, something went wrong.
* docs(spec): 📝 design for an SRC sweep over the GPUs of a node Phase 2 of the multi-GPU plan: one process per GPU, NCCL collectives, the sketch index split among the GPUs, with a communicator passed in Resources. Targets strong scaling at the Phase 1 reference size. Assisted-by: Pi:claude-opus-5-5 * docs(spec): 📝 fold the refinements found while planning into the spec An abort method on the communicator, the truncation rank agreed through a callback, output sinks, a logged warning for large in-memory inputs, and MPICH in CI and in the dev shell. Assisted-by: Pi:claude-opus-5-5 * docs(plan): 📝 implementation plan for the multi-GPU SRC sweep Eleven tasks, each test-first, from the communicator to the scaling runs. Written under the no-full-code rule of the design phase: interfaces, pseudocode and test specifications. Assisted-by: Pi:claude-opus-5-5 * docs(plan): 📝 align the multi-GPU spec and plan with main Phase 1 is merged, logging is the standard library, the docs moved to the Fumadocs site, and the CUDA 13 CuPy needs the cu13 NCCL wheel. Assisted-by: Pi:claude-opus-5.5 * feat(utils): ✨ device selection and peer copies between GPUs Assisted-by: Pi:claude-opus-5.5 * feat(group): ✨ one thread per device and the collectives between them Allgather, gather and scatter over peer copies, ordered by events, in a single process. A failing rank aborts the group so that no rank waits forever; on the CPU the devices are simulated for testing. Assisted-by: Pi:claude-opus-5.5 * feat(sweep): ✨ split the sweep among the GPUs of a node Resources(devices=...) gives each device a contiguous block of the sketch columns. The left-to-right pass needs no communication; per site of the right-to-left pass the sketch is gathered on the first device for the QR, the output core scattered by rows, and the projected environment gathered on every device. Cores are read once and, with peer access, uploaded in slices and gathered over the peer links. One device keeps the previous sweep, bit for bit. Assisted-by: Pi:claude-opus-5.5 * perf(bench): 📈 multi-GPU scaling command for the large benchmark Assisted-by: Pi:claude-opus-5.5 * docs: 📝 running one sweep on several GPUs Assisted-by: Pi:claude-opus-5.5 * perf(bench): 📈 multi-GPU tests and scaling on Leonardo (4xA100-64GB) - Add `leonardo/run_multi.sh`: any command with 4 GPUs in one process, printing the topology and peer-access matrix; `WARM_DIR` reads the stack beforehand. - `scaling` also reports a QR distance over `a - b`, which resolves differences below the sqrt(eps) floor of the inner-product distance. - GPU tests pass (19/19); D_M = 1000 scaling with QR distances below 1e-12. The reference size is queued; its results follow. - Keep `benches/*/leonardo/logs/*.out` in git. Assisted-by: GitHub Copilot:Claude Opus 5.5 * docs(bench): 📝 correct what the site stalls measure The stall timer ends before the upload to the device, so it does not include the split upload or the NVLink gather; it also counts the loader waiting for the GPU. Assisted-by: GitHub Copilot:Claude Opus 5.5 * fix(sweep): 🐛 split a batch that runs out of GPU memory At D_M = 4000, chi_out = 2000 on an A100-64GB, CuPy's pool fragments beyond the margin the plan leaves for it: live memory peaked at 52 GB against the planned 56.7 GB, but the pool held up to 66.7 GB and a 12.6-14.7 GB allocation failed, at a different point in each run. On out of memory, a kernel now releases the pool's cached blocks and computes the batch in halves, joined along the batch axis, keeping the split for the rest of the sweep. The plan and the batches the store reads and writes are unchanged, so the devices need not agree on it. Assisted-by: GitHub Copilot:Claude Opus 5.5 * perf(bench): 📈 reference size on 1 and 4 GPUs of Leonardo At D_M = 4000, chi_out = 2000: 3925.3 s on one A100-64GB, 1099.9 s on four, a speed-up of 3.57 and an efficiency of 89%. Reading environments back from host memory and disk takes 82-84% of the right-to-left pass. The docs describe the out-of-memory split. The 2-GPU point and the distance at this size are queued. Assisted-by: GitHub Copilot:Claude Opus 5.5 * chore: 🔥 drop the superpowers planning docs Phase 1 of the plan (#44's own description) called these dead weight. Assisted-by: GitHub Copilot:Claude Opus 5.5 * fix(sites): 🐛 stage cores held on another GPU A single-GPU sweep reused any CuPy core in place, so with Resources(devices=[d]) a core on another GPU met environments and sketches on GPU d. Reuse a core only when it sits on the sweep's GPU; stage the others through the host buffer as a group does. Addresses the Copilot review on #44. Assisted-by: GitHub Copilot:Claude Opus 5.5 * perf(bench): 📈 2-GPU point at the reference size Add the 2-GPU run and a second 4-GPU run (scaling --devices 4 2) at D_M = 4000, chi_out = 2000: 2348.8 s on two GPUs (84% against one GPU), 1290.4 s on four, QR distance 7.5e-13 between them. Correct what the environment stalls measure: they cover both passes and include waiting for the GPU. Assisted-by: GitHub Copilot:Claude Opus 5.5 * docs(bench): 📝 keep the best 4-GPU point at the reference size Assisted-by: GitHub Copilot:Claude Opus 5.5 * docs(hpc): 📝 HPC clusters section; drop the Leonardo logs and scripts Remove the benches/*/leonardo folders: the Slurm scripts and the run logs, which stay in the git history. bench_mpo_mpo.py moves up to benches/primitives/. The bench READMEs keep the result summaries, without job IDs. Add an "HPC clusters" section to the docs with a Leonardo page: the CUDA 13 forward-compat setup, an example Slurm job script for one or four GPUs, queues and performance notes. Assisted-by: GitHub Copilot:Claude Opus 5.5 --------- Co-authored-by: Roberto Di Remigio Eikås <roberto@totaltrash.xyz>
| Back | FazBrowse Home | New Git URL |
🤖 AI text below 🤖
Splits one SRC sweep among the GPUs of a single node, so that large stacks (the out-of-core reference problem of #42) finish close to G times faster on G GPUs. The mathematics, the random draws and the result do not change. Multi-node is out of scope for now.
Design
One process, one thread per GPU. The earlier MPI/SPMD design (still in docs/superpowers/, to be dropped) is replaced: nothing in it paid off on a single node. The call works as before: it returns the cores, raises errors normally, needs no mpirun, and reads in-memory inputs once.
What is not split (sets the efficiency)
Contractions scale as χ²D², these costs at most as D², so large problems should scale close to linearly; small ones will not.
Changes
Testing
Status
Left for later, if measurements call for them: a distributed CholeskyQR2 instead of the QR on GPU 0, splitting the bond of M for D_M above about 10⁴, and NUMA-local host buffers on GH200 nodes.