nemo_automodel.components.speculative.dspark.target
nemo_automodel.components.speculative.dspark.target
Target-model wrapper for DSpark training (online hidden-state capture).
DSpark feeds the draft two things from the frozen target: the concatenation of a
configured set of decoder-layer hidden states (the draft fc context), and the
final post-norm hidden state (the input the target’s lm_head consumes, used
by the TV / confidence losses). Both are captured in a single forward pass via
forward hooks, mirroring the DFlash target wrapper.
Module Contents
Classes
Data
API
Target-model features needed by the DSpark trainer.
position_ids / seq_lens / doc_remaining are None off the
packing path and carry the (unshifted) packing metadata to the trainer on it.
Capture intermediate + final hidden states from a frozen HF causal LM.
A forward hook on decoder layer i captures hidden_states[i + 1] (the
HuggingFace output_hidden_states offset-1 convention); a hook on the final
norm captures the post-norm last hidden state.
Collapse a 4D Hyper-Connection stream [B, S, hc_mult, H] to [B, S, H].
DeepSeek V4 decoder layers emit hc_mult parallel residual copies; only the
final-norm output is already collapsed. For an intermediate target-feature
layer we reduce the streams with their mean: a simple, in-distribution
reduction that the draft’s learnable fc then reprojects. We deliberately
avoid the model’s final hc_head here, since it is trained for the
last-layer stream distribution, not the intermediate ones. Non-HC targets
emit 3D states and pass through unchanged.
Return the final norm module whose output feeds lm_head.
Return decoder layers as an ordered, integer-indexable list.
Return the base transformer module that owns layers and norm.
Handles the common nestings: a plain causal LM (model.model), a
decoder-only base (model), and multimodal targets whose text stack is
under language_model (e.g. Gemma4: model.model.language_model).
Run the target model once and capture the DSpark context + last hidden state.
Features follow common.extract_context_feature exactly: -1 is the
embedding output, the final layer is the post-norm hidden state (HF
output_hidden_states[num_layers]), and any other id is that decoder
layer’s output. The final-norm output is also returned as the last hidden
state for the TV / confidence losses.
mm_kwargs carries any multimodal inputs present in the training batch
(pixel_values, image_grid_thw, …); :func:filter_forward_kwargs
drops whatever the target’s own forward signature does not accept, so a
text-only target (Qwen3, Gemma4, or MiniMax M3 without multimodal training
data) is never passed inputs it cannot handle — this is a no-behavior-change
extension for every existing (mm_kwargs-empty) caller. A VLM target
(e.g. MiniMax M3) splices the vision features into its embedding sequence
internally when they are provided.
Return the target model input embeddings.
Return the target model output embeddings (lm_head).