Nemotron 3.5 Super VL#
This page collects NeMo RL guidance for text and image post-training of
Nemotron 3.5 Super VL (NemotronH_Omni_Reasoning_V3), a hybrid Mamba +
Attention MoE model with 512 routed experts (22 active) and a RADIO vision
tower, on the Automodel backend. Use it to launch the text DAPO, image GRPO and
NeMo Gym agentic (tool-use) recipes and understand the settings that are
specific to this model.
What’s Supported#
Model |
Modality |
Training backend |
Parallelism |
Inference |
Precision |
|---|---|---|---|---|---|
Nemotron 3.5 Super VL (120B-A12B) |
LLM (text) |
Automodel |
FSDP2 + EP |
vLLM |
BF16 compute, FP32 master |
Nemotron 3.5 Super VL (120B-A12B) |
VLM (image) |
Automodel |
FSDP2 + EP |
vLLM |
BF16 compute, FP32 master |
Nemotron 3.5 Super VL (120B-A12B) |
Agentic tool use (NeMo Gym, text) |
Automodel |
FSDP2 + EP + CP |
vLLM (async, non-colocated) |
BF16 compute, FP32 master |
Notes:
Training runs on the Automodel backend with FSDP2 over all parameters and expert parallelism (HybridEP dispatcher) for the routed experts.
Generation uses the pinned stock vLLM, which registers
NemotronH_Omni_Reasoning_V3and loads the checkpoint’s RADIO weights from disk (load_format=auto). The policy is refit from the trainer every step.The DAPO recipe drives the model text-only: the tokenizer path (no processor) is used, so the Automodel worker runs with
is_vlm=falseand vLLM never receives images. The image GRPO recipe uses the checkpoint’s processor and sends CLEVR images through vLLM; which towers train is controlled byautomodel_kwargs.freeze_config.
Environment#
Use the standard NeMo RL environment described in the
installation guide. The Automodel submodule
pinned on main (r0.6.0 at b916107a5 or later) registers
NemotronH_Omni_Reasoning_V3 and includes the fixes these recipes depend on
(Automodel #3874 and
#4211); the stock vLLM
pin registers the same architecture for generation. No custom source checkouts
or manual builds are needed. For container and worker-venv details, see
Dependency Management.
All recipes train
nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16:
the text recipe on the DAPO-Math-17K training set with AIME-2024 validation,
the image recipe on CLEVR-CoGenT (trainA / valA), and the agentic recipe on the
NeMo Gym workplace_assistant tasks, all from Hugging Face. Set HF_HOME to a
cache visible from every node:
export HF_HOME=<path-to-shared-huggingface-cache>
export WANDB_API_KEY=<your-wandb-api-key>
The recipes enable W&B logging; pass logger.wandb_enabled=false if W&B is not
configured.
Example Recipes#
Automodel training with vLLM generation. The text and image recipes colocate generation with training; the agentic recipe runs async GRPO with generation on its own node pool. The recipe YAMLs are the source of truth.
Algo |
Data |
Seq |
Train EP / CP |
vLLM TP/EP |
|
Nodes |
Recipe |
|---|---|---|---|---|---|---|---|
DAPO (text) |
DAPO-Math-17K / AIME-2024 |
9216 |
4 / 1 |
4 / 4 |
8192 |
16 x 4 GPUs (colocated) |
|
GRPO (image) |
CLEVR-CoGenT |
8192 |
4 / 1 |
4 / 4 |
4096 |
16 x 4 GPUs (colocated) |
|
Async GRPO (agentic, NeMo Gym) |
|
16384 |
4 / 2 |
4 / 4 |
8192 |
8 train + 8 gen x 4 GPUs |
All three recipes use 16 x 4-GPU GB200 nodes: train expert_parallel_size: 4
and vLLM tensor_parallel_size: 4 / expert_parallel_size: 4 (one vLLM engine
per node). See Parallelism for why EP must stay within a node.
The image recipe mirrors the Nano Omni CLEVR recipe
(vlm_grpo-nemotron-omni-30ba3b-clevr-1n8g-automodel-ep8.v2.yaml): image
placeholder tokens are bad_words, limit_mm_per_prompt.image: 2,
mm_processor_cache_gb: 0, the Nemotron Omni CLEVR prompt, and
train_global_batch_size: 64 (a multiple of the 64-way data parallelism).
The text recipe mirrors the Nemotron 3.5 Lightning DAPO recipe: dynamic sampling
(batch_multiplier: 3), Clip-Higher (ratio_clip_max: 0.28), overlong
filtering and soft overlong reward shaping, reference_policy_kl_penalty: 0,
FusedAdam with FP32 master weights, activation checkpointing, and
moe_parallelizer.ignore_router_for_ac: true (required with activation
checkpointing on this MoE: the BF16 router top-k is nondeterministic on
recompute).
The agentic recipe is described in NeMo Gym agentic recipe below.
Model-specific settings#
These are set in the recipes and are required for this model:
Setting |
Value |
Why |
|---|---|---|
|
|
The checkpoint ships one MTP layer ( |
|
|
Skip vLLM’s multimodal profiling pass and its encoder-cache reservation. The text recipe never sends images; the image recipe’s CLEVR inputs (at most two small images per prompt) run without the profiling-based reservation. |
|
|
Drop vLLM’s default 4 GiB host-side multimodal processor cache; host memory is the tight resource for these recipes. |
|
|
vLLM sizes the encoder budget from this limit, and an unset modality defaults to 999 images per prompt. |
|
|
Keep the policy from emitting image placeholder tokens in its responses. |
|
|
Matches the checkpoint’s |
|
(automatic) / |
vLLM’s multimodal encoder budget calls the tokenizer during engine init for this architecture. |
|
unset |
The custom AutoModel implementation and its state-dict adapter are required for EP and per-tensor refit. |
|
unset |
With |
Parallelism#
Training EP stays within a node. All three recipes use
expert_parallel_size: 4on 4-GPU GB200 nodes with the HybridEP dispatcher (policy.automodel_cfg.automodel_kwargs.backend.dispatcher: hybridep), whose kernels require the per-rank token count to be a multiple of 64 (make_sequence_length_divisible_by: 64in the colocated recipes,256with CP2 in the agentic recipe). The DeepEP dispatcher also works at EP=4 but its V1BufferAPI assumes an expert-parallel group of up to 8 ranks is intranode; EP=8 on 4-GPU nodes fails withCUDA error ... deep_ep.cpp 'invalid resource handle'.vLLM TP and EP live on the same GPUs.
expert_parallel_size == tensor_parallel_sizeruns one engine per node with dense layers TP-sharded and experts EP-sharded (enable_expert_parallel). Set both to the GPUs per node.FSDP2 shards all parameters (including experts) over the full world, so persistent memory per GPU does not depend on EP; EP only changes the transient unsharded expert weights and all-to-all traffic.
NeMo Gym agentic recipe#
examples/nemo_gym/nemotron-3.5-super-vl/workplace_assistant_automodel.yaml
trains the model on the NeMo Gym workplace_assistant environment: multi-step
tool use (up to six tool calls and one final answer per task) against simulated
calendar, e-mail, document and project databases, with no code sandbox. It is
text-only and runs async GRPO with non-colocated generation: training and
vLLM live on separate node pools and weights are refit through an NCCL
collective every step.
Setting |
Value |
|---|---|
Base recipe |
|
Rollouts per step |
64 prompts x 16 generations (global batch size 1,024) |
Maximum sequence length |
16,384 tokens (8,192 generated) |
Training |
Automodel FSDP2, EP=4, CP=2, |
Generation |
vLLM TP=4 / EP=4, one engine per node, 8 nodes; |
Async GRPO |
|
Optimizer |
TransformerEngine |
Validation |
full validation set (545 tasks) at start and every 10 steps |
Settings specific to this recipe, on top of the model-specific settings above:
Setting |
Value |
Why |
|---|---|---|
|
|
At 16K context the 120B trainer on 32 GPUs is memory-bound; CP2 gives the headroom the backward needs. |
|
|
Automodel keeps every block’s gathered weights resident through the backward by default; re-sharding after each forward is what fits the optimizer states on 184 GB GPUs (same as the Nemotron 3 Super 120B automodel recipe). |
|
|
HybridEP’s kernels are specialised on the per-rank token count and require it to be a multiple of their 64-token chunk; with CP2 each rank sees half the padded sequence, so the padding multiple must be a multiple of 64 x CP = 128 (256 is used). |
|
|
Multi-step tool-use trajectories re-prefill the growing conversation every agent step; with prefix caching on, the cached Mamba state of the earlier steps made |
|
|
vLLM’s default 2,048-token chunked-prefill budget throttles the repeated 4-20K-token prefills of the agent loop. |
|
|
The checkpoint thinks before every tool call; Gym needs the reasoning parser on to strip |
Data#
The environment’s tasks are published as
nvidia/Nemotron-RL-agent-workplace_assistant
(train.jsonl, 1,255 tasks; validation.jsonl, 545 tasks):
uvx --from huggingface-hub hf download nvidia/Nemotron-RL-agent-workplace_assistant \
--repo-type dataset --local-dir $DATA_DIR/workplace_assistant
Launch#
The text and image recipes default to 16 nodes x 4 GPUs; the agentic recipe to
8 training + 8 generation nodes (cluster.num_nodes is the sum,
policy.generation.colocated.resources.num_nodes the generation share). The NeMo
Gym venvs for the workplace_assistant resource server are built on first launch,
or prebaked into the container as in the
Nemotron 3.5 Lightning guide with
--build-arg NEMO_GYM_PREFETCH_CONFIGS="examples/nemo_gym/nemotron-3.5-super-vl/workplace_assistant_automodel.yaml".
# Text DAPO (DAPO-Math-17K / AIME-2024)
uv run examples/run_grpo.py \
--config examples/configs/recipes/llm/dapo-nemotron3.5-super-vl-120BA12B-16n4g-automodel.yaml
# Image GRPO (CLEVR-CoGenT)
uv run examples/run_vlm_grpo.py \
--config examples/configs/recipes/vlm/vlm_grpo-nemotron3.5-super-vl-120BA12B-clevr-16n4g-automodel.yaml
# Agentic GRPO (NeMo Gym workplace_assistant)
uv run examples/nemo_gym/run_grpo_nemo_gym.py \
--config examples/nemo_gym/nemotron-3.5-super-vl/workplace_assistant_automodel.yaml \
data.train.data_path=$DATA_DIR/workplace_assistant/train.jsonl \
data.validation.data_path=$DATA_DIR/workplace_assistant/validation.jsonl
For launching on a multi-node Slurm or Kubernetes cluster, see the
cluster guide; keep cluster.num_nodes and
cluster.gpus_per_node in step with the allocation. Interrupted runs resume
automatically from the latest checkpoint in checkpointing.checkpoint_dir.
See the GRPO guide for the algorithm and common configuration
details.
Reference Results#
Training curves#
The runs use the recipe defaults (16 x 4-GPU GB200 nodes, train EP4, vLLM TP4/EP4) with the Automodel backend: colocated vLLM generation for the text and image recipes, async non-colocated generation for the agentic recipe. All were chained as 4-hour Slurm jobs that resume from the latest checkpoint. Curves are wandb exports; the x axis is the training step.
Text DAPO, DAPO-Math-17K / AIME-2024 — 43 steps, max_new_tokens: 8192,
starting from nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16.

AIME-2024 validation accuracy climbs from 0.41 at step 0 to 0.76 at step 40
(0.45 at step 10, 0.48 at step 20, 0.59 at step 30) while the mean validation
response length falls from ~6,450 to ~4,600 tokens and truncation_rate drops
from ~0.40 to ~0.15: the policy gets both more accurate and more concise.
Training reward rises from a noisy -0.6 to -0.1 band to 0.2-0.6 after step 20.
gen_kl_error drifts slowly from ~0.003 to ~0.0045 as the policy sharpens, the
same order as the drift documented for other models; the isolated
token_mult_prob_error spikes (steps 20, 32, 38) are single-step outliers and
token_mult_prob_error returns to ~1.03 on the next step. The chain ran as five
4-hour Slurm jobs that resumed from the latest checkpoint.
Image GRPO, CLEVR-CoGenT — 63 steps, max_new_tokens: 4096, starting from
nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16.

CLEVR-CoGenT (valA, 256 samples) accuracy rises from 0.78 at step 0 to 0.90
at step 50 (0.82 at step 10, 0.88 at step 20, 0.90 at steps 30 and 40, 0.90
at step 60) while the mean validation response length falls from ~1,120 to a
minimum of ~770 tokens at step 30 and settles around 800-840 afterwards.
Training reward moves from a 0.71-0.87 band in the first ten
steps to 0.86-0.95 after step 30. gen_kl_error stays flat at 0.0024-0.0031,
token_mult_prob_error at 1.02-1.04 and truncation_rate below 0.09 and
mostly under 0.03 after step 20: trainer and vLLM stay in agreement across
every refit. Steps take ~8 minutes (16 to 20 minutes when the batch retries
generation); the chain ran as three 4-hour Slurm jobs that resumed from the
latest checkpoint (steps 21 and 43).
Agentic GRPO, NeMo Gym workplace_assistant — 40 steps, async non-colocated
generation on 8 training + 8 generation nodes, starting from
nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-BF16.

Validation accuracy on the 545 held-out tasks rises from 0.80 at step 0 to
0.92 at step 40 (0.86 at step 10, 0.89 at steps 20 and 30) while the mean
validation response length falls from ~910 to ~860 generated tokens. Training
reward moves from a 0.76-0.92 band in the first ten steps to 0.82-0.97 after
step 20. The number of agent turns per trajectory (tool calls plus the final
answer) stays at 4.0 on both train and validation: the policy learns to call
the right tools with the right arguments rather than to call more or fewer of
them. gen_kl_error stays flat at 0.0022-0.0024 and token_mult_prob_error at
1.02 across every refit. Steps take ~5.5 minutes (rollout and training
overlap); the run was two 4-hour Slurm jobs that resumed from the latest
checkpoint (step 32).