-
Notifications
You must be signed in to change notification settings - Fork 517
Add ModelOpt QAD skill for Slurm workflows #2010
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mxinO
wants to merge
20
commits into
main
Choose a base branch
from
mxin/qad-skill
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
20 commits
Select commit
Hold shift + click to select a range
1eb8ce6
Add ModelOpt QAD skill
mxinO afd59b4
Preserve PTQ configuration for QAD
mxinO 8abffb7
Clarify PTQ handoff to QAD
mxinO 494d46c
Reuse existing PTQ evaluation for QAD
mxinO f8f8764
Clarify Megatron expert parallel topology
mxinO ef9be33
Add QAD training safety controls
mxinO 61aa5f0
Add QAD PTQ compatibility gate
mxinO 81e57bf
Merge remote-tracking branch 'origin/main' into mxin/qad-skill
mxinO 95e29fa
Merge remote-tracking branch 'origin/main' into mxin/qad-skill
mxinO 62fda52
Move QAD data blend to Megatron example
mxinO 41ec0ac
Address QAD review feedback
mxinO 1688751
Merge remote-tracking branch 'origin/main' into mxin/qad-skill
mxinO 49a456d
Refine QAD data and resume workflow
mxinO 44b416a
Merge remote-tracking branch 'origin/main' into mxin/qad-skill
mxinO 23e83d7
Refine QAD recovery evaluation policy
mxinO b2188d4
Clarify QAD scheduling and baseline comparisons
mxinO 7850116
Streamline QAD run policy
mxinO efab39b
Address QAD review feedback
mxinO 84fcc1c
Address QAD documentation feedback
mxinO 173ed02
Merge origin/main into mxin/qad-skill
mxinO File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,106 @@ | ||
| --- | ||
| name: qad | ||
| description: >- | ||
| Run explicitly requested ModelOpt Quantization-Aware Distillation (QAD) on | ||
| Slurm through Megatron Bridge to recover a measured BF16-to-PTQ accuracy gap. | ||
| Use only when the user explicitly asks for QAD, including its topology, data | ||
| preparation, Slurm launch, resume, checkpoint export, or recovery decisions. | ||
| --- | ||
|
|
||
| # ModelOpt Quantization-Aware Distillation | ||
|
|
||
| QAD is expensive. Run it only when the user explicitly authorizes QAD for the | ||
| target model or run. A Day-0, PTQ, evaluation, comparison, or recipe-search | ||
| request alone is not authorization to start QAD. | ||
|
|
||
| ## Follow the supported workflow | ||
|
|
||
| Before constructing commands, read: | ||
|
|
||
| - `examples/megatron_bridge/README.md`, especially PTQ, data preparation, QAD, | ||
| export, and Slurm usage | ||
| - `examples/megatron_bridge/{quantize.py,distill.py}` via `--help` | ||
| - `skills/common/{environment-setup,workspace-management,slurm-setup}.md`; also | ||
| `skills/common/remote-execution.md` for remote Slurm | ||
|
|
||
| Treat the example README and `--help` output as authoritative for mutable flags, | ||
| commands, containers, and checkpoint formats. This skill supports Slurm only. | ||
|
|
||
| ## Execute in this order | ||
|
|
||
| 1. **Confirm the gap.** Reuse only validated, comparable BF16/PTQ results and | ||
| the exact benchmark configuration from preceding evaluation or recipe | ||
| search; run missing, invalid, or non-comparable baselines. Confirm the target | ||
| benchmarks and their context-length needs. Stop if the PTQ gap to BF16 is | ||
| already below 1%. | ||
| 2. **Reproduce PTQ and verify compatibility.** In the target runtime, require | ||
| `AutoBridge.can_handle()` for the target model and PTQ through `quantize.py` | ||
| to succeed while preserving the exact preceding PTQ config or recipe: | ||
| format, layer selection, calibration data/count, sequence length, and seed. | ||
| A changed quantization setting is a new PTQ candidate and must be evaluated | ||
| before QAD. In the master-rank `.quant_summary.txt`, require finite positive | ||
| `amax` for enabled static quantizers; accept `dynamic`/format-defined `None` | ||
| only when the recipe intends it. Treat the summary as rank-local under model | ||
| parallelism. | ||
| 3. **Choose topology explicitly.** Derive the smallest fitting node count and | ||
|
mxinO marked this conversation as resolved.
|
||
| TP/PP/CP/EP from student and teacher architecture, the chosen sequence length, | ||
| and available GPU memory. Prefer CP before TP for small long-context models; | ||
| keep EP=1 for dense models and ETP=1 because the current `distill.py` | ||
| workflow does not support expert tensor parallelism. For MoE require: | ||
|
|
||
| - `DP = world_size / (TP * PP * CP)` | ||
| - `EDP = world_size / (EP * PP)` | ||
| - integral DP/EDP, `num_experts % EP == 0`, and | ||
| `GBS % (MBS * DP) == 0` | ||
|
|
||
| 4. **Prepare the full capped dataset once.** Use suitable user-provided data, or | ||
| copy `examples/megatron_bridge/data/nemotron-cascade-2-blend.yaml` as the | ||
| default. Set the target tokenizer and workspace path, then materialize the | ||
| randomly sampled subset before training. Pack the chosen sequence length; | ||
| Megatron's `99,1,0` split creates the 1% validation holdout from the same | ||
| data. | ||
| 5. **Run and monitor QAD.** Run one QAD training job at a time and fold startup | ||
| validation into it; do not submit separate GPU preflight jobs or split at | ||
| recovery iterations. Let training continue while evaluating saved | ||
| checkpoints, and cancel it when a stop condition below is met. | ||
|
|
||
| ## Default training policy | ||
|
mxinO marked this conversation as resolved.
|
||
|
|
||
| | Setting | Default | | ||
| | --- | --- | | ||
| | Sequence length | 32768; adjust for target benchmarks | | ||
| | Peak / minimum LR | `1e-5` / `1e-6` | | ||
| | LR schedule | cosine | | ||
| | Training cap | 1000 iterations | | ||
| | Global batch size | 512 | | ||
| | Dataset | `nvidia/Nemotron-Cascade-2-SFT-Data` by default | | ||
| | Materialized token budget | 17.3B at 32K; cover the full cap at the chosen length | | ||
| | Training validation | every 25 iterations; deterministic 1% holdout; 2 batches | | ||
| | Checkpoint interval | 50 iterations | | ||
| | Loss logging | every 10 iterations | | ||
| | Recovery benchmark | 150, then every 100 iterations while training runs | | ||
| | Slurm duration exit | 220 minutes for a 4-hour allocation | | ||
|
|
||
| ## Run policy | ||
|
|
||
| - Keep `train_iters=1000` and leave `exit_interval` unset. | ||
| - From initial step timing, submit only enough sequential jobs to reach | ||
| checkpoint 150; never submit through iteration 1000 upfront. At each recovery | ||
| checkpoint, submit to the next only after its targeted evaluation and any | ||
| triggered full suite, and only if the BF16 gap remains at least 1% and | ||
| recovery has neither plateaued nor regressed. | ||
| - Give all training jobs the same run-specific job name and | ||
| `--dependency=singleton`; record job IDs and, on any stop, cancel pending jobs | ||
| before the active job. | ||
| - Cancel on non-finite loss, repeated skipped iterations, or a sustained spike. | ||
| At iteration 50, require the loss aggregate to be lower than at iteration 10. | ||
| - At each recovery checkpoint, first evaluate the one to three benchmarks with | ||
| the largest PTQ drops. Run the remaining original PTQ suite at that checkpoint | ||
| only after recovery beyond run noise. | ||
| - Cancel when the full-suite gap to BF16 is below 1%, benchmark recovery | ||
| regresses beyond run noise, or benchmark recovery and loss both plateau. | ||
| - After a duration exit, resume the latest QAD checkpoint in the same output | ||
| directory with unchanged prepared data paths/cache, seed, topology, optimizer, | ||
| scheduler, iteration, and consumed-sample state; do not restart from PTQ. | ||
| - Report the PTQ recipe, data sample, Slurm topology, loss/state, checkpoints, | ||
| and comparable BF16/PTQ/QAD results. | ||
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| ../../.agents/skills/qad |
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
45 changes: 45 additions & 0 deletions
45
examples/megatron_bridge/data/nemotron-cascade-2-blend.yaml
|
mxinO marked this conversation as resolved.
mxinO marked this conversation as resolved.
|
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
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,45 @@ | ||
| # Set to the target model's Hugging Face ID or local tokenizer path. | ||
| tokenizer: <target-model-tokenizer> | ||
| output_dir: <session-model-workspace>/data/nemotron-cascade-2-through-1000 | ||
| target_tokens: 17_300_000_000 | ||
| sources: | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: math | ||
| split: train | ||
| content_field: messages | ||
| weight: 21.1 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: science | ||
| split: train | ||
| content_field: messages | ||
| weight: 10.9 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: chat | ||
| split: train | ||
| content_field: messages | ||
| weight: 56.2 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: instruction_following | ||
| split: train | ||
| content_field: messages | ||
| weight: 3.3 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: safety | ||
| split: train | ||
| content_field: messages | ||
| weight: 0.02 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: conversational_agent | ||
| split: train | ||
| content_field: messages | ||
| weight: 3.3 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: swe | ||
| split: train | ||
| content_field: messages | ||
| weight: 1.8 | ||
| - hf_dataset: nvidia/Nemotron-Cascade-2-SFT-Data | ||
| config: terminal_agent | ||
| split: train | ||
| content_field: messages | ||
| weight: 3.3 |
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
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
Oops, something went wrong.
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.
Uh oh!
There was an error while loading. Please reload this page.