family kimi_k2
DeepSeek-V3's architecture: latent attention with queries and keys wider than the values, and a mixture of 384 experts plus a shared expert on every block but the first.
One block of the stack. Hover any part for its nnterp name; click to pin the card. The slider picks a block, each tick's color gives its block's shape, and the diagram redraws for the block picked.
identity layers[i].input + self_attn.attention_output + mlp.mlp_output == layer_output
⚠︎ marks a value this checkpoint has only under some load: hover it for the condition.
What print(model) shows on moonshotai/Kimi-K2-Base: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)What print(model) shows on moonshotai/Kimi-K2-Instruct: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-06)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)What print(model) shows on moonshotai/Kimi-K2-Instruct-0905: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168, padding_idx=163839)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)What print(model) shows on moonshotai/Kimi-K2-Thinking: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168, padding_idx=163839)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)What print(model) shows on moonshotai/Kimi-K2.5: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168, padding_idx=163839)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)What print(model) shows on moonshotai/Kimi-K2.6: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168, padding_idx=163839)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)What print(model) shows on moonshotai/Kimi-K2.7-Code: the native modules, standard names and every standard value with its layout.
DeepseekV3ForCausalLM(
(lm_head): Linear(in_features=7168, out_features=163840, bias=False)
(generator): Generator(
(streamer): Streamer()
)
(embed_tokens): Embedding(163840, 7168, padding_idx=163839)
(layers): ModuleList(
(0): DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=18432, bias=False)
(up_proj): Linear(in_features=7168, out_features=18432, bias=False)
(down_proj): Linear(in_features=18432, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
(1-60): 60 x DeepseekV3DecoderLayer(
(self_attn): DeepseekV3Attention(
(q_a_proj): Linear(in_features=7168, out_features=1536, bias=False)
(q_a_layernorm): DeepseekV3RMSNorm((1536,), eps=1e-06)
(q_b_proj): Linear(in_features=1536, out_features=12288, bias=False)
(kv_a_proj_with_mqa): Linear(in_features=7168, out_features=576, bias=False)
(kv_a_layernorm): DeepseekV3RMSNorm((512,), eps=1e-06)
(kv_b_proj): Linear(in_features=512, out_features=16384, bias=False)
(o_proj): Linear(in_features=8192, out_features=7168, bias=False)
(attention_queries) -> Queries [batch num_heads seq qk_head_dim]: The queries entering attention
(attention_keys) -> Keys [batch num_kv_heads seq qk_head_dim]: The keys entering attention
(attention_values) -> Values [batch num_kv_heads seq head_dim]: The values entering attention
(attention_scores) -> Pattern [batch num_heads query key]: The attention scores entering the softmax, masked
(attention_premix) -> HeadOutputs [batch seq num_heads head_dim]: Every head's output side by side, as the output projection takes it
(attention_output) -> Residual [batch seq hidden_size]: What the attention adds to the residual stream
(attention_probabilities) -> Pattern [batch num_heads query key]: The attention pattern the values are mixed with
(attention_head_outputs) -> HeadOutputs [batch seq num_heads head_dim]: The per-head outputs before the output projection
)
(mlp): DeepseekV3MoE(
(experts): DeepseekV3Experts(
(act_fn): SiLUActivation()
)
(router/gate): DeepseekV3TopkRouter()
(shared_experts): DeepseekV3MLP(
(gate_proj): Linear(in_features=7168, out_features=2048, bias=False)
(up_proj): Linear(in_features=7168, out_features=2048, bias=False)
(down_proj): Linear(in_features=2048, out_features=7168, bias=False)
(act_fn): SiLUActivation()
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(mlp_activation) -> Neurons [batch seq intermediate_size]: The activation function's output
(mlp_neurons) -> Neurons [batch seq intermediate_size]: What the down projection receives: act(gate)·up on a gated MLP, the activation itself otherwise
(router_logits) -> RouterLogits [batch seq num_experts]: The router's logits, one per expert, before the scoring
(expert_weights) -> ExpertWeights [batch seq top_k]: The weight each selected expert's output is scaled by
(expert_indices) -> ExpertIndices [batch seq top_k]: The expert each routing slot sends the token to
(expert_outputs) -> ExpertOutputs [batch seq top_k hidden_size]: Each routing slot's weighted expert output
(routed_output) -> Residual [batch seq hidden_size]: The routed experts' combined output
(shared_expert_output) -> Residual [batch seq hidden_size]: The shared expert's output
(mlp_output) -> Residual [batch seq hidden_size]: What the MLP adds to the residual stream
)
(input_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(post_attention_layernorm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(layer_input) -> Residual [batch seq hidden_size]: The residual stream entering the block
(attention_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the attention
(layer_mid) -> Residual [batch seq hidden_size]: The residual stream after the attention add
(mlp_norm_output) -> Residual [batch seq hidden_size]: The normed stream entering the MLP
(mlp_input) -> Residual [batch seq hidden_size]: What the MLP is called with
(layer_output) -> Residual [batch seq hidden_size]: The residual stream leaving the block, a tensor even when the block returns a tuple
)
)
(norm): DeepseekV3RMSNorm((7168,), eps=1e-05)
(logits) -> Logits [batch seq vocab_size]: The logits the model returns, after anything it does past lm_head (a softcap, a scale)
(token_embeddings) -> Residual [batch seq hidden_size]: The embedding module's output; layers[0].input is what enters the first block
(final_norm_output) -> Residual [batch seq hidden_size]: The residual stream after the final norm, what lm_head reads
(lm_head_output) -> Logits [batch seq vocab_size]: The head's logits before anything the model does past lm_head (a softcap, a scale)
(next_token_probs) -> NextTokenProbs [batch vocab_size]: The next-token distribution at the last position; derived, read-only
(input_ids) -> Tokens [batch seq]: The token ids the model was called with
(attention_mask) -> Tokens [batch seq]: The attention mask the model was called with; zeros are padding
(input_size): [batch, seq] of the current call; read-only
)h = x + self_attn(input_layernorm(x)) # multi-head latent attention
out = h + mlp(post_attention_layernorm(h)) # a dense MLP on block 0, a mixture of experts after
DeepSeek-V3's pre-norm block, Llama's names. first_k_dense_replace is 1: block 0's mlp is
a dense MLP and the other 60 blocks' a mixture. The block adds each sublayer's output to the
stream and returns a tensor, so the identity is the plain sum:
with model.trace(prompt):
x = model.layers[1].input.save()
attn = model.layers[1].self_attn.attention_output.save()
mlp = model.layers[1].mlp.mlp_output.save()
out = model.layers[1].layer_output.save()
torch.testing.assert_close(x + attn + mlp, out)
Kimi-K2-Instruct, -Instruct-0905, -Base and -Thinking say kimi_k2 at the top of their
config. AutoConfig maps that type only through the checkpoints' remote code, which builds its
own copy of DeepSeek-V3's classes, and no nnterp family covers those classes. transformers'
DeepseekV3ForCausalLM reads the same config. Load it and hand the module over, with the
checkpoint's tokenizer (which also needs the remote code):
from transformers import AutoTokenizer, DeepseekV3ForCausalLM
repo = "moonshotai/Kimi-K2-Instruct"
module = DeepseekV3ForCausalLM.from_pretrained(repo, attn_implementation="eager")
tokenizer = AutoTokenizer.from_pretrained(repo, trust_remote_code=True)
model = StandardizedTransformer(module, tokenizer=tokenizer)
The loaded config keeps model_type kimi_k2, and nnterp finds the family from it: DeepSeek-V3's
(nnterp/families/deepseek_v3.py) under that name. The weights are stored quantized, as each
config's quantization_config says: FP8 blocks on K2-Base, -Instruct and -Instruct-0905, 4-bit
integer groups (compressed-tensors) on K2-Thinking and the K2.5 line. K2.5, K2.6 and K2.7-Code wrap the same
text model in Kimi_K25ForConditionalGeneration, under model.language_model. Their
text_config says kimi_k2, but transformers' Kimi_K25Config loads it as deepseek_v3, so
nnterp finds the family from the wrapper's own type instead: kimi_k25, which is this family
under the wrapper's name (model.family reads kimi_k25). The standard names are the same.
Queries and keys are qk_head_dim wide (qk_nope_head_dim + qk_rope_head_dim, 128 + 64),
values head_dim (v_head_dim, 128). model.qk_head_dim and model.head_dim give the two
widths. Rotary turns only the last qk_rope_head_dim dimensions of each query and key, and that
part of the key comes from one projection per token, shared by every head. Keys and values are
expanded from one latent per token (kv_lora_rank 512) for every head, so attention_keys has
num_heads (64) heads, as many as the queries. The attention interior needs
attn_implementation="eager".
As on DeepSeek-V3, the rotary part is served in rotate-half order (rope_interleave is true):
the projection's even rotary dimensions, then its odd ones. The scores are scaled by
qk_head_dim ** -0.5 times YaRN's factor, which depends on the context extension: self_attn.scaling
is 0.1309 on K2-Base and K2-Instruct (rope_scaling factor 32) and 0.1447 on the others (factor 64).
384 routed experts, 8 per token, and one shared expert every token runs through.
router_logits are the logits before the sigmoid. The router picks 8 experts by the sigmoid plus
a selection bias, with one expert group (n_group 1), so every expert is a candidate.
expert_weights are the chosen sigmoids without the bias, renormalized and multiplied by
routed_scaling_factor (2.827), so they sum to 2.827 at every token. The mixture's output is routed_output + shared_expert_output:
moe = model.layers[1].mlp
with model.trace(prompt):
weights = moe.expert_weights.save() # [batch, seq, top_k]: 8 on K2
routed = moe.routed_output.save()
shared = moe.shared_expert_output.save()
out = moe.mlp_output.save()
torch.testing.assert_close(routed + shared, out)
Block 0's MLP is dense: support() reports every mixture value missing there.
logits is lm_head.output: no softcap and no scale. lm_head has its own weight. The
embedding is not scaled, so token_embeddings equals layers[0].input.
Kimi K2 (model_type kimi_k2): DeepSeek-V3's architecture under Moonshot's own model type.
Kimi K2 and its successors' language models (K2.5, K2.6, K2.7-Code) are
DeepSeek-V3's DeepseekV3ForCausalLM with Moonshot's tokenizer; their configs say
kimi_k2. transformers builds them with its native DeepSeek-V3 classes: the
multimodal kimi_k25 checkpoints through Kimi_K25Config, whose text_config
is a DeepseekV3Config with model_type deepseek_v3 (the wrapper resolves by
its own type, to kimi_k25.py, which re-exports this module), and the text-only K2
checkpoints from a DeepseekV3ForCausalLM loaded directly, since
AutoConfig maps no kimi_k2. The tree, the envoys and the sizes are
DeepSeek-V3's (deepseek_v3.py); this module names them under kimi_k2,
because the family registry is the module's file name.