Nemo Mbridge Perf Cpu Offloading

作者 nvidiacf5224d14250Apache-2.03.5K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫今天更新

Validate and use CPU offloading in Megatron Bridge, including layer-level activation offloading and fractional optimizer state offloading with HybridDeviceOptimizer.

僅含說明DevOps & Cloud
AI 產生的概覽

指導在 Megatron Bridge 訓練中啟用並驗證啟動值與優化器狀態的 CPU 卸載。

功能
此技能說明 Megatron Bridge 中的兩種 CPU 卸載機制:層級啟動值卸載,以及透過 HybridDeviceOptimizer 實現的部分優化器狀態卸載。它提供設定參數、相容性限制、啟用程式片段、最小執行命令、驗證步驟與故障診斷表。產出的是設定指引與排錯建議,而非檔案或程式產物。
適用情境
在 Megatron Bridge 訓練中為降低 GPU 記憶體而啟用 CPU 卸載時使用,或在追查某個變更 CPU 卸載設定並導致記憶體不足或崩潰的提交時使用。它也有助於依模型規模與平行設定選擇啟動值卸載或優化器卸載。
執行需求
不隨附指令碼,僅為說明性內容。它引用 Megatron Bridge 與 Megatron-LM 的原始碼路徑、文件與單元測試,並假定具備 GPU 硬體、uv 執行器以及用於驗證命令的 pytest 的訓練環境。

CPU Offloading

References

  • Stable docs: @docs/training/cpu-offloading.md
  • Structured metadata: @skills/nemo-mbridge-perf-cpu-offloading/card.yaml

What It Is

Two independent mechanisms to move data from GPU to CPU memory:

MechanismConfig namespaceWhat gets offloadedPP restriction
Activation offloadingmodel.cpu_offloading*Activations (and optionally weights) per transformer layerPP must be 1
Optimizer offloadingoptimizer.optimizer_cpu_offloadAdam optimizer states (momentum + variance) via HybridDeviceOptimizerNone

Quick Decision

SituationRecommendation
Large MoE model (30B+), needs PP > 1Optimizer offloading — activation offloading is blocked by PP=1
Small/medium model, PP=1 fits, activation memory dominatesActivation offloading
Want tunable memory-speed tradeoffOptimizer offloading with fractional optimizer_offload_fraction
Throughput is top priorityDon't enable — offloading always adds overhead
CUDA graphs are neededOnly optimizer offloading — activation offloading is incompatible
Memory pressure is moderateOptimizer offload at 25–50% fraction for best efficiency

Enablement

Optimizer CPU offloading (recommended for large models)

python
cfg.optimizer.optimizer_cpu_offload = Truecfg.optimizer.optimizer_offload_fraction = 1.0cfg.optimizer.overlap_cpu_optimizer_d2h_h2d = True

CLI overrides:

bash
optimizer.optimizer_cpu_offload=True \optimizer.optimizer_offload_fraction=0.5 \optimizer.overlap_cpu_optimizer_d2h_h2d=True

Activation CPU offloading (small/medium models only)

python
cfg.model.cpu_offloading = Truecfg.model.cpu_offloading_num_layers = 16cfg.model.cpu_offloading_activations = Truecfg.model.cpu_offloading_weights = False
cfg.model.pipeline_model_parallel_size = 1cfg.model.recompute_granularity = Nonecfg.model.cuda_graph_impl = "none"

Config Parameter Reference

Optimizer offloading

ParameterDefaultDescription
optimizer_cpu_offloadFalseMaster switch
optimizer_offload_fraction0.0Fraction of optimizer states on CPU (0.0–1.0)
overlap_cpu_optimizer_d2h_h2dFalseOverlap GPU↔CPU transfers with compute
use_torch_optimizer_for_cpu_offloadFalseUse torch.optim instead of fused optimizer for CPU portion

Activation offloading

ParameterDefaultDescription
cpu_offloadingFalseMaster switch
cpu_offloading_num_layers0Number of transformer layers to offload (0 to num_layers-1)
cpu_offloading_activationsTrueOffload activations
cpu_offloading_weightsFalseOffload weights
cpu_offloading_double_bufferingFalseDouble-buffer across layers while reloading

Compatibility And Constraints

Activation offloading

  • pipeline_model_parallel_size must be 1
  • recompute_granularity must be None
  • Cannot combine with fine_grained_activation_offloading
  • Cannot combine with CUDA graphs
  • cpu_offloading_num_layers must be in [0, num_layers-1)

Optimizer offloading

  • Requires use_distributed_optimizer = True (default in most recipes)
  • No PP, recompute, or CUDA graph restrictions
  • optimizer_offload_fraction must be in [0.0, 1.0]

Practical: large MoE models

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.

Minimal Runnable Command

bash
uv run python scripts/training/run_recipe.py \  --recipe qwen3_30b_a3b_pretrain_config \  optimizer.optimizer_cpu_offload=True \  optimizer.optimizer_offload_fraction=0.5 \  train.train_iters=20 \  train.global_batch_size=8 \  train.micro_batch_size=1

Verification

Unit tests

bash
uv run python -m pytest \  tests/unit_tests/models/test_gpt_full_te_layer_autocast_spec.py -k "cpu_offload" \  tests/unit_tests/peft/test_utils.py -k "cpu_offload" -q

Success criteria

  • Config validation passes for the selected offloading mode
  • Training completes without OOM or NCCL errors
  • Loss matches the non-offloaded baseline (max delta < 0.001)
  • Memory usage drops proportionally to offload fraction

Code Anchors

MCore activation offload constraints

1296:1310:3rdparty/Megatron-LM/megatron/core/transformer/transformer_config.py
        if self.cpu_offloading and (            self.cpu_offloading_num_layers < 0 or self.cpu_offloading_num_layers >= self.num_layers        ):            raise ValueError(...)
        if self.cpu_offloading and self.pipeline_model_parallel_size > 1:            raise ValueError(                "Currently there is no support for Pipeline parallelism with CPU offloading"            )
        if self.cpu_offloading and self.recompute_granularity is not None:            raise ValueError(                "CPU offloading does not work when activation recomputation is enabled"            )

MCore CUDA graph incompatibility

1943:1944:3rdparty/Megatron-LM/megatron/core/transformer/transformer_config.py
            if self.cpu_offloading:                raise ValueError("CUDA graphs not supported with CPU offloading.")

MCore fine-grained offloading mutual exclusion

1427:1430:3rdparty/Megatron-LM/megatron/core/transformer/transformer_config.py
        if self.fine_grained_activation_offloading:            assert (                not self.cpu_offloading            ), "fine_grained_activation_offloading cannot be enabled with cpu_offloading."

MCore HybridDeviceOptimizer instantiation

480:518:3rdparty/Megatron-LM/megatron/core/optimizer/__init__.py
        if config.optimizer_cpu_offload:            # ... setup cpu/gpu optimizer classes ...            optimizer = HybridDeviceOptimizer(                param_groups,                offload_fraction=config.optimizer_offload_fraction,                cpu_optimizer_cls=cpu_optimizer_cls,                gpu_optimizer_cls=gpu_optimizer_cls,                overlap_cpu_optimizer_d2h_h2d=config.overlap_cpu_optimizer_d2h_h2d,                pin_cpu_grads=config.pin_cpu_grads,                pin_cpu_params=config.pin_cpu_params,            )

Bridge CUDA graph guard

232:234:src/megatron/bridge/models/gpt_full_te_layer_autocast_spec.py
        assert not config.cpu_offloading and config.recompute_granularity is None, "Cudagraphs not supported"

Bridge activation offloading in PEFT

621:631:src/megatron/bridge/peft/utils.py
        if self.config.cpu_offloading and self.config.cpu_offloading_activations:            x.activation_offloading = True        x, _ = self.linear_in(x)        x = self.activation(x)        if self.config.cpu_offloading and self.config.cpu_offloading_activations:            x.activation_offloading = True        x, _ = self.linear_out(x)

Failure Diagnosis

SymptomLikely CauseHow To ConfirmFix
Currently there is no support for Pipeline parallelism with CPU offloadingActivation offload + PP > 1Check pipeline_model_parallel_sizeSet PP=1 or use optimizer offloading
CPU offloading does not work when activation recomputation is enabledActivation offload + recomputeCheck recompute_granularitySet recompute_granularity=null
fine_grained_activation_offloading cannot be enabled with cpu_offloadingBoth offloading modes enabledCheck both flagsUse one or the other
CUDA graphs not supported with CPU offloadingCUDA graphs + activation offloadCheck cuda_graph_implSet cuda_graph_impl="none"
OOM with activation offloadingModel too large for PP=1Check allocated memory vs 80 GBUse optimizer offloading with PP > 1
Extreme slowdown (>4x)100% optimizer offload, CPU Adam bottleneckCompare iter time at different fractionsReduce fraction or enable overlap_cpu_optimizer_d2h_h2d
OOM at partial optimizer offloadInsufficient offload for this configCheck memory at different fractionsIncrease fraction or add PP

Known Limitations

  • Activation offloading requires PP=1, making it impractical for large models (30B+ MoE) that need pipeline parallelism.
  • Optimizer offloading throughput penalty scales linearly (~1.9x at 25%, ~4.2x at 100% for Qwen3-30B-A3B).
  • D2H/H2D overlap provides only ~7% speedup because CPU Adam compute is the dominant bottleneck.
  • fine_grained_activation_offloading is a separate module-level approach that works with PP > 1 but cannot be combined with layer-level cpu_offloading.

來源與署名

來源:nvidia/skills位於skills/nemo-mbridge-perf-cpu-offloading提交cf5224d

授權條款: Apache-2.0

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架