Repository navigation
π Release v0.8.0
β¨ Highlights
Container
Both linux/amd64 and linux/arm64 Docker containers are available on NGC as nvcr.io/nvidia/nemo-rl:v0.8.0.
Here are the major software components included in the container:
| Software Component | Version |
|---|---|
| NeMo-RL | 0.8.0 |
| NeMo-Gym | 0.7.0+1f8afc7 |
| NeMo-Automodel | 0.6.1+72dacef |
| Megatron-Bridge | 0.7.0+e0b5630 |
| Megatron-Core | 0.20.0+a694348 (via Megatron-Bridge) |
| PyTorch | 2.13.0 (2.11.0 in the SGLang and TensorRT-LLM environments) |
| vLLM | 0.29.0 |
| SGLang | 0.5.17.dev30+g3003d70f6 |
| TensorRT-LLM | 1.3.0rc21 |
| Ray | 2.58.0 |
| Transformers | 5.12.1 |
The NeMo-RL container is built on top of nvcr.io/nvidia/cuda-dl-base:26.05-cuda13.2-devel-ubuntu24.04 and uses Python 3.13.14.
If you would like to build this container, or nightly containers, yourself, we provide the exact instructions we use at https://docs.nvidia.com/nemo/rl/latest/docker.html#release-image.
Single Controller (beta)
NeMo RL v0.8 adds the Single Controller, a new async RL runtime (#3219, #3220, #3266, #3267, #3427). One CPU-only Ray actor runs two loops at the same time: a rollout loop that generates one prompt group at a time, and a train loop that trains as soon as enough groups are ready. The two loops share the TransferQueue data plane. Finished groups go into a replay buffer, and a sampler picks which groups each step trains on, so rollout batching is no longer tied to the training batch.
Compared with the existing async GRPO path, the Single Controller keeps the GPUs busier in two ways:
- Streaming: training starts as soon as
async_rl.min_groups_for_streaming_trainprompt groups are ready, instead of waiting for the full batch, so training and generation overlap more. Set it tonum_prompts_per_stepto keep full-batch steps. - Samplers:
in_ordermatches the existing async GRPO path (each dispatched batch trains at its planned step).weight_fifo,ready_first, andwindowedtrain on groups as they finish, so the trainer waits less;ready_firstalso uses late groups instead of throwing them away. The right sampler for your recipe depends on how much asynchrony (training on rollouts from older weights) your training can tolerate.
The Single Controller implements streaming as described in the StreamRL paper: instead of waiting for a full batch of rollouts (panel c), the trainer starts on groups as they finish (panel d). Figure 5 from StreamRL (Zhong et al., arXiv:2504.15930, CC BY-SA 4.0):
async_rl:
min_groups_for_streaming_train: 8 # below num_prompts_per_step turns on streaming
sampler:
name: ready_first # in_order | weight_fifo | ready_first | windowed | custom
max_staleness_versions: 1How each sampler picks groups from the same buffer:
What it supports in v0.8:
- Megatron training backend only. Automodel training on the Single Controller is not supported yet and is coming in the next release.
- GRPO and PPO (#3773), with five samplers:
in_order,weight_fifo,ready_first(#3582),windowed, andcustom. PPO supports onlyin_orderwithout streaming. - vLLM or Megatron Inference for rollouts, colocated or not for Megatron Inference (#3727, #3730, #4009), plus NeMo Gym rollouts, Router Replay (R3) (#3378), VLM GRPO, and MOPD (#3768).
- Keeps training when things fail (#3589, #3590, #3591, #3592, #3665). Failed rollouts are retried within a budget or dropped. If a generation shard dies, the run rebuilds its refit group over the shards that are left and keeps going. Dead shards can be restarted and rejoin at the next refit. All of this is off by default; see
async_rl.rollout_failure,async_rl.generation_fleet_health, andasync_rl.generation_router. - Checkpoint and resume, including rollouts (#3429, #3480, #3923, #3924, #3925, #3898). Checkpoints keep finished rollouts that were not trained on yet, and re-run prompt groups that were still in flight. Periodic rollout snapshots save progress between trainer checkpoints. Works with both the
simpleandmooncake_cpudata-plane backends. - Exact token capture (#3837, #4129, #4191). For NeMo Gym rollouts, the exact tokens and logprobs produced by inference are captured and used for training, with no retokenization. Works with vLLM and Megatron Inference; images and video are captured on vLLM.
uv run examples/run_grpo_single_controller.py --config examples/configs/grpo_math_1B_megatron_single_controller.yamlThe Single Controller needs data_plane.enabled: true and (for vLLM) async_engine: true with non-colocated generation. Validation, reward shaping, and dynamic sampling are not supported yet. Example recipes:
- Async GRPO: grpo-llama3.1-8b-instruct-2n8g-async-1off-single-controller-streaming2.yaml
- Async PPO: ppo-qwen2.5-1.5b-gsm8k-2n8g-megatron-valuetp2sp-dynbatch-noncolocated-async-single-controller.yaml
- R3 with MoE: grpo-qwen3-30ba3b-10n8g-megatron-cp2-r3-async-single-controller.yaml
- Token capture with Megatron Inference: grpo-nanov3-30BA3B-2n8g-megatron_generation-noncolocated-async-gym-single-controller-token_capture.yaml
See the Single Controller guide for the required settings, the samplers, and the full list of supported features.
TensorRT-LLM Rollout Backend
NeMo RL v0.8 adds TensorRT-LLM as a rollout engine (#2420, #3130, #3418, #3537). With TensorRT-LLM and Dynamo (also new in v0.8), NeMo RL now has five rollout engines: vLLM, SGLang, Megatron Inference, TensorRT-LLM, and Dynamo. Set policy.generation.backend: trtllm. It works with both Megatron and Automodel training, colocated or non-colocated, and supports in-flight weight updates. An OpenAI-compatible HTTP server lets it drive NeMo Gym agentic rollouts such as SWE.
policy:
generation:
backend: trtllm
trtllm_cfg:
tensor_parallel_size: 1
async_engine: true # required
gpu_memory_utilization: 0.6TensorRT-LLM runs in its own trtllm uv environment. It was validated by matching vLLM convergence on math and SWE agentic RL; throughput tuning comes in a later release. Example recipes:
- Math: grpo_math_1B_trtllm.yaml
- Nemotron 3 Nano DAPO: grpo-dapomath17k-nanov3-30BA3B-8n4g-megatron-trtllm.yaml
- Async SWE agentic RL with Qwen3-30B-A3B-Thinking: grpo_qwen3_30b_async_swe_trtllm.yaml (see the SWE RL guide)
Faster Weight Refit: NCCL Reshard
Refit is the step that copies new weights from training to the rollout engine. NeMo RL v0.8 adds NCCL reshard refit (refit_transport: nccl_reshard) for non-colocated runs (#2971, #3477, #3739). Each training shard sends its large FFN and expert weights straight to the matching rollout shard, so no rank ever builds the full tensor. Small tensors still use the existing packed path. It works from Megatron to vLLM and from Megatron to Megatron Inference, including BF16 training with MXFP8 rollouts.
policy:
generation:
colocated:
enabled: false
refit_transport: nccl_reshardEach weight slice crosses the network once, and generation GPUs in the same NVLink domain share it over NVLink. Refit latency with matched configurations:
| Model | GPU | Broadcast (NCCL) | NCCL reshard |
|---|---|---|---|
| Qwen3-235B-A22B | H100 | 6.4 s | 1.9 s |
| DeepSeek-V3 671B | H100 | 14.9 s | 2.6 s |
| DeepSeek-V3 671B | GB200 | 6.1 s | 2.3 s |
In a full run of the DeepSeek-V3 async performance recipe on H100, refit time dropped from 15.3 s to 3.1 s and step time from 33.2 s to 21.0 s (#4870). Most async performance recipes now use it (#3865, #4869, #4870), for example grpo-deepseek-v3-64n8g-async-1off.yaml.
v0.8 also adds two more refit transports. Each transport is picked with the single policy.generation.refit_transport key, so only one can be active.
NIXL checkpoint-engine refit
NIXL refit sends full weights over a UCX/RDMA fabric (#2608). On DeepSeek-V3 it was 1.54Γ faster than NCCL refit (9.25 s vs 14.21 s). It needs vLLM generation and works with Automodel or Megatron training.
policy:
generation:
colocated:
enabled: false
refit_transport: nixl
refit_cfg:
nixl:
update_weights_bucket_memory_ratio: 0.05
device: cuda
backend_name: UCX
release_after_refit: false
shard_expert_weights: trueExample config: grpo_math_8B_megatron_nixl.yaml. See the checkpoint-engine refit guide for UCX settings, sharded experts, and FP8.
Sparse delta refit
Sparse delta refit sends only compressed weight deltas, for setups where the link between training and rollout is slow (#2444). vllm_zmq_sparse sends them through a ZeroMQ relay over TCP, and vllm_s3_sparse sends them through S3. It needs vLLM generation, Megatron training, and BF16/FP16 rollouts, and it works with GRPO only.
policy:
generation:
colocated:
enabled: false
refit_transport: vllm_zmq_sparse # or vllm_s3_sparse
refit_cfg:
sparse:
delta_compression:
encoding: xor
storage:
s3_bucket: null # required for vllm_s3_sparseExample recipe: grpo-qwen3-30ba3b-4n8g-megatron-zmq-deltaweight-noncolocated.yaml. See the sparse delta refit design doc.
The new refit guide explains how to pick a transport. See also the NCCL reshard design doc.
Megatron Inference Rollouts
Megatron Inference (policy.generation.backend: megatron) is in active development, and v0.8 adds many features to it.
Colocated Megatron training and inference. Training and rollouts can share the same GPUs. New in v0.8:
- Async GRPO with colocated Megatron Inference (#2884). Before, async GRPO needed non-colocated generation.
- Colocated reshard: rollouts can use a different parallel layout from training on the same GPUs, for example training with TP4/CP2 and generating with TP4/EP4 (#3490).
- Colocated Megatron Inference also works with the Single Controller (#3730) and NeMo Gym (#3406), and now builds CUDA graphs (#3718).
policy:
generation:
backend: megatron
colocated:
enabled: true
refit_transport: mcore
mcore_generation_config:
refit_backend: nccl
tensor_model_parallel_size: 4 # rollout layout, can differ from training
expert_model_parallel_size: 4Other additions:
- MXFP8 rollouts from a BF16 trainer (#3731).
- Multimodal generation for Nemotron Omni images and video, matching vLLM accuracy (#3920).
- HTTP frontends on every model-parallel coordinator with prefix-cache-aware routing, for NeMo Gym (#3912), and the async scheduler on by default (#3762).
- Logprobs after top-p/top-k processing, so top-p/top-k runs are correct (#3392).
- NCCL refit in place of the nvshmem copy service: ~16β19 s per step and flat on a 30B-A3B MoE, where nvshmem grew from ~95 s to over 135 s (#3166).
Example recipe: grpo-nanov3-30BA3B-2n8g-megatron_generation-colocated-reshard-async-gym.yaml. See generation design doc.
Low-Precision Rollouts: MXFP8 and NVFP4
MXFP8 rollouts
Training stays in BF16, and vLLM converts the weights to MXFP8 at every refit, then rolls out in MXFP8 (#1887, #3652, #3477, #3478, #3630). It works with NCCL reshard refit, and batching the MoE weight shuffle cut the transfer time on Qwen3-30B-A3B from 5.9 s to 0.89 s (#3478). The shipped recipes keep the LM head, attention, and the first and last few layers in BF16, and use importance-sampling correction.
policy:
generation:
vllm_cfg:
precision: "fp8"
is_mx: true
quantization_ignore_patterns:
- model.layers.*.self_attn.*
- model.layers.*.mlp.gate
num_first_layers_in_bf16: 3
num_last_layers_in_bf16: 18
vllm_kwargs:
moe_backend: flashinfer_trtllmThere are 10 MXFP8-rollout performance recipes for Qwen3-30B-A3B, Qwen3-32B, Qwen3-235B, DeepSeek-V3, and Nemotron 3 Super, sync and async, for example grpo-qwen3-235b-32n4g-async-1off-mxfp8-rollout.yaml. See the FP8 / MXFP8 guide.
End-to-end NVFP4 training with NVFP4 rollouts
On Blackwell, NeMo RL v0.8 can train routed-expert MLPs using NVFP4 (W4A4) forward computation with Transformer Engine and roll out in NVFP4 with matching per-token activation scaling (#3566, #3654). Persistent policy weights and refit payloads remain BF16, optimizer state remains FP32, and backward computation currently uses TEβs dequantized path. Attention, routers, shared experts, and selected boundary layers remain in BF16. On Qwen3-30B-A3B-Base over 900 steps with Router Replay, NVFP4 tracks BF16 on reward, validation accuracy, and response length, while:
- rollout throughput is 1.40Γ higher and step time is 14.2% lower
- end-to-end throughput is 1.15Γ higher
- rollout weights are 68% smaller, with 2.62Γ the KV-cache capacity
Training throughput is lower (0.84Γ), and refit takes longer.
uv run examples/run_grpo.py --config examples/configs/recipes/llm/grpo-qwen3-30ba3b-base-8n4g-megatron-te-nvfp4-pertoken.yamlSee the NVFP4 per-token rollout design doc.
Quantization-aware RL with real NVFP4 rollouts for MoE and Mamba
Quantization-aware RL (QARL) with ModelOpt now supports real NVFP4 rollouts (W4A16 and W4A4) for MoE and hybrid Mamba models, including Qwen3-30B-A3B, Nemotron 3 Nano, and Nemotron 3 Super (#2983, #3308). On Nemotron 3 Super over 300 steps, W4A16 matches BF16 reward (~0.65), and W4A4 reaches ~0.58 while generating about 2.4Γ faster than BF16. An opt-in GPU-side export cuts step time by ~22β25% (#3308). The Nemotron 3 Super real-quant recipes currently fail on this release; see Known Issues.
See the Quantization-Aware RL guide.
PPO: Non-Colocated, Async, and Critic Warm Start
PPO, added in v0.7, grows several new modes in v0.8:
- Non-colocated generation (#3262): vLLM runs on its own GPUs while the policy and critic share the training GPUs. Set
policy.generation.colocated.enabled: false. - Async PPO (#3410): generation runs all the time while the policy and critic train, with staleness bounded by
ppo.async_ppo.max_trajectory_age_steps. Sync and async PPO show no regression in reward, validation accuracy, or logprob error. - Critic warm start (#3821, #4213):
ppo.warm_start_value_checkpointstarts the critic from a separately pretrained value checkpoint, so you don't pay for critic warmup in every run. - Separate critic epochs (#3829):
ppo.critic_ppo_epochs. - Faster GAE (#4156): when
gae_gammaandgae_lambdaare both 1.0, GAE uses a vectorized path. On a 196K-token SWE PPO batch this saved about 20 s per step. - PPO on the Single Controller (#3773).
Sync (blue) vs async (yellow) Megatron PPO on Qwen2.5-1.5B GSM8K, from #3410:
Example recipes:
- Automodel: ppo-qwen2.5-1.5b-gsm8k-1n8g-automodel-noncolocated-async.yaml
- Megatron: ppo-qwen2.5-1.5b-gsm8k-2n8g-megatron-valuetp2sp-dynbatch-noncolocated-async.yaml
See the PPO guide.
Nemotron 3 Ultra Post-Training
In v0.7, the Nemotron 3 Ultra recipe lived on the separate ultra-v3 branch. NeMo RL v0.8 brings the Nemotron 3 Ultra (550B-A55B) post-training recipe to main (#3276, #3529, #3452). It includes seven stage configs (student RLVR 1 and 2, MOPD, and the reasoning, IFBench, RLHF, and SWE teachers) and a single launcher. With EXTERNAL_JUDGES=1, the GenRM and NL2Bash judges run as separate vLLM pools next to training instead of inside the training Ray cluster.
EXTERNAL_JUDGES=1 bash examples/nemo_gym/nemotron-3-ultra/ultra_launch.shThe training data blends are on Hugging Face at nvidia/Nemotron-RL-Ultra-Training-Blends. See the Nemotron 3 Ultra guide.
Nemotron Omni: Multimodal Agentic RL
NeMo RL v0.8 adds training for the Nemotron Omni models on the Megatron backend (Nemotron 3 Nano Omni GRPO on the Automodel backend shipped in v0.7; see the Automodel section of the Nano Omni guide):
- Nemotron Nano Omni image GRPO (#3290).
- Nemotron Super Omni GRPO with MTP (#3494): MTP training and MTP speculative decoding with context parallelism. Over 50 steps on 16 nodes, mean reward went from 0.45 to 0.53, with about 75% draft acceptance.
- Multi-turn, multi-image, tool-calling GRPO with NeMo Gym (#3414), sync and async.
- Video in NeMo Gym, sync and async (#3648).
- Super Omni image MOPD (#3430) and the MPO preference algorithm for Omni Nano and Super (#3345).
- Multimodal payload deduplication (#3527):
grpo.deduplicate_multimodal_data: truestores each image or video once instead of once per generation, which cut rollout-to-policy data by about 15Γ at 16 generations per prompt.
Multi-turn tool-calling GRPO on Nemotron Omni, from #3414:
Example recipes:
- Super Omni with MTP speculative decoding: vlm_grpo-nemotron-super-omni-120ba12b-16n8g-megatron-tp8ep16cp2-async-gym-mtp-specdec.v1.yaml
- Multi-turn tool calling: vlm_grpo-nemotron-omni-30ba3b-circle-click-2n8g-megatron-tp2ep8.v1.yaml
See the Nemotron 3 Nano Omni guide, the Super Omni MOPD guide, and the Omni MPO guide.
SFT v2 with Megatron-Energon
NeMo RL v0.8 adds SFT v2, a single-controller SFT loop with Megatron-Energon multimodal data loaders (#3917), plus Energon-side sequence packing (#4105). The existing SFT loop is unchanged (data.backend defaults to hf). SFT v2 currently supports the Megatron backend with data.backend: energon.
uv run --locked examples/run_sft_v2.py --config examples/configs/recipes/vlm/vlm_sft-qwen2.5-vl-3b-instruct-clevr-1n2g-megatrontp1-energon.v1.yamlSFT v1 (blue) vs SFT v2 (orange) loss on Qwen2.5-VL-3B CLEVR, from #3917:
See the SFT guide and its SFT v2 / Energon section.
Model Support
Nemotron
- Nemotron 3 Ultra full post-training recipe on
mainβ see the highlight above. - Nemotron Nano Omni and Super Omni β see the highlight above.
- Nemotron 3.5 Lightning (30B-A3B) DAPO on Automodel (#3383): dapo-nanov3.5-30BA3B-4n8g-automodel-ep8.yaml. See the Nemotron 3.5 Lightning guide.
- MTP speculative decoding for Nemotron 3 Super and Ultra, with the MTP drafter updated at every refit (#2999).
Additional Models
- DeepSeek V4 Flash GRPO on Automodel with FP8 vLLM rollouts (#3595): grpo-deepseek-v4-flash-0731-16n8g-automodel-cp8ep128.yaml. See the DeepSeek V4 Flash guide.
- GLM-5.2 GRPO on Megatron, up to 131K context (#3502, #4667): grpo-glm5.2-72n8g-megatron-noncolocated.yaml. See the GLM-5 guide.
- MiniMax-M3 text GRPO on Automodel (#4143): grpo-minimax-m3-32n8g-automodel-cp8ep128-noncolocated.yaml. See the MiniMax-M3 guide.
- Qwen3.8-27B GRPO on Megatron (#3678): grpo-qwen3.8-27b-2n8g-megatron-tp4pp2cp2.yaml.
- Gemma 4 12B, plus context-parallel recipes for Gemma 4 E2B, 26B-A4B, and 31B (#3911): dapo-gemma4-12b-it-2n8g-automodel.yaml. See the Gemma 4 guide.
- Qwen3.5 blockwise FP8 rollout and training (#2744).
- Qwen2.5-Omni-7B audio + video GRPO (#2823): Daily-Omni accuracy went from 0.498 to 0.590. See the audio-visual GRPO guide.
- Flow-GRPO for Qwen-Image (#3408), the first diffusion-model RL recipe, under
research/flow_grpo/. On an OCR reward, exact match went from 0.465 to 0.648. See its README.
| DeepSeek V4 Flash | GLM-5.2 | MiniMax-M3 |
|---|---|---|
![]() |
![]() |
![]() |
For the full list, see the model support page and the per-family model guides (#2900).
β‘ Performance Optimizations
- HybridEP for MoE on H100, B200, and GB200: MoE performance recipes now use HybridEP for expert-parallel communication, and the container builds it with multi-node support (#3436, #3438, #4118, #4037, #4038). On H100, the Nemotron 3 Super policy training step got 30% faster and the Qwen3-30B-A3B one 9% faster. On GB200, Qwen3-30B-A3B end-to-end steps got 11β13% faster. Automodel recipes use
backend.dispatcher: hybridep. - vLLM CUDA graphs in release and nightly recipes: 10 recipes that ran vLLM in eager mode now use CUDA graphs, making generation 48β85% faster (#4568, #4569).
- Single-forward sequence-logprob filtering:
loss_fn.seq_logprob_error_in_loss: trueapplies the sequence-logprob filter inside the training forward pass, removing a separate forward pass. This cut mean step time by 17.8% on Qwen2.5-Math-1.5B (#4171). - FlashInfer TRT-LLM MoE for BF16 on Blackwell: BF16 MoE performance recipes on GB200 use
moe_backend: flashinfer_trtllm, making Qwen3-235B steps 9β10% faster (#3461). H100 recipes stay on Triton (#4850). - Chunked linear fusion for GRPO: computes token logprobs from hidden states chunk by chunk, without building the full logits tensor, for GRPO and the other policy-gradient losses (#2833).
- Lower logprob memory: no full-vocab softmax on the inference-only path (#3484), selected-token logprobs computed directly (#3930, #3124), and an option to run packed microbatches largest first (
sequence_packing.microbatch_order: largest_first), which cut peak reserved memory from 158.5 GiB to 71.2 GiB on a Nemotron Nano run (#3476). - Megatron memory options: fine-grained activation offloading (#2279), offloading part of the optimizer state to CPU (#3628), and training CUDA graphs (#3483).
- Async checkpointing for Megatron: checkpoint writes run in the background (#2828). This is now on in the base Megatron configs.
- Faster startup and less per-step overhead at scale: Ray GCS tuning (#3089, #3158), batched worker port discovery (#2920), NeMo Gym startup that overlaps the generation model load (#3499, #3569), a GPU-free Ray head node option (
DEDICATED_RAY_HEAD=1) (#3388), and less NeMo Gym logging and payload overhead (#3106, #3292, #3390, #3918). - Cross-tokenizer distillation: lower memory and faster loss for top-k KD and x-token P-KL (#3314, #3564).
- Data plane: sync GRPO on the TransferQueue data plane with
mooncake_cpuwent from 21.5 s to 17.8 s per step, close to the 16.8 s without a data plane (#4580).
View the performance numbers from our published recipes in the performance summary.
π« Breaking Changes
DTensor v1 removed, and the DTensor backend is renamed to Automodel
In v0.4 we marked DTensorPolicy (v1) for deprecation. NeMo RL v0.8 removes it, and renames the remaining DTensor v2 backend to Automodel, after the NeMo Automodel library it is built on (#4198, #4270, #4273, #4276, #4282, #4283, #4277, #4701).
# v0.7 # v0.8
policy: policy:
dtensor_cfg: automodel_cfg:
_v2: true # delete enabled: true
enabled: true- Rename
dtensor_cfgtoautomodel_cfginpolicy,value,teacher,teachers[i], andenv.reward_model, and delete_v2. The contents are unchanged. Old configs fail at startup with a message that names the fix. - DPO and RM users: check your backend. In v0.7,
_v2defaulted tofalse, anddpo.yamlandrm.yamldid not set it, so DPO and RM runs used DTensor v1 by default. In v0.8 they run on Automodel, which can change memory use, speed, numerics, and the checkpoint layout. - DTensor v1 checkpoints cannot be resumed in v0.8. Convert them to Hugging Face format with
examples/converters/convert_dcp_to_hf.pyfrom NeMo RL v0.7.x, then start from the HF weights. - Worker classes and modules are renamed (for example
DTensorPolicyWorkerV2βAutomodelPolicyWorker), thefsdpuv extra is removed, and recipe files withfsdp2ordtensorin their names now useautomodel(78 recipes; W&B run names change with them).
Other changes that need action
- Automodel checkpoint keys moved (#3935):
checkpointing.model_save_formatandcheckpointing.save_consolidatednow live underpolicy.automodel_cfg.checkpoint.save_consolidatedis now a string:"false","final", or"every"(oldtrueβ"every"). Old keys raise an error at setup. - Fused-logprob keys renamed (#2833):
policy.megatron_cfg.use_linear_ce_fusion_lossβuse_fused_linear_logprobs, andlinear_ce_fusion_chunk_sizeβfused_linear_logprobs_chunk_size. There is no startup check for the old names: a config that inheritssft.yamlordpo.yamlsilently runs with fusion off. - Megatron Inference (#3611, #3739, #3609):
mcore_generation_config.async_engineis removed; Megatron Inference always uses the async engine, and setup fails if the key is set. Non-colocated Megatron Inference now refits through NeMo RL's packed collective by default. To use Megatron-Core's own refit, setrefit_transport: mcore; thenvshmemrefit backend is broken and warns. - AIME eval dataset names (#2928):
aime2024,aime2025,aime2026are nowAIME2024,AIME2025,AIME2026. The old names fail with an unrelated file error. - Custom multi-reward environments (#2597) must return a dict of named rewards (
{"reward/<name>": Tensor}) instead of a[B, K]tensor. - Multimodal prompt fields (#3803):
vllm_images,vllm_audios, andvllm_videosare replaced by onevllm_multi_modal_datadict. This affects custom data processors and environments. - Data plane config (#2935):
data_plane.storage_capacityandnum_storage_unitsmoved underdata_plane.simple, andglobal_segment_sizeandlocal_buffer_sizemoved underdata_plane.mooncake_cpu. Old flat keys are silently ignored.mooncake_cpuis now RDMA-only (no TCP mode), and its default memory sizes are smaller. - SGLang (#3612): the HTTP weight-transfer path is removed, and non-colocated Automodel + SGLang is rejected at setup.
disable_outlines_disk_cachenow defaults totruebecause of a CVE (#4797). - Python config objects (#2518, #2526, #2527): inner algorithm configs are now pydantic models. Custom code that reads
master_config.grpo["key"]must use attribute access (master_config.grpo.key). YAML configs are unaffected. - Container: PyAV is no longer in the shipped image (#4184), joining
opencv-python-headless, which was removed in v0.7. Runbash tools/install_audio_deps.shif you need them.
Default changes
- Megatron async checkpointing (
megatron_cfg.checkpoint.async_save: true) anduse_gloo_process_groups: falseare now set in the base Megatron configs (#2828, #2746). policy.offload_policy_before_refitdefaults tofalse(#3300). Set it totrueif you run out of memory at refit.- Async GRPO fails on the first generation-worker error (
grpo.async_grpo.max_generation_failures: 0) instead of hanging (#2368). logger.wandb.log_nemo_gym_full_result_tablesdefaults tofalse; v0.7 logged these tables by default (#3000).- Router Replay now skips MTP-layer routers; set
NRL_ROUTER_REPLAY_EXCLUDE_MTP=0for the old behavior (#3903). - PPO advantages now leave out overlong-filtered samples from GAE, matching GRPO (#3262).
- Service ports moved below 9000, out of the kernel's ephemeral port range (#3103). Check firewall rules if your cluster restricts ports.
Notable Additions
- Full-vocabulary on-policy distillation:
on_policy_distillation.fulluses the exact full-vocabulary reverse KL instead of the sampled-token gap, with multiple teachers, on the Single Controller (#3978, #4045). See the MOPD algorithm page. - Managed Dynamo generation backend (
backend: dynamo) on Slurm (#3391). See the Dynamo guide. - SGLang: Megatron refit over NCCL for non-colocated SGLang rollouts, and opt-in engine fault tolerance (#3612, #3613).
- External vLLM service pools in the same Slurm allocation, for NeMo Gym judges (#3386, #3587).
- GDPO: per-reward weights (
grpo.adv_estimator.reward_weights) and multi-reward NeMo Gym environments (#2680, #2597). - Validation controls for GRPO:
grpo.val_start_at, validation-only sampling settings, grouped pass@k (grpo.val_num_generations_per_prompt), and early stop at a validation threshold (grpo.stop_at_validation_metric) (#3400, #3401, #3404). - Reward and advantage penalties for malformed NeMo Gym outputs (
reward_penalties.*), and an option to stop masking environment-flagged samples (env.should_mask_flagged_samples) (#2885, #3734, #3402). - EAGLE-3 draft training: sequence packing (about 2Γ policy training throughput on Qwen3-30B-A3B), a separate draft optimizer and grad clipping, and a streaming soft-CE loss (#3463, #3323, #3701, #3703, #3707). See the EAGLE-3 guide.
- LoRA: warm-start from a LoRA checkpoint (
lora_cfg.restore_from,peft.restore_from) and per-expert adapters (peft.share_expert_adapters) (#3874, #4234). See the LoRA guide. - More low-precision options: simulated KV-cache quantization in QARL (#3012), a TE precision config file for per-module quant recipes (#3654), custom FP8 quantizer factories (#3998), and an FP32 LM head (
fp32_lm_head) (#4096). - OpenTelemetry tracing through nemo-lens, off by default (#3655, #4052). See the observability docs.
- Mooncake on the data plane: RDMA backend, GPUDirect RDMA (
data_plane.mooncake_cpu.use_gdr), and data-plane checkpoints (#2935, #3501, #3898). VLM GRPO can also use the data plane (#2957). - vLLM refit options: refit through vLLM's
reload_weightsAPI (#3651, #4063), pausing generation during in-flight refit (#3839), and dropping colocated weights while asleep (discard_weights_on_sleep) to avoid host OOM (#4433). - Megatron config hooks:
megatron_cfg.model_overrides(#3535), custom worker extensions (worker_extension_cls_fqn) (#3809), andtokenizer_kwargs(#3798). - Container can run as a non-root user:
nemo-runtime(UID/GID 65532), with uv and its Python moved out of/root. The image still runs as root by default (#4260). - Fault-tolerance checkpoint retention:
ft_save_period/ft_keep_latest_k(#3157). - New datasets: NuminaMath-1.5 (#3417) and OpenR1-Math-220k (#3131).
- NeMo Gym is now the main evaluation path (#4687). See evaluation.
examples/run_eval.pystill works for quick checks. - Automodel context parallelism: refactored to use model-specific sequence sharding, with aligned loss inputs, automatic padding, and corrected gradient scaling (#3498). See the CP integration guide.
- First shipped in v0.8: the v0.7.0 release notes listed these PRs, but they merged after the v0.7 branch was cut, so v0.8.0 is the first release that contains them: MXFP8 rollouts (#1887), the Qwen2.5-Omni audio + video recipe (#2823), Megatron async checkpointing (#2828), chunked linear fusion for GRPO (#2833), behavior penalties (#2885), batched port discovery (#2920), Ray GCS tuning (#3089, #3158), port-range fixes (#3103), lower Automodel logprob memory (#3124), the OpenR1-Math-220k dataset (#3131), and fault-tolerance checkpoint retention (#3157).
- Major dependency upgrades: vLLM 0.20.0 β 0.29.0, PyTorch 2.13.0, Transformers 5.12.1, Ray 2.58.0, NeMo-Gym 0.4 β 0.7, NeMo-Automodel 0.6.1, Megatron-Bridge 0.7.0, NCCL 2.30.7, and Python 3.13.14 (#3280, #4080, #4415, #4828, #3498, #4852, #3453, #3183).
Notable Fixes
- Fixed GRPO advantage spikes (near β2075) when
use_leave_one_out_baselineandnormalize_rewardsare both on, which is the default ingrpo_math_1B.yaml. This mostly showed up on easy data where all but one sample in a group were correct (#4158). - Fixed token positions filtered out by top-k/top-p still counting in the loss and KL (#4154).
- Fixed refit sending stale weights: for Automodel non-colocated refit with large MoE experts (reward 0.1β0.2 before, 0.81 after on Nemotron 3 Nano Omni) (#4720), for Megatron with
overlap_param_gather(#4086), and for vLLM'sflashinfer_trtllmBF16 MoE backend (#3545, #3659). - Fixed the Automodel KL reference model moving to the resumed weights on every resume, instead of staying at the base weights (#3722).
- Fixed the Automodel MoE router correction bias being cast to BF16 during refit, which could change expert routing in vLLM (#3540).
- Fixed calibrated FP8 KV-cache scales being dropped on colocated refit (#3226), and GLM-5.2 FP8 sparse-attention scoring that made training and generation disagree (#4667).
- Fixed async GRPO skipping about 30% of prompts across checkpoint save and restore (#3599), ignoring
max_num_epochs(#3248), ignoringrecompute_kv_cache_after_weight_updateswithout in-flight updates (#3152), and deadlocking on resume (#3066). - Fixed
run_vlm_grpo.pyalways running sync GRPO even with async enabled (#3740). - Fixed EAGLE-3 draft gradients shrinking the policy update;
train/grad_normis now policy-only (#3323). - Fixed the Megatron optimizer updating random weights with CPU offload and the distributed optimizer (#2372), and gradient finalize being skipped for Nemotron Omni (#3789).
- Fixed wrong eval pass@k when an answer could not be parsed (#3635).
- Fixed a pipeline-parallel hang in MoE aux-loss metrics (#3419), a GPU memory leak after async checkpointing with colocated generation (#3322), and Mooncake port collisions with the kernel's ephemeral range (#4103).
- Fixed DeepSeek-V3 with Transformers 5 (#4408).
- Addressed security vulnerabilities and CVEs (#4343, #4415, #4736, #4766, #4885, #4924, #4970, #4988).
π οΈ Known Issues
- LoRA with activation checkpointing on Automodel: with
activation_checkpointing: true, the LoRA weights never reach vLLM, so rollouts come from the base model (#4470). Turn off activation checkpointing when using LoRA on Automodel. - vLLM async scheduling can hang large MoE runs with data parallelism (vllm-project/vllm#43547). The GLM-5.1 and Qwen3.5-397B recipes set
policy.generation.vllm_kwargs.async_scheduling: falseto avoid it (#4354, #4794). Use the same setting if a large MoE run with vLLM DP > 1 hangs in generation. - Qwen3.5 MoE with the Megatron backend and expert parallelism can still hang in vLLM's
sample_tokens(vllm-project/vllm#36237). The Automodel path no longer hangs after the vLLM upgrade. - Quantized Nemotron 3 Super NVFP4 (W4A16/W4A4) recipes currently fail (#4585).
- Automodel cannot load Nemotron-H checkpoints because of an embedding key name mismatch (#4211). This waits on an Automodel update.








