·
Last changedVersion:
This version passed the hardening gate. Hardening applied 2 targeted changes and preserved all other text. Classified findings before hardening: 1. Classified findings closed: 0. Classified findings remaining: 1. Unclassified scanner findings remaining: 0. Review findings closed: 2. Review findings remaining: 9.
1
1
Expand | File | Group | Subtype | Severity | Status |
|---|---|---|---|---|---|
BENCHMARK.md | Sensitive Data & Secret Exposure | Agent snooping | Medium | Open |
1 finding
Two independent mechanisms to move data from GPU to CPU memory:
| Mechanism | Config namespace | What gets offloaded | PP restriction |
|---|---|---|---|
Activation offloading |
| Activations (and optionally weights) per transformer layer | PP must be 1 |
Optimizer offloading |
| Adam optimizer states (momentum + variance) via | None |
| Situation | Recommendation |
|---|---|
Large MoE model (30B+), needs PP > 1 | Optimizer offloading — activation offloading is blocked by PP=1 |
Small/medium model, PP=1 fits, activation memory dominates | Activation offloading |
Want tunable memory-speed tradeoff | Optimizer offloading with fractional |
Throughput is top priority | Don't enable — offloading always adds overhead |
CUDA graphs are needed | Only optimizer offloading — activation offloading is incompatible |
Memory pressure is moderate | Optimizer offload at 25–50% fraction for best efficiency |
CLI overrides:
| Parameter | Default | Description |
|---|---|---|
|
| Master switch |
|
| Fraction of optimizer states on CPU (0.0–1.0) |
|
| Overlap GPU↔CPU transfers with compute |
|
| Use |
| Parameter | Default | Description |
|---|---|---|
|
| Master switch |
|
| Number of transformer layers to offload (0 to num_layers-1) |
|
| Offload activations |
|
| Offload weights |
|
| Double-buffer across layers while reloading |
pipeline_model_parallel_size must be 1recompute_granularity must be Nonefine_grained_activation_offloadinguse_distributed_optimizer = True (default in most recipes)optimizer_offload_fraction must be in [0.0, 1.0]Activation offloading is blocked for Qwen3-30B-A3B and similar large MoE models. The PP=1 constraint means each GPU holds all 48 layers; model weights + optimizer states alone (~70 GB) exceed H100 80 GB capacity.
| Symptom | Likely Cause | How To Confirm | Fix |
|---|---|---|---|
| Activation offload + PP > 1 | Check | Set PP=1 or use optimizer offloading |
| Activation offload + recompute | Check | Set |
| Both offloading modes enabled | Check both flags | Use one or the other |
| CUDA graphs + activation offload | Check | Set |
OOM with activation offloading | Model too large for PP=1 | Check allocated memory vs 80 GB | Use optimizer offloading with PP > 1 |
Extreme slowdown (>4x) | 100% optimizer offload, CPU Adam bottleneck | Compare iter time at different fractions | Reduce fraction or enable |
OOM at partial optimizer offload | Insufficient offload for this config | Check memory at different fractions | Increase fraction or add PP |
fine_grained_activation_offloading is a separate module-level approach
that works with PP > 1 but cannot be combined with layer-level
cpu_offloading.Get started with chainctlchainctl skill install public/nvidia/nemo-mbridge-perf-cpu-offloading:latest
Bring Chainguard's hardening pipeline to your first-party skills — custom rulesets, automated remediation, full audit trail.
skills.chainreg.biz/public/github.com/nvidia/skills/nemo-mbridge-perf-cpu-offloading:latest
Apache-2.0
BENCHMARK.md
HARDENING.md
LICENSE
SKILL.md
card.yaml
evals/evals.json
skill-card.md
skill.oms.sig