nemo_automodel.components.models.gemma4_moe.state_dict_adapter
nemo_automodel.components.models.gemma4_moe.state_dict_adapter
State-dict adapter for Gemma4 MoE.
HF Gemma4 MoE (eevee-4 26B-A4B) stores expert weights as 3-D tensors:
layers.{L}.moe.gate_up_proj # [n_experts, 2*expert_inter_size, hidden_size] layers.{L}.moe.down_proj # [n_experts, hidden_size, expert_inter_size] layers.{L}.moe.per_expert_scale # [n_experts]
NeMo uses transposed layout with concatenated gate+up:
layers.{L}.moe.experts.gate_and_up_projs # [n_experts, hidden_size, 2*expert_inter_size] layers.{L}.moe.experts.down_projs # [n_experts, expert_inter_size, hidden_size]
Additionally, the Gemma4 router is mapped to the NeMo Gemma4Gate:
HF: .router.proj.weight / .router.scale NeMo: .moe.gate.proj.weight / .moe.gate.scale
The per_expert_scale is absorbed into down_projs during from_hf. When saving back to HF, per_expert_scale is emitted as ones (scale already baked into the weights).
Module Contents
Classes
API
Bases: StateDictAdapter
Converts between HF Gemma4 MoE checkpoints and the NeMo format.
Gather EP-sharded expert tensor across ranks into a full tensor.
Convert a single native tensor back to HF format.
Handles per-tensor conversion for weight streaming (IPC refit) required in RL training:
- Router keys: moe.gate.{proj.weight,scale} -> router.{proj.weight,scale}
- Expert gate_and_up_projs: transpose [E, hidden, 2inter] -> [E, 2inter, hidden] and rename to experts.gate_up_proj
- Expert down_projs: transpose [E, inter, hidden] -> [E, hidden, inter], rename to experts.down_proj, and emit router.per_expert_scale as ones