К основному содержанию
скилл CX Codex

nemo-mbridge-perf-cpu-offloading — скилл для Claude Code: CPU

Скилл помогает включить и проверить выгрузку данных на CPU в Megatron Bridge: активации по слоям и состояния оптимизатора через HybridDeviceOptimizer.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add NVIDIA/skills --skill nemo-mbridge-perf-cpu-offloading -a claude-code
Открыть на GitHub

Что делает nemo-mbridge-perf-cpu-offloading

Скилл разбирает два независимых механизма. Первый — activation offloading: выгружает активации (при желании и веса) по слоям трансформера через model.cpu_offloading*. Второй — optimizer offloading: держит состояния Adam (момент и дисперсию) на CPU через HybridDeviceOptimizer, настройки в optimizer.optimizer_cpu_offload.

Внутри — таблица выбора режима, справочник параметров с дефолтами, готовые сниппеты конфига и CLI-переопределения, минимальная команда запуска рецепта и юнит-тесты для проверки. Есть раздел с ограничениями: у activation offloading обязателен pipeline_model_parallel_size = 1, recompute_granularity = None, он несовместим с CUDA graphs и с fine_grained_activation_offloading, а cpu_offloading_num_layers должен лежать в диапазоне от 0 до num_layers-1. Optimizer offloading требует use_distributed_optimizer = True, зато без ограничений по PP и CUDA graphs.

Для больших MoE-моделей вроде Qwen3-30B-A3B activation offloading заблокирован: из-за PP=1 каждая GPU держит все 48 слоёв, и веса с состояниями оптимизатора (~70 GB) не влезают в H100 80 GB. Это повод сразу смотреть в сторону optimizer offloading. Выгрузка всегда добавляет накладные расходы, поэтому при приоритете пропускной способности её лучше не включать.

Какие задачи решает

  • снизить расход памяти GPU за счёт выгрузки активаций на CPU
  • вынести состояния оптимизатора Adam на CPU через HybridDeviceOptimizer
  • подобрать долю выгружаемых состояний оптимизатора под нехватку памяти
  • разобраться, почему после смены конфига offloading случился OOM или падение
  • проверить, что обучение без OOM даёт ту же кривую лосса, что и без выгрузки

Примеры запросов агенту

  • Включи optimizer CPU offloading в Megatron Bridge и проверь, что конфиг проходит валидацию
  • Настрой activation offloading для модели с PP=1 и объясни, какие ограничения придётся снять
  • Прогони юнит-тесты с фильтром cpu_offload и скажи, что они проверяют

Как установить nemo-mbridge-perf-cpu-offloading

1Через Skills CLI (Vercel)

npx skills add NVIDIA/skills --skill nemo-mbridge-perf-cpu-offloading -a claude-code

2Вручную: положить файлы

~/.claude/skills/nemo-mbridge-perf-cpu-offloading/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/nemo-mbridge-perf-cpu-offloading/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о nemo-mbridge-perf-cpu-offloading

Как установить nemo-mbridge-perf-cpu-offloading в Claude?

Выполни npx skills add NVIDIA/skills --skill nemo-mbridge-perf-cpu-offloading -a claude-code. После этого скилл лежит в ~/.claude/skills/nemo-mbridge-perf-cpu-offloading/SKILL.md.

Что делает nemo-mbridge-perf-cpu-offloading?

Описывает два способа выгрузки данных с GPU на CPU в Megatron Bridge: активации по слоям и состояния оптимизатора через HybridDeviceOptimizer. Плюс даёт параметры, ограничения и команды для проверки.

Чем activation offloading отличается от optimizer offloading?

Activation offloading работает только при pipeline_model_parallel_size = 1 и несовместим с CUDA graphs и recompute. Optimizer offloading таких ограничений не имеет, но требует use_distributed_optimizer = True.

Исходный текст

SKILL.md · Apache-2.0
---
name: nemo-mbridge-perf-cpu-offloading
description: Validate and use CPU offloading in Megatron Bridge, including layer-level activation offloading and fractional optimizer state offloading with HybridDeviceOptimizer.
license: Apache-2.0
when_to_use: Enabling CPU offload to reduce GPU memory, or investigating a commit that changed CPU offloading config and caused OOM or a crash; 'cpu_offloading', 'optimizer_cpu_offload', 'optimizer_offload_fraction', 'HybridDeviceOptimizer', 'move optimizer to CPU'.
---

# 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:

| Mechanism | Config namespace | What gets offloaded | PP restriction |
|---|---|---|---|
| Activation offloading | `model.cpu_offloading*` | Activations (and optionally weights) per transformer layer | PP must be 1 |
| Optimizer offloading | `optimizer.optimizer_cpu_offload` | Adam optimizer states (momentum + variance) via `HybridDeviceOptimizer` | None |

## Quick Decision

| 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 `optimizer_offload_fraction` |
| 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 |

## Enablement

### Optimizer CPU offloading (recommended for large models)

```python
cfg.optimizer.optimizer_cpu_offload = True
cfg.optimizer.optimizer_offload_fraction = 1.0
cfg.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 = True
cfg.model.cpu_offloading_num_layers = 16
cfg.model.cpu_offloading_activations = True
cfg.model.cpu_offloading_weights = False

cfg.model.pipeline_model_parallel_size = 1
cfg.model.recompute_granularity = None
cfg.model.cuda_graph_impl = "none"
```

## Config Parameter Reference

### Optimizer offloading

| Parameter | Default | Description |
|-----------|---------|-------------|
| `optimizer_cpu_offload` | `False` | Master switch |
| `optimizer_offload_fraction` | `0.0` | Fraction of optimizer states on CPU (0.0–1.0) |
| `overlap_cpu_optimizer_d2h_h2d` | `False` | Overlap GPU↔CPU transfers with compute |
| `use_torch_optimizer_for_cpu_offload` | `False` | Use `torch.optim` instead of fused optimizer for CPU portion |

### Activation offloading

| Parameter | Default | Description |
|-----------|---------|-------------|
| `cpu_offloading` | `False` | Master switch |
| `cpu_offloading_num_layers` | `0` | Number of transformer layers to offload (0 to num_layers-1) |
| `cpu_offloading_activations` | `True` | Offload activations |
| `cpu_offloading_weights` | `False` | Offload weights |
| `cpu_offloading_double_buffering` | `False` | Double-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

| Symptom | Likely Cause | How To Confirm | Fix |
|---|---|---|---|
| `Currently there is no support for Pipeline parallelism with CPU offloading` | Activation offload + PP > 1 | Check `pipeline_model_parallel_size` | Set PP=1 or use optimizer offloading |
| `CPU offloading does not work when activation recomputation is enabled` | Activation offload + recompute | Check `recompute_granularity` | Set `recompute_granularity=null` |
| `fine_grained_activation_offloading cannot be enabled with cpu_offloading` | Both offloading modes enabled | Check both flags | Use one or the other |
| `CUDA graphs not supported with CPU offloading` | CUDA graphs + activation offload | Check `cuda_graph_impl` | Set `cuda_graph_impl="none"` |
| 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 `overlap_cpu_optimizer_d2h_h2d` |
| OOM at partial optimizer offload | Insufficient offload for this config | Check memory at different fractions | Increase 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 · Apache-2.0 · NVIDIA/skills

Похожие скиллы

Всё по теме «ИИ и ML» →
gpu-server-management devops-skills Скилл ведёт агента по установке драйверов NVIDIA, CUDA и Docker с GPU, делит A100/H100 через MIG и настраивает мониторинг. CX Codex +1 331установок cuda-profiling mohitmishra786 Ведёт агента по профилированию CUDA-приложений: таймлайн в Nsight Systems, метрики ядер в Nsight Compute, разбор roofline и узких мест. CX Codex +1 316установок cuda mohitmishra786 Помогает агенту писать и оптимизировать CUDA-ядра: иерархия потоков, разделяемая память, потоки, флаги nvcc и Thrust. CX Codex +1 320установок run-experiment wanshuiyin Скилл разворачивает и запускает ML-эксперименты на локальном GPU, удалённом сервере, Vast.ai или Modal. Пригодится, когда обучение надо стартовать, а не настраивать вручную. CX Codex +1 523установок pod-doctor runpod Находит причины сбоев в подах Runpod: ошибки прокси 502, пропажу GPU после перезагрузки и зависания контейнеров. Работает в режиме чтения через MCP-инструменты Runpod. CX Codex +1 2 600установок discovery runpod Скилл проверяет наличие серверов, видеокарт и цены в каталогах Runpod без запуска инфраструктуры. Помогает рассчитать нужный объём видеопамяти под модель. CX Codex +1 2 600установок

Из того же набора178

nemo-mbridge-perf-moe-hardware-configs Справочник стартовых конфигураций обучения MoE для H100, B200, GB200 и GB300. Нужен для выбора диспетчера, параллелизма и проверки ожидаемой производительности. CX Codex +1 1 800установок nemo-mbridge-perf-moe-comm-overlap Скилл по перекрытию expert-parallel коммуникаций в Megatron Bridge: настройка dispatch/combine, flex-диспетчер и планирование expert wgrad. CX Codex +1 1 800установок nemo-mbridge-perf-moe-long-context Помогает подобрать context parallelism и selective recompute при обучении MoE-моделей на длинных контекстах в Megatron Bridge. CX Codex +1 1 800установок nemo-mbridge-perf-expert-parallel-overlap Скилл для настройки и проверки перекрытия expert-parallel коммуникаций в Megatron-Bridge: диспетчеры alltoall и flex, DeepEP и HybridEP. CX Codex +1 1 800установок nemo-mbridge-perf-moe-optimization-workflow Скилл задаёт строгий регламент оптимизации пропускной способности MoE-моделей в Megatron Bridge. Пригодится при поиске причин падения скорости после правок конфига или кода. CX Codex +1 1 800установок nemo-mbridge-multi-node-slurm Переводит односерверные запуски в Slurm-задачи на несколько узлов и помогает искать сбои NCCL, запуска и памяти. CX Codex +1 1 800установок nemo-mbridge-perf-sequence-packing Скилл для настройки packed sequences и длинноконтекстного обучения в Megatron-Bridge: офлайн-упаковка LLM, упаковка VLM на этапе collate, онлайн-упаковка Energon. CX Codex +1 1 800установок nemo-mbridge-perf-moe-vlm-training Скилл с практическими рекомендациями по обучению MoE VLM в Megatron Bridge. Помогает настроить FSDP или 3D-параллелизм и избежать падений по OOM. CX Codex +1 1 800установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой