Housekeeping: KNOWN_ISSUES #16, GPU legend grouping fix, run_container.sh extra binds#112
Conversation
The pydot/pyparsing conflict reported during singularity/apptainer builds is pre-existing in the NGC tensorflow:25.02-tf2-py3 base image and harmless (Aetherscan never imports pydot); document it so future builders don't chase it. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Matplotlib fills legends column-major, so the combined usage+memory legend with ncol=min(4, n_gpus*2) interleaved metrics across columns (5 GPUs -> 10 entries in 4 columns = 3/3/2/2, with memory entries continuing mid-column under usage). Pad each metric's handle/label lists to a whole number of columns with invisible handles so usage occupies its own column(s) and memory always starts a fresh column (5 GPUs -> columns of 3,2 | 3,2), capping the legend at 3 rows. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Comma-separated host paths, each bound 1:1 and appended to the standard bind list, so data outside the standard dirs (e.g. raw .h5 files under /datag for CSV inference on blpc3) no longer requires the runtime's native SINGULARITY_BIND passthrough — which continues to work and remains additive. Documented in the script header, the README raw-.h5 inference example, and the README .env example block. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Claude finished @zachtheyek's task in 1m 6s —— View job PR Review: Housekeeping fixes
Clean, well-scoped housekeeping PR. All three changes are correct and well-documented. A few observations below: KNOWN_ISSUES.md entry #16Follows the existing format exactly. The rationale is sound — the conflict is upstream in the NGC base image, GPU legend grouping fix (
|
|
@claude please perform a second-pass code review of this PR. Re-review the current diff for any remaining correctness bugs, security issues, or significant quality problems, and post your findings. If the diff is clean, please say so explicitly. (Final verification round before merge.) |
Second-Pass Code ReviewI've reviewed the current diff for correctness bugs, security issues, and quality problems. The diff is clean — no issues found. Details by change:1. KNOWN_ISSUES.md entry 16 — Pure documentation; follows the existing format exactly. No concerns. 2. GPU legend grouping fix (
3.
4. README.md — Documentation additions are accurate and consistent with the implementation. No correctness bugs, no security issues, no quality problems. LGTM for merge. |
|
Release note draft — Improved The GPU resource plot legend now correctly groups usage and memory entries into separate columns, fixing a layout issue where memory labels could appear under usage labels on systems with 5 or more GPUs. Additionally, the container launcher ( Draft for the changelog; edit or drop as needed. |
Closes #111
Summary
Three small housekeeping items (PR-01 of the v1 push):
KNOWN_ISSUES.md entry Welcome to Aetherscan Discussions! #16 — documents the pip dependency-resolver error (
pydot 3.0.4vspyparsing 2.4.7) printed duringsingularity/apptainer buildofaetherscan.def. The conflict is pre-existing in the NGCtensorflow:25.02-tf2-py3base image, nothing inrequirements-container.txttouches either package, Aetherscan never importspydot, and the built image is fully functional. Status: won't fix (upstream base image); documented. Follows the exact Symptom/Cause/Impact/Workaround/Status format of entries 1-15.GPU legend grouping fix (
src/aetherscan/monitor/monitor.py) — the combined usage+memory legend usedncol=min(4, n_gpus*2); matplotlib fills legends column-major, so with 5 GPUs the 10 entries landed in 4 columns as 3/3/2/2 with memory entries continuing mid-column under usage entries. Now each metric's handle/label lists are padded to a whole number of columns with invisible handles (Line2D([], [], alpha=0), empty label), withcols_per_metric = ceil(n_gpus/3)(caps the legend at 3 rows) andncol = 2*cols_per_metric— usage entries occupy their own column(s) and memory entries always start a fresh column (5 GPUs -> columns of 3,2 | 3,2).utils/run_container.shextra binds — newAETHERSCAN_EXTRA_BINDSenv var: comma-separated host paths, each bound 1:1 and appended to the standard bind list, so CSV inference on blpc3 becomesAETHERSCAN_EXTRA_BINDS=/datag ./utils/run_container.sh ...instead of relying on the runtime's nativeSINGULARITY_BINDpassthrough (which continues to work and remains additive). Documented in the script header, the README raw-.h5inference example, and the README.envexample block.No
cli.pychanges, so the README CLI Reference blocks are untouched.Verification
There is no test suite yet (tracked separately as the upcoming testing-suite PR), so no pytest claims — here is exactly what was verified and how:
Legend fix (local matplotlib script, no cluster needed): reproduced the exact pre-fix and post-fix legend construction (same twinx axes, per-GPU solid usage + dashed memory lines, same label format) for n_gpus in {1, 2, 4, 5, 6, 8} and eyeballed the saved PNGs:
... :0 (Memory)appearing directly under:3/:4 (Usage)— the reported bug, reproduced.usage | memory; n=2 -> one usage column, one memory column; n=4 -> 2,2 | 2,2; n=5 -> 3,2 | 3,2; n=6 -> 3,3 | 3,3; n=8 -> 3,3,2 | 3,3,2. In every case memory entries start a fresh column and never share a column with usage entries.gpu_datais non-empty (no zero division); only the GPU loop adds labeled artists to these axes, so entry counts never exceed the padded slot count; a GPU missing one metric just gets extra invisible padding.Extra binds (blpc3, this branch checked out in the cluster repo):
The cluster repo was restored to
masterafterward (clean tree).pre-commit run --all-filespasses;bash -n utils/run_container.shpasses; all commits GPG-signed.Deferred validation: none — nothing in this PR is bla0-only. The production resource plot renders on pipeline shutdown, so the next real cluster run will exercise the new legend path end-to-end.
AI assistance disclosure
Implemented with Claude Code (implementation, documentation, and verification, per AI_POLICY.md). All changes were verified as described above.
🤖 Generated with Claude Code