fix(storage#792): reject invalid checkpointing --num-processes early; clarify §4.3.5 message#794
Merged
FileSystemGuy merged 2 commits intoJul 15, 2026
Conversation
…and clarify §4.3.5 message Reporter ran `mlpstorage closed checkpointing run file --num-processes 408` (51 hosts × 8 ranks) for llama3-405b. Rules.md §4.6.1 requires exactly 8 (subset per §4.3.5) or 512 (full) processes; 408 is neither. Two things went wrong: 1. No fail-fast gate. CheckpointingRunRulesChecker did not validate num_processes, so DLIO ran the entire write+read pair before `mlpstorage validate` eventually rejected the artifacts. 2. Misleading post-hoc message. `add_checkpoint_params` in benchmarks/dlio.py auto-labels any downscaled run (num_processes < ClosedGPUs) with `checkpoint.mode="subset"` so DLIO applies the model.parallelism.data override. §4.3.5 saw the subset label and reported "subset run requires exactly 8 accelerators, got 408" — implying the user opted into subset when in fact the tool auto-labeled it. Adds `check_num_processes` to CheckpointingRunRulesChecker that returns INVALID (or OPEN, for multiples of TP*PP) when the count matches neither valid CLOSED form. The pre-run gate stops the misconfigured run before DLIO starts and names both valid forms in the error. Also updates the §4.3.5 submission-check error to name the specific model's two valid CLOSED forms and reference the auto-labeling behavior, so existing invalid results get a clearer message. 13 new tests cover the pre-run gate (all four models × both valid CLOSED forms, the exact 408×405b reporter case, an OPEN-only 256×405b case, non-LLM silent-pass, check-methods discovery) and the clarified §4.3.5 message (asserts both 8 and 512 appear for the reporter case; happy-path 8-accelerator subset still passes).
|
MLCommons CLA bot All contributors have signed the MLCommons CLA ✍️ ✅ |
This was referenced Jul 15, 2026
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.
Closes #792.
The reporter's scenario
Ran
mlpstorage closed checkpointing run file --num-processes 408forllama3-405b (51 hosts × 8 ranks). Rules.md §4.6.1 requires exactly 8
(subset per §4.3.5) or 512 (full) processes for 405b in CLOSED. 408 is
neither. The tool accepted the run, DLIO wrote and read 10 checkpoints,
and
mlpstorage validatethen reported the confusing error:Two root causes
1. No fail-fast gate.
CheckpointingRunRulesChecker(
mlpstorage_py/rules/run_checkers/checkpointing.py) only checkedbenchmark_typeandmodel.num_processeswas never validated, so amisconfigured CLOSED run consumed hours of I/O time before eventual
rejection at validate.
2. Misleading post-hoc message.
CheckpointingBenchmark.add_checkpoint_paramsinmlpstorage_py/benchmarks/dlio.py:1104-1111auto-labels any downscaledrun (
num_processes < ClosedGPUs) withcheckpoint.mode="subset"soDLIO applies the
model.parallelism.dataoverride. §4.3.5 then saw thesubsetlabel and reported the accelerator count against the subsetrule — implying the user had explicitly opted into subset mode.
Fix
mlpstorage_py/rules/run_checkers/checkpointing.py— newcheck_num_processes. ReturnsNonefor the two valid CLOSED forms(
LLM_SUBSET_PROCS= 8 orClosedGPUsper model),Issue(OPEN)whenthe count is a positive multiple of
TP*PP(§4.6.4 — prompts theuser to re-run under the
openpositional), andIssue(INVALID)otherwise. The INVALID message names both valid CLOSED forms so the
user sees which knob to turn. Silent-pass for non-LLM models (that
surface is owned by
check_model).mlpstorage_py/submission_checker/checks/checkpointing_checks.py—§4.3.5 subset-run message now names the specific model's two valid
CLOSED forms (e.g. "requires exactly 8 (subset) or 512 (full)") and
cites the auto-labeling behavior. Users with existing invalid results
get a clearer message. Genuine 8-accelerator subset runs and
non-LLM/unknown-model paths keep the original message.
Tests
mlpstorage_py/tests/test_issue792_checkpoint_num_processes.py— 13 newtests:
subset (8) for 70b/405b/1t; the exact 408×405b reporter case →
INVALID with both 8 and 512 in the message; 256×405b → OPEN with
re-run instruction; non-LLM model → silent-pass; method-discovery
guard.
8and512appear forthe 408×405b case; genuine 8-accelerator subset run still passes
(locks the change to the misconfig path only).
Test plan
uv run pytest mlpstorage_py/tests/test_issue792_checkpoint_num_processes.py— 13/13 passuv run pytest mlpstorage_py/tests tests/unit— 3611 passed, 1 skipped (unchanged from baseline)mlpstorage closed checkpointing run file --num-processes 408 --model llama3-405b …and confirm the run aborts pre-DLIO with the new error message naming both valid forms.