Model techniques map
ModelsNVIDIA-Nemotron-3.5-Lightning-30B-A3B

NVIDIA · released 2026-08-11

NVIDIA-Nemotron-3.5-Lightning-30B-A3B

What NVIDIA-Nemotron-3.5-Lightning-30B-A3B’s own documents say it is built from — every method with the sentence that describes it.

Curator’s note30B total / 3B active hybrid: interleaved Mamba-2 and MoE layers with select attention layers (architecture id nemotron_h), >20T pre-training tokens, up to 1M context, OpenMDW-1.1 (weights + data + recipes). Multi-Token Prediction is trained in during pre-training, and the release ships DSpark and DFlash draft models plus an NVFP4 checkpoint alongside BF16. The curated URL is the BF16 reference release — the customization starting point. No Nemotron 3.5 report yet; arXiv 2512.20856 is the Nemotron 3 family report.

Against the consensus recipe

Its documents state 6 of the 15 methods the field agrees on.

The recipe from the overview: the methods the most labs adopt, per stage. A missing one is something the documents do not say, not something the model lacks.

  1. Data curation

  2. Training objective

  3. Model architecture

  4. Optimization

  5. Post-training

  6. Inference & serving

Checked in its code

Its code shows 7 of the 19 architecture features checked — 4 of them are not stated in its documents.

Documents say what a lab chose to describe; the modeling code says what the checkpoint runs. Each feature below was put to a code verifier, and only the config values and source lines it cited that were found in the files are shown, linked to the line.

Read from Hugging Face Transformers (modeling_nemotron_h.py, configuration_nemotron_h.py) and config.json at revision a9904d24bc, by anthropic/claude-sonnet-5 on 2026-09-25.

FeatureCodeIts documentsEvidence
Grouped-query attention code only in its codenot stated

Full-attention layers project 32 query heads down to 2 KV heads which are repeated via repeat_kv before the dot product.

num_attention_heads = 32num_key_value_heads = 2
self.num_key_value_groups = config.num_attention_heads // config.num_key_value_heads
modeling_nemotron_h.py · L847
self.k_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=False)
        self.v_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=False)
modeling_nemotron_h.py · L852–853
Multi-head latent attention not in its codenot stated

The attention module uses standard per-head q/k/v projections with no low-rank KV latent or decoupled RoPE key mechanism.

self.q_proj = nn.Linear(config.hidden_size, config.num_attention_heads * self.head_dim, bias=False)
        self.k_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=False)
        self.v_proj = nn.Linear(config.hidden_size, config.num_key_value_heads * self.head_dim, bias=False)
modeling_nemotron_h.py · L851–853
Sliding-window attention not in its codenot stated

sliding_window is null in this config and no windowed mask is constructed for full_attention layers.

sliding_window = null
Interleaved sliding-window and global attention not in its codenot stated

layers_block_type interleaves mamba, moe, and full_attention layers, but none are sliding-window since sliding_window is null.

sliding_window = nulllayers_block_type = ["mamba", "moe", "mamba", "moe", "mamba", "attention", "moe", "mamba", "moe",…
Indexer-selected sparse attention (DeepSeek Sparse Attention) not in its codenot stated

No indexer-based top-k token selection mechanism appears anywhere in the code or config keys.

Linear-attention or state-space layers alongside full attention code only in its codenot stated

layers_block_type mixes NemotronHMamba2Mixer linear-attention layers with NemotronHAttention full_attention layers and moe/mlp layers, dispatched through MIXER_TYPES.

layers_block_type = ["mamba", "moe", "mamba", "moe", "mamba", "attention", "moe", "mamba", "moe",…
MIXER_TYPES = {
    "linear_attention": NemotronHMamba2Mixer,
    "full_attention": NemotronHAttention,
    "moe": NemotronHMoE,
    "mlp": NemotronHMLP,
}
modeling_nemotron_h.py · L893–898
Gated DeltaNet layers not in its codenot stated

The linear-attention layers implement Mamba-2 style SSM scan (segment sum, chunked SSD), not a gated delta rule / Kimi Delta Attention recurrence.

Mamba-2 layers in its code core

NemotronHMamba2Mixer implements the Mamba-2 chunked SSD scan with per-head scalar decay (A_log/D), used for layer type 'mamba' (linear_attention) per layers_block_type.

mamba_num_heads = 64ssm_state_size = 128
class NemotronHMamba2Mixer(nn.Module):
modeling_nemotron_h.py · L366
self.A_log = nn.Parameter(torch.empty(self.num_heads))
modeling_nemotron_h.py · L417
Learnable attention sink not in its codenot stated

No per-head learned sink logit is added to the attention softmax denominator anywhere in the attention implementation.

Gated attention output not in its codenot stated

NemotronHAttention's output goes straight from attn_output to o_proj with no sigmoid gate multiplication; gating only appears in the Mamba mixer's RMSNormGated, which is not attention output gating.

attn_output = attn_output.reshape(*input_shape, -1).contiguous()
        attn_output = self.o_proj(attn_output)
        return attn_output, attn_weights
modeling_nemotron_h.py · L888–890
QK normalization not in its codenot stated

NemotronHAttention computes q/k/v projections and applies attention directly with no RMSNorm/LayerNorm applied to queries or keys.

query_states = self.q_proj(hidden_states).view(hidden_shape).transpose(1, 2)
        key_states = self.k_proj(hidden_states).view(hidden_shape).transpose(1, 2)
        value_states = self.v_proj(hidden_states).view(hidden_shape).transpose(1, 2)
modeling_nemotron_h.py · L866–868
Partial RoPE not in its codenot stated

partial_rotary_factor is 1.0, and no rotary embedding application is even visible in NemotronHAttention.forward (no cos/sin/apply_rotary_pos_emb call), so full or no RoPE is applied uniformly with no partial split.

partial_rotary_factor = 1.0
YaRN RoPE scaling code unclearnot stated

The config has no rope_scaling key at all, and the attention forward pass shown does not call apply_rotary_pos_emb or reference rope_scaling, so YaRN cannot be confirmed or ruled out from these files.

Layers without positional encoding (NoPE) code unclearnot stated

No rotary embedding application (cos/sin) is visible inside NemotronHAttention.forward in this file, so it's unclear whether full_attention layers receive positional encoding uniformly or whether some lack it; the rotary embedding module itself is not included here.

Mixture of experts in its code core

NemotronHTopkRouter routes each token to num_experts_per_tok=6 of n_routed_experts=128 expert MLPs via sigmoid scores and top-k selection.

n_routed_experts = 128num_experts_per_tok = 6
topk_indices = torch.topk(scores_for_choice, k=self.top_k, dim=-1, sorted=False)[1]
        topk_weights = scores.gather(1, topk_indices)
modeling_nemotron_h.py · L759–760
Shared expert code only in its codenot stated

NemotronHMoE adds a shared_experts NemotronHMLP with moe_shared_expert_intermediate_size=3712 whose output is added to every token unconditionally, and n_shared_experts=1.

n_shared_experts = 1moe_shared_expert_intermediate_size = 3712
self.shared_experts = NemotronHMLP(config=config, intermediate_size=config.moe_shared_expert_intermediate_size)
modeling_nemotron_h.py · L701
hidden_states = hidden_states + self.shared_experts(residuals)
modeling_nemotron_h.py · L723
Auxiliary-loss-free load balancing (selection bias) code only in its codenot stated

The router adds e_score_correction_bias to sigmoid scores only for selecting top-k experts, while output weighting uses the unbiased scores.

scores = router_logits.sigmoid()
        scores_for_choice = scores + self.e_score_correction_bias
modeling_nemotron_h.py · L743–744
topk_indices = torch.topk(scores_for_choice, k=self.top_k, dim=-1, sorted=False)[1]
        topk_weights = scores.gather(1, topk_indices)
modeling_nemotron_h.py · L759–760
Multi-token prediction layers in its code core

config declares num_nextn_predict_layers=1 and mtp_layers_block_type ['attention','moe'], enabling multi-token prediction module construction.

num_nextn_predict_layers = 1mtp_layers_block_type = ["attention", "moe"]
SwiGLU feed-forward not in its codenot stated

Both the dense NemotronHMLP and the MoE experts use a single up_proj followed by a relu2 activation and down_proj with no gating multiplication, i.e. not SwiGLU.

mlp_hidden_act = "relu2"
self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=config.mlp_bias)
        self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=config.mlp_bias)
        self.act_fn = ACT2FN[config.mlp_hidden_act]
modeling_nemotron_h.py · L613–615

model architecture 10

token mixer 3

linear attention & state space 1

Mamba 1

Mamba-2 core

channel mixer 5

mixture of experts 5

expert routing 1

latent mixture of experts 2

positional encoding 1

prediction head 1

training objective 3

multi-token prediction objective 3

optimization 9

training precision 6

quantization-aware training 3

data curation 12

data sourcing 1

data filtering 6

deduplication 1

synthetic data 4

post-training 11

supervised fine-tuning 4

reinforcement learning algorithm 2

reward modelling 1

rollout & RL infrastructure 1

agentic post-training 2

mid-training & continual pretraining 1

inference & serving 11

decoding strategy 6

reasoning control 1

inference quantization 2

agentic scaffolding 2

software implementation 5

filed at the root 2

inference engine 1

infrastructure service 2

evaluation 4

filed at the root 1

benchmark 2

evaluation harness 1

unfiled 8

Further reading

Picked by hand, not extracted: where to read more, not evidence for anything on this page.

Sources

The curated document list for this model. "not fetched" means the URL is recorded but its text was not read in the current run.