char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

fairydreamingconvert : refactor Hy4-preview conversion - move HC tensor mapping to the global map (#28451)d23c47f2a

char/aliceai-t5-moe
130.9 KiB2894 linesraw
1from __future__ import annotations
2
3from typing import Sequence
4
5from .constants import MODEL_ARCH, MODEL_TENSOR, MODEL_TENSORS, TENSOR_NAMES
6
7
8class TensorNameMap:
9    mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = {
10        # Token embeddings
11        MODEL_TENSOR.TOKEN_EMBD: (
12            "gpt_neox.embed_in",                         # gptneox
13            "transformer.wte",                           # gpt2 gpt-j mpt refact qwen dbrx jais exaone
14            "transformer.word_embeddings",               # falcon
15            "word_embeddings",                           # bloom
16            "model.embed_tokens",                        # llama-hf nemotron olmoe olmo2 rwkv6qwen2 glm4-0414 plamo2 granite-hybrid
17            "embed_tokens",                              # embeddinggemma
18            "tok_embeddings",                            # llama-pth
19            "embeddings.word_embeddings",                # bert nomic-bert
20            "embeddings.tok_embeddings",                 # modern-bert
21            "wte",                                       # gpt2
22            "transformer.embd.wte",                      # phi2
23            "model.tok_embeddings",                      # internlm2
24            "model.embedding",                           # mamba-qbert
25            "backbone.embedding",                        # mamba
26            "backbone.embeddings",                       # mamba-hf
27            "transformer.in_out_embed",                  # Grok
28            "embedding.word_embeddings",                 # chatglm
29            "transformer.token_embeddings",              # openelm
30            "shared",                                    # t5
31            "rwkv.embeddings",                           # rwkv6
32            "model.embeddings",                          # rwkv7
33            "model.word_embeddings",                     # bailingmoe
34            "encoder",                                   # neobert
35            "model.transformer.wte",                     # llada
36            "embed_tokens",                              # qwen3-embedding
37            "model.embed",                               # talkie
38        ),
39
40        # Masked embeddings
41        MODEL_TENSOR.MASKED_EMBD_CENTROIDS: (
42            "masked_embedding.centroids",                # gemma-4 E2B/E4B assistants
43        ),
44        MODEL_TENSOR.MASKED_EMBD_ORDERING: (
45            "masked_embedding.token_ordering",           # gemma-4 E2B/E4B assistants
46        ),
47
48        # Token type embeddings
49        MODEL_TENSOR.TOKEN_TYPES: (
50            "embeddings.token_type_embeddings",  # bert nomic-bert
51        ),
52
53        # Normalization of token embeddings
54        MODEL_TENSOR.TOKEN_EMBD_NORM: (
55            "word_embeddings_layernorm",  # bloom
56            "embeddings.LayerNorm",       # bert
57            "embeddings.norm",            # modern-bert
58            "emb_ln",                     # nomic-bert
59            "transformer.norm",           # openelm
60            "rwkv.blocks.0.pre_ln",       # rwkv
61            "rwkv.blocks.0.pre_ln",       # rwkv6
62            "model.pre_ln",               # rwkv7
63            "model.layers.0.pre_norm",    # rwkv7
64            "backbone.norm",              # wavtokenizer
65            "model.embedding_norm",       # lfm2
66        ),
67
68        # Position embeddings
69        MODEL_TENSOR.POS_EMBD: (
70            "transformer.wpe",                 # gpt2
71            "embeddings.position_embeddings",  # bert
72            "wpe",                             # gpt2
73            "model.embed_positions",           # rugpt3xl
74        ),
75
76        # Output
77        MODEL_TENSOR.OUTPUT: (
78            "embed_out",                 # gptneox
79            "lm_head",                   # gpt2 mpt falcon llama-hf baichuan qwen mamba dbrx jais nemotron exaone olmoe olmo2 phimoe plamo2 llama4
80            "output",                    # llama-pth bloom internlm2
81            "word_embeddings_for_head",  # persimmon
82            "lm_head.linear",            # phi2
83            "output_layer",              # chatglm
84            "head",                      # rwkv
85            "head.out",                  # wavtokenizer
86            "model.lm_head",             # dflash
87            "model.transformer.ff_out",  # llada
88            "head.decoder",              # modern-bert
89        ),
90        MODEL_TENSOR.DENSE_2_OUT: (
91            "dense_2_out",  # embeddinggemma
92        ),
93        MODEL_TENSOR.DENSE_3_OUT: (
94            "dense_3_out",  # embeddinggemma
95        ),
96        # Output norm
97        MODEL_TENSOR.OUTPUT_NORM: (
98            "gpt_neox.final_layer_norm",               # gptneox
99            "transformer.ln_f",                        # gpt2 gpt-j falcon jais exaone
100            "model.norm",                              # llama-hf baichuan internlm2 olmoe olmo2 phimoe plamo2
101            "norm",                                    # llama-pth
102            "transformer.norm_f",                      # mpt dbrx
103            "ln_f",                                    # refact bloom qwen gpt2
104            "model.final_layernorm",                   # persimmon
105            "lm_head.ln",                              # phi2
106            "model.norm_f",                            # mamba-qbert
107            "backbone.norm_f",                         # mamba
108            "transformer.rms_norm",                    # Grok
109            "encoder.final_layernorm",                 # chatglm
110            "transformer.norm",                        # openelm
111            "model.norm",                              # nemotron
112            "rwkv.ln_out",                             # rwkv6
113            "model.ln_out",                            # rwkv7
114            "backbone.final_layer_norm",               # wavtokenizer
115            "model.norm",                              # llama4
116            "model.transformer.ln_f",                  # llada
117            "final_norm",                              # modern-bert
118            "model.norm",                              # cogvlm
119        ),
120
121        # Rope frequencies
122        MODEL_TENSOR.ROPE_FREQS: (
123            "rope.freqs",  # llama-pth
124            "rotary_pos_emb.inv_freq",  # chatglm
125        ),
126
127        MODEL_TENSOR.ROPE_FACTORS_LONG: (),
128        MODEL_TENSOR.ROPE_FACTORS_SHORT: (),
129
130        MODEL_TENSOR.CONV1D: (
131            "backbone.embed", # roberta
132        ),
133
134        MODEL_TENSOR.V_MM_EMBEDDING: (
135            "model.embed_vision.embedding", # gemma3n
136        ),
137        MODEL_TENSOR.V_MM_HARD_EMB_NORM: (
138            "model.embed_vision.hard_embedding_norm", # gemma3n
139        ),
140        MODEL_TENSOR.V_MM_INP_PROJ: (
141            "model.embed_vision.embedding_projection", # gemma3n
142        ),
143        MODEL_TENSOR.V_MM_SOFT_EMB_NORM: (
144            "model.embed_vision.soft_embedding_norm", # gemma3n
145        ),
146        MODEL_TENSOR.V_ENC_CONV_STEM: (
147            "model.vision_tower.timm_model.conv_stem.conv", # gemma3n
148        ),
149        MODEL_TENSOR.V_ENC_CONV_STEM_NORM: (
150            "model.vision_tower.timm_model.conv_stem.bn", # gemma3n
151        ),
152        MODEL_TENSOR.V_ENC_MSFA_EXP: (
153            "model.vision_tower.timm_model.msfa.ffn.pw_exp.conv", # gemma3n
154        ),
155        MODEL_TENSOR.V_ENC_MSFA_EXP_NORM: (
156            "model.vision_tower.timm_model.msfa.ffn.pw_exp.bn", # gemma3n
157        ),
158        MODEL_TENSOR.V_ENC_MSFA_PROJ: (
159            "model.vision_tower.timm_model.msfa.ffn.pw_proj.conv", # gemma3n
160        ),
161        MODEL_TENSOR.V_ENC_MSFA_PROJ_NORM: (
162            "model.vision_tower.timm_model.msfa.ffn.pw_proj.bn", # gemma3n
163        ),
164        MODEL_TENSOR.V_ENC_MSFA_NORM: (
165            "model.vision_tower.timm_model.msfa.norm", # gemma3n
166        ),
167        MODEL_TENSOR.A_CTC_OUT: (
168            "encoder.out",
169        ),
170        MODEL_TENSOR.A_CTC_OUT_MID: (
171            "encoder.out_mid",
172        ),
173        MODEL_TENSOR.A_QF_PROJ_QUERY: (
174            "projector.query",
175        ),
176        MODEL_TENSOR.A_QF_PROJ_NORM: (
177            "projector.qformer.layernorm",
178        ),
179        MODEL_TENSOR.A_QF_PROJ_LINEAR: (
180            "projector.linear",
181        ),
182    }
183
184    block_mappings_cfg: dict[MODEL_TENSOR, tuple[str, ...]] = {
185        # Attention norm
186        MODEL_TENSOR.ATTN_NORM: (
187            "gpt_neox.layers.{bid}.input_layernorm",                # gptneox
188            "transformer.h.{bid}.ln_1",                             # gpt2 gpt-j refact qwen jais exaone
189            "transformer.blocks.{bid}.norm_1",                      # mpt
190            "transformer.h.{bid}.input_layernorm",                  # falcon7b
191            "h.{bid}.input_layernorm",                              # bloom
192            "transformer.h.{bid}.ln_mlp",                           # falcon40b
193            "model.layers.{bid}.input_layernorm",                   # llama-hf nemotron olmoe phimoe granite-hybrid
194            "layers.{bid}.attention_norm",                          # llama-pth
195            "model.layers.{bid}.ln1",                               # yi
196            "h.{bid}.ln_1",                                         # gpt2
197            "transformer.h.{bid}.ln",                               # phi2
198            "model.layers.layers.{bid}.norm",                       # plamo
199            "model.layers.layers.{bid}.pre_mixer_norm",             # plamo2
200            "model.layers.{bid}.attention_norm",                    # internlm2
201            "model.layers.{bid}.norm",                              # mamba-qbert
202            "backbone.layers.{bid}.norm",                           # mamba
203            "transformer.decoder_layer.{bid}.rms_norm",             # Grok
204            "model.layers.{bid}.pre_attn_norm",                     # grok-2
205            "transformer.blocks.{bid}.norm_attn_norm.norm_1",       # dbrx
206            "encoder.layers.{bid}.input_layernorm",                 # chatglm
207            "transformer.layers.{bid}.attn_norm",                   # openelm
208            "rwkv.blocks.{bid}.ln1",                                # rwkv6
209            "model.layers.{bid}.ln1",                               # rwkv7
210            "model.layers.{bid}.input_layernorm",                   # llama4
211            "layers.{bid}.input_layernorm",                         # embeddinggemma
212            "transformer_encoder.{bid}.attention_norm",             # neobert
213            "layers.{bid}.attn_norm",                               # modern-bert
214            "model.layers.{bid}.operator_norm",                     # lfm2
215            "model.transformer.blocks.{bid}.attn_norm",             # llada
216            "layers.{bid}.input_layernorm",                         # qwen3-embedding
217            "model.layers.{bid}.attention_layernorm",               # apertus
218            "model.layers.{bid}.pre_attention_layernorm",           # kormo
219        ),
220
221        # Attention norm 2
222        MODEL_TENSOR.ATTN_NORM_2: (
223            "transformer.h.{bid}.ln_attn",                  # falcon40b
224            "encoder.layer.{bid}.layer_norm_1",             # jina-v2-code
225            "rwkv.blocks.{bid}.ln2",                        # rwkv6
226            "model.layers.{bid}.ln2",                       # rwkv7
227            "model.layers.{bid}.post_attention_layernorm",  # cogvlm
228            "model.layers.{bid}.self_attn.norm",            # minimax-01
229        ),
230
231        # Attention query-key-value
232        MODEL_TENSOR.ATTN_QKV: (
233            "gpt_neox.layers.{bid}.attention.query_key_value",                     # gptneox
234            "transformer.h.{bid}.attn.c_attn",                                     # gpt2 qwen jais
235            "transformer.blocks.{bid}.attn.Wqkv",                                  # mpt
236            "transformer.blocks.{bid}.norm_attn_norm.attn.Wqkv",                   # dbrx
237            "transformer.h.{bid}.self_attention.query_key_value",                  # falcon
238            "h.{bid}.self_attention.query_key_value",                              # bloom
239            "model.layers.{bid}.self_attn.query_key_value",                        # persimmon
240            "model.layers.{bid}.attention.query_key_value",                        # bailingmoe2
241            "h.{bid}.attn.c_attn",                                                 # gpt2
242            "transformer.h.{bid}.mixer.Wqkv",                                      # phi2
243            "encoder.layers.{bid}.attn.Wqkv",                                      # nomic-bert
244            "encoder.layers.{bid}.mixer.Wqkv",                                     # jina
245            "model.layers.{bid}.self_attn.qkv_proj",                               # phi3
246            "model.layers.layers.{bid}.mixer.qkv_proj",                            # plamo2
247            "encoder.layers.{bid}.self_attention.query_key_value",                 # chatglm
248            "transformer.layers.{bid}.attn.qkv_proj",                              # openelm
249            "transformer_encoder.{bid}.qkv",                                       # neobert
250            "layers.{bid}.attn.Wqkv",                                              # modern-bert
251            "model.layers.{bid}.self_attn.language_expert_query_key_value",        # cogvlm
252            "model.layers.{bid}.linear_attn.in_proj_qkv",                          # qwen3.5
253        ),
254
255        # Attention query
256        MODEL_TENSOR.ATTN_Q: (
257            "model.layers.{bid}.self_attn.q_proj",                       # llama-hf nemotron olmoe olmo2 phimoe
258            "model.layers.{bid}.attention.q_proj",                       # bailingmoe3
259            "layers.{bid}.self_attn.q_proj",                             # embeddinggemma
260            "model.layers.{bid}.self_attn.q_proj_no_perm",               # llama-custom
261            "layers.{bid}.attention.wq",                                 # llama-pth
262            "encoder.layer.{bid}.attention.self.query",                  # bert
263            "transformer.layer.{bid}.attention.q_lin",                   # distillbert
264            "transformer.h.{bid}.attn.q_proj",                           # gpt-j
265            "model.layers.layers.{bid}.self_attn.q_proj",                # plamo
266            "model.layers.{bid}.attention.wq",                           # internlm2
267            "transformer.decoder_layer.{bid}.multi_head_attention.query",# Grok
268            "transformer.h.{bid}.attn.attention.q_proj",                 # exaone
269            "model.layers.{bid}.self_attn.q_proj",                       # llama4
270            "model.transformer.blocks.{bid}.q_proj",                     # llada
271            "layers.{bid}.self_attn.q_proj",                             # qwen3-embedding
272            "backbone.layers.{bid}.mixer.q_proj",                        # nemotron-h
273            "model.blocks.{bid}.attn.attn_query",                        # talkie
274        ),
275
276        # Attention key
277        MODEL_TENSOR.ATTN_K: (
278            "model.layers.{bid}.self_attn.k_proj",                     # llama-hf nemotron olmoe olmo2 phimoe
279            "model.layers.{bid}.attention.k_proj",                     # bailingmoe3
280            "layers.{bid}.self_attn.k_proj",                           # embeddinggemma
281            "model.layers.{bid}.self_attn.k_proj_no_perm",             # llama-custom
282            "layers.{bid}.attention.wk",                               # llama-pth
283            "encoder.layer.{bid}.attention.self.key",                  # bert
284            "transformer.layer.{bid}.attention.k_lin",                 # distillbert
285            "transformer.h.{bid}.attn.k_proj",                         # gpt-j
286            "transformer.h.{bid}.attn.k",                              # refact
287            "model.layers.layers.{bid}.self_attn.k_proj",              # plamo
288            "model.layers.{bid}.attention.wk",                         # internlm2
289            "transformer.decoder_layer.{bid}.multi_head_attention.key",# Grok
290            "transformer.h.{bid}.attn.attention.k_proj",               # exaone
291            "model.layers.{bid}.self_attn.k_proj",                     # llama4
292            "model.transformer.blocks.{bid}.k_proj",                   # llada
293            "layers.{bid}.self_attn.k_proj",                           # qwen3-embedding
294            "backbone.layers.{bid}.mixer.k_proj",                      # nemotron-h
295            "model.blocks.{bid}.attn.attn_key",                        # talkie
296        ),
297
298        # Attention value
299        MODEL_TENSOR.ATTN_V: (
300            "model.layers.{bid}.self_attn.v_proj",                       # llama-hf nemotron olmoe olmo2 phimoe
301            "model.layers.{bid}.attention.v_proj",                       # bailingmoe3
302            "layers.{bid}.self_attn.v_proj",                             # embeddinggemma
303            "layers.{bid}.attention.wv",                                 # llama-pth
304            "encoder.layer.{bid}.attention.self.value",                  # bert
305            "transformer.layer.{bid}.attention.v_lin",                   # distillbert
306            "transformer.h.{bid}.attn.v_proj",                           # gpt-j
307            "transformer.h.{bid}.attn.v",                                # refact
308            "model.layers.layers.{bid}.self_attn.v_proj",                # plamo
309            "model.layers.{bid}.attention.wv",                           # internlm2
310            "transformer.decoder_layer.{bid}.multi_head_attention.value",# Grok
311            "transformer.h.{bid}.attn.attention.v_proj",                 # exaone
312            "model.layers.{bid}.self_attn.v_proj",                       # llama4
313            "model.transformer.blocks.{bid}.v_proj",                     # llada
314            "layers.{bid}.self_attn.v_proj",                             # qwen3-embedding
315            "backbone.layers.{bid}.mixer.v_proj",                        # nemotron-h
316            "model.blocks.{bid}.attn.attn_value",                        # talkie
317        ),
318
319        # Attention output
320        MODEL_TENSOR.ATTN_OUT: (
321            "gpt_neox.layers.{bid}.attention.dense",                        # gptneox
322            "transformer.h.{bid}.attn.c_proj",                              # gpt2 refact qwen jais
323            "transformer.blocks.{bid}.attn.out_proj",                       # mpt
324            "transformer.h.{bid}.self_attention.dense",                     # falcon
325            "h.{bid}.self_attention.dense",                                 # bloom
326            "model.layers.{bid}.self_attn.o_proj",                          # llama-hf nemotron olmoe olmo2 phimoe
327            "model.layers.{bid}.attention.o_proj",                          # bailingmoe3
328            "model.layers.{bid}.attention.dense",                           # bailingmoe3 MLA
329            "layers.{bid}.self_attn.o_proj",                                # embeddinggemma
330            "model.layers.{bid}.self_attn.out_proj",                        # lfm2 minimax-01
331            "model.layers.{bid}.self_attn.linear_attn",                     # deci
332            "layers.{bid}.attention.wo",                                    # llama-pth
333            "encoder.layer.{bid}.attention.output.dense",                   # bert
334            "layers.{bid}.attn.Wo",                                         # modern-bert
335            "transformer.layer.{bid}.attention.out_lin",                    # distillbert
336            "transformer.h.{bid}.attn.out_proj",                            # gpt-j
337            "model.layers.{bid}.self_attn.dense",                           # persimmon
338            "model.layers.{bid}.attention.dense",                           # bailingmoe2
339            "h.{bid}.attn.c_proj",                                          # gpt2
340            "transformer.h.{bid}.mixer.out_proj",                           # phi2
341            "model.layers.layers.{bid}.self_attn.o_proj",                   # plamo
342            "model.layers.layers.{bid}.mixer.o_proj",                       # plamo2
343            "model.layers.{bid}.attention.wo",                              # internlm2
344            "encoder.layers.{bid}.attn.out_proj",                           # nomic-bert
345            "encoder.layers.{bid}.mixer.out_proj",                          # jina
346            "transformer.decoder_layer.{bid}.multi_head_attention.linear",  # Grok
347            "transformer.blocks.{bid}.norm_attn_norm.attn.out_proj",        # dbrx
348            "encoder.layers.{bid}.self_attention.dense",                    # chatglm
349            "transformer.layers.{bid}.attn.out_proj",                       # openelm
350            "transformer.h.{bid}.attn.attention.out_proj",                  # exaone
351            "model.layers.{bid}.self_attn.o_proj",                          # llama4
352            "transformer_encoder.{bid}.wo",                                 # neobert
353            "model.transformer.blocks.{bid}.attn_out",                      # llada
354            "layers.{bid}.self_attn.o_proj",                                # qwen3-embedding
355            "backbone.layers.{bid}.mixer.o_proj",                           # nemotron-h
356            "model.layers.{bid}.self_attn.language_expert_dense",           # cogvlm
357            "model.blocks.{bid}.attn.attn_resid",                           # talkie
358        ),
359
360        # Attention output norm
361        MODEL_TENSOR.ATTN_OUT_NORM: (
362            "encoder.layer.{bid}.attention.output.LayerNorm",  # bert
363            "transformer.layer.{bid}.sa_layer_norm",           # distillbert
364            "encoder.layers.{bid}.norm1",                      # nomic-bert
365            "transformer.decoder_layer.{bid}.rms_norm_1",      # Grok
366            "model.layers.{bid}.post_attn_norm",               # grok-2
367            "transformer.blocks.{bid}.norm_attn_norm.norm_2",  # dbrx
368        ),
369
370        MODEL_TENSOR.ATTN_POST_NORM: (
371            "model.layers.{bid}.post_attention_layernorm",       # gemma2 olmo2    # ge
372            "layers.{bid}.post_attention_layernorm",             # embeddinggemma
373            "model.layers.{bid}.post_self_attn_layernorm",       # glm-4-0414
374            "model.layers.layers.{bid}.post_mixer_norm.weight",  # plamo2
375        ),
376
377        # Rotary embeddings
378        MODEL_TENSOR.ATTN_ROT_EMBD: (
379            "model.layers.{bid}.self_attn.rotary_emb.inv_freq",        # llama-hf
380            "layers.{bid}.attention.inner_attention.rope.freqs",       # llama-pth
381            "model.layers.layers.{bid}.self_attn.rotary_emb.inv_freq", # plamo
382            "transformer.h.{bid}.attn.rotary_emb.inv_freq",            # codeshell
383        ),
384
385        MODEL_TENSOR.ATTN_SINKS: (
386            "model.layers.{bid}.self_attn.sinks", # openai-moe
387            "model.layers.{bid}.self_attn.attention_sink_bias", # mimov2
388            "model.layers.{bid}.self_attn.learnable_sink_param", # hy-v4
389        ),
390
391        MODEL_TENSOR.ATTN_GATE: (
392            "model.layers.{bid}.self_attn.gate_proj", # afmoe muse-glimmer
393            "model.layers.{bid}.linear_attn.in_proj_z",  # qwen3.5
394            "model.layers.{bid}.self_attn.g_proj",    # step3.5 head-wise attention gate
395            "model.layers.{bid}.self_attn.output_gate",  # minimax-01
396            "model.layers.{bid}.self_attn.linear_gate",  # hy-v4
397        ),
398
399        # Feed-forward norm
400        MODEL_TENSOR.FFN_NORM: (
401            "gpt_neox.layers.{bid}.post_attention_layernorm",                # gptneox
402            "transformer.h.{bid}.ln_2",                                      # gpt2 refact qwen jais exaone
403            "h.{bid}.post_attention_layernorm",                              # bloom
404            "transformer.blocks.{bid}.norm_2",                               # mpt
405            "model.layers.{bid}.post_attention_layernorm",                   # llama-hf nemotron olmoe phimoe
406            "layers.{bid}.ffn_norm",                                         # llama-pth
407            "model.layers.{bid}.ln2",                                        # yi
408            "h.{bid}.ln_2",                                                  # gpt2
409            "model.layers.{bid}.ffn_norm",                                   # internlm2
410            "transformer.decoder_layer.{bid}.rms_norm_2",                    # Grok
411            "model.layers.{bid}.pre_moe_norm",                               # grok-2
412            "encoder.layers.{bid}.post_attention_layernorm",                 # chatglm
413            "transformer.layers.{bid}.ffn_norm",                             # openelm
414            "model.layers.{bid}.pre_ff_layernorm",                           # jamba granite-hybrid
415            "model.layers.{bid}.pre_moe_layernorm",                          # mini-jamba
416            "model.layers.{bid}.post_attention_layernorm",                   # llama4
417            "transformer_encoder.{bid}.ffn_norm",                            # neobert
418            "model.layers.layers.{bid}.pre_mlp_norm",                        # plamo2
419            "model.transformer.blocks.{bid}.ff_norm",                        # llada
420            "layers.{bid}.post_attention_layernorm",                         # qwen3-embedding
421            "model.layers.{bid}.feedforward_layernorm",                      # apertus
422            "model.layers.{bid}.pre_mlp_layernorm",                          # kormo
423            "layers.{bid}.mlp_norm"                                          # modern-bert
424        ),
425
426        # Pre feed-forward norm
427        MODEL_TENSOR.FFN_PRE_NORM: (
428            "model.layers.{bid}.pre_feedforward_layernorm", # gemma2
429            "layers.{bid}.pre_feedforward_layernorm",       # embeddinggemma
430            "model.layers.{bid}.pre_ff_layernorm.weight",
431            "model.layers.{bid}.pre_mlp_layernorm",        # afmoe
432        ),
433
434        MODEL_TENSOR.FFN_PRE_NORM_2: (
435            "model.layers.{bid}.pre_feedforward_layernorm_2", # gemma4
436        ),
437
438        # Post feed-forward norm
439        MODEL_TENSOR.FFN_POST_NORM: (
440            "model.layers.{bid}.post_feedforward_layernorm",  # gemma2 olmo2
441            "layers.{bid}.post_feedforward_layernorm",        # embeddinggemma
442            "model.layers.{bid}.post_mlp_layernorm",          # glm-4-0414
443            "model.layers.layers.{bid}.post_mlp_norm.weight", # plamo2
444            "model.layers.{bid}.feed_forward.up_proj",
445            "model.layers.{bid}.post_moe_norm",               # grok-2
446        ),
447
448        MODEL_TENSOR.FFN_POST_NORM_1: (
449            "model.layers.{bid}.post_feedforward_layernorm_1", # gemma4
450        ),
451
452        MODEL_TENSOR.FFN_POST_NORM_2: (
453            "model.layers.{bid}.post_feedforward_layernorm_2", # gemma4
454        ),
455
456        MODEL_TENSOR.FFN_GATE_INP: (
457            "layers.{bid}.feed_forward.gate",                   # mixtral
458            "model.layers.{bid}.block_sparse_moe.gate",         # mixtral phimoe
459            "model.layers.{bid}.mlp.gate",                      # qwen2moe olmoe
460            "transformer.decoder_layer.{bid}.router",           # Grok
461            "transformer.blocks.{bid}.ffn.router.layer",        # dbrx
462            "model.layers.{bid}.block_sparse_moe.router.layer", # granitemoe
463            "model.layers.{bid}.block_sparse_moe.router",       # granite_swa
464            "model.layers.{bid}.feed_forward.router",           # llama4 jamba
465            "encoder.layers.{bid}.mlp.router.layer",            # nomic-bert-moe
466            "model.layers.{bid}.mlp.router",                    # openai-moe
467            "model.layers.{bid}.mlp.gate.wg",                   # hunyuan
468            "model.layers.{bid}.block_sparse_moe.primary_router", # smallthinker
469            "model.layers.{bid}.feed_forward.gate",               # lfm2moe
470            "model.layers.{bid}.mlp.router.gate",               # afmoe
471            "layers.{bid}.gate",                                # mistral-large
472            "backbone.layers.{bid}.mixer.gate",                 # nemotron-h-moe
473            "model.layers.{bid}.moe.gate",                      # step3.5
474            "model.layers.{bid}.router.proj",                   # gemma4
475        ),
476
477        MODEL_TENSOR.FFN_GATE_INP_SHEXP: (
478            "model.layers.{bid}.mlp.shared_expert_gate", # qwen2moe
479        ),
480
481        MODEL_TENSOR.FFN_EXP_PROBS_B: (
482            "model.layers.{bid}.mlp.gate.e_score_correction",               # deepseek-v3 dots1
483            "model.layers.{bid}.mlp.moe_statics.e_score_correction",        # ernie4.5-moe
484            "model.layers.{bid}.mlp.gate.expert_bias",                      # bailingmoe2
485            "model.layers.{bid}.mlp.expert_bias",                           # afmoe
486            "model.layers.{bid}.feed_forward.expert_bias",                  # lfm2moe
487            "model.layers.{bid}.block_sparse_moe.e_score_correction",       # minimax-m2
488            "backbone.layers.{bid}.mixer.gate.e_score_correction",          # nemotron-h-moe
489            "model.layers.{bid}.mlp.e_score_correction",                    # exaone-moe
490            "model.layers.{bid}.block_sparse_moe.gate.e_score_correction",  # kimi
491            "model.layers.{bid}.moe.router_bias",                           # step3.5 expert selection bias
492            "model.layers.{bid}.mlp.experts.e_score_correction",       # laguna
493        ),
494
495        # Feed-forward up
496        MODEL_TENSOR.FFN_UP: (
497            "gpt_neox.layers.{bid}.mlp.dense_h_to_4h",                # gptneox
498            "transformer.h.{bid}.mlp.c_fc",                           # gpt2 jais
499            "transformer.blocks.{bid}.ffn.up_proj",                   # mpt
500            "transformer.h.{bid}.mlp.dense_h_to_4h",                  # falcon
501            "h.{bid}.mlp.dense_h_to_4h",                              # bloom
502            "model.layers.{bid}.mlp.up_proj",                         # llama-hf refact nemotron olmo2
503            "layers.{bid}.mlp.up_proj",                               # embeddinggemma
504            "layers.{bid}.feed_forward.w3",                           # llama-pth
505            "encoder.layer.{bid}.intermediate.dense",                 # bert
506            "layers.{bid}.mlp.Wi",                                    # modern-bert
507            "transformer.layer.{bid}.ffn.lin1",                       # distillbert
508            "transformer.h.{bid}.mlp.fc_in",                          # gpt-j
509            "transformer.h.{bid}.mlp.linear_3",                       # refact
510            "model.layers.{bid}.mlp.dense_h_to_4h",                   # persimmon
511            "transformer.h.{bid}.mlp.w1",                             # qwen
512            "h.{bid}.mlp.c_fc",                                       # gpt2
513            "transformer.h.{bid}.mlp.fc1",                            # phi2
514            "model.layers.{bid}.mlp.fc1",                             # phi2
515            "model.layers.{bid}.mlp.gate_up_proj",                    # phi3 glm-4-0414
516            "model.layers.layers.{bid}.mlp.up_proj",                  # plamo
517            "model.layers.layers.{bid}.mlp.gate_up_proj",             # plamo2
518            "model.layers.{bid}.feed_forward.w3",                     # internlm2
519            "encoder.layers.{bid}.mlp.fc11",                          # nomic-bert
520            "encoder.layers.{bid}.mlp.fc1",                           # nomic-bert-moe
521            "model.layers.{bid}.mlp.c_fc",                            # starcoder2
522            "encoder.layer.{bid}.mlp.gated_layers_v",                 # jina-bert-v2 (split up/gate, no longer used)
523            "encoder.layer.{bid}.mlp.gated_layers",                   # jina-bert-v2 (GEGLU)
524            "encoder.layer.{bid}.mlp.up_gated_layer",                 # jina-v2-code (GEGLU)
525            "model.layers.{bid}.residual_mlp.w3",                     # arctic
526            "encoder.layers.{bid}.mlp.dense_h_to_4h",                 # chatglm
527            "transformer.h.{bid}.mlp.c_fc_1",                         # exaone
528            "model.layers.{bid}.feed_forward.up_proj",                # llama4 jamba granite-hybrid
529            "transformer_encoder.{bid}.ffn.w12",                      # neobert
530            "model.layers.{bid}.block_sparse_moe.up",                 # smallthinker
531            "model.transformer.blocks.{bid}.up_proj",                 # llada
532            "layers.{bid}.mlp.up_proj",                               # qwen3-embedding
533            "backbone.layers.{bid}.mixer.up_proj",                    # nemotron-h
534            "model.layers.{bid}.mlp.language_mlp.up_proj",            # cogvlm
535            "model.blocks.{bid}.mlp.mlp_linear",                      # talkie
536        ),
537
538        MODEL_TENSOR.FFN_UP_EXP: (
539            "layers.{bid}.feed_forward.experts.w3",                 # mixtral (merged)
540            "transformer.decoder_layer.{bid}.moe.linear_v",         # Grok (merged)
541            "transformer.blocks.{bid}.ffn.experts.mlp.v1",          # dbrx
542            "model.layers.{bid}.mlp.experts.up_proj",               # qwen2moe olmoe (merged) ernie4.5-moe, nemotron-h-moe (merged)
543            "model.layers.{bid}.block_sparse_moe.experts.w3",       # phimoe (merged)
544            "model.layers.{bid}.feed_forward.experts.up_proj",      # llama4
545            "encoder.layers.{bid}.mlp.experts.mlp.w1",              # nomic-bert-moe
546            "model.layers.{bid}.block_sparse_moe.experts.up", # smallthinker
547            "model.layers.{bid}.moe.up_proj",                       # step3.5
548        ),
549
550        MODEL_TENSOR.FFN_UP_SHEXP: (
551            "model.layers.{bid}.mlp.shared_expert.up_proj",          # qwen2moe
552            "model.layers.{bid}.mlp.shared_experts.up_proj",         # deepseek deepseek2
553            "model.layers.{bid}.feed_forward.shared_expert.up_proj", # llama4
554            "model.layers.{bid}.feed_forward.down_proj",
555            "model.layers.{bid}.mlp.shared_mlp.up_proj",             # hunyuan
556            "layers.{bid}.shared_experts.w3",                        # mistral-large
557            "backbone.layers.{bid}.mixer.shared_experts.up_proj",    # nemotron-h-moe
558            "model.layers.{bid}.block_sparse_moe.shared_experts.up_proj", # kimi
559            "model.layers.{bid}.share_expert.up_proj",               # step3.5
560        ),
561
562        MODEL_TENSOR.FFN_UP_CHEXP: (
563            "model.layers.{bid}.mlp.chunk_experts.up_proj",           # grovemoe
564        ),
565
566        # AWQ-activation gate
567        MODEL_TENSOR.FFN_ACT: (
568            "transformer.blocks.{bid}.ffn.act",  # mpt
569        ),
570
571        # Feed-forward gate
572        MODEL_TENSOR.FFN_GATE: (
573            "model.layers.{bid}.mlp.gate_proj",               # llama-hf refact olmo2
574            "layers.{bid}.mlp.gate_proj",                     # embeddinggemma
575            "layers.{bid}.feed_forward.w1",                   # llama-pth
576            "transformer.h.{bid}.mlp.w2",                     # qwen
577            "transformer.h.{bid}.mlp.c_fc2",                  # jais
578            "model.layers.layers.{bid}.mlp.gate_proj",        # plamo
579            "model.layers.{bid}.feed_forward.w1",             # internlm2
580            "encoder.layers.{bid}.mlp.fc12",                  # nomic-bert
581            "encoder.layer.{bid}.mlp.gated_layers_w",         # jina-bert-v2 (split up/gate, no longer used)
582            "transformer.h.{bid}.mlp.linear_1",               # refact
583            "model.layers.{bid}.residual_mlp.w1",             # arctic
584            "transformer.h.{bid}.mlp.c_fc_0",                 # exaone
585            "model.layers.{bid}.feed_forward.gate_proj",      # llama4 jamba granite-hybrid
586            "model.transformer.blocks.{bid}.ff_proj",         # llada
587            "layers.{bid}.mlp.gate_proj",                     # qwen3-embedding
588            "model.layers.{bid}.mlp.language_mlp.gate_proj",  # cogvlm
589            "model.blocks.{bid}.mlp.mlp_gate",                # talkie
590        ),
591
592        MODEL_TENSOR.FFN_GATE_EXP: (
593            "layers.{bid}.feed_forward.experts.w1",                     # mixtral (merged)
594            "transformer.decoder_layer.{bid}.moe.linear",               # Grok (merged)
595            "transformer.blocks.{bid}.ffn.experts.mlp.w1",              # dbrx
596            "model.layers.{bid}.mlp.experts.gate_proj",                 # qwen2moe olmoe (merged) ernie4.5-moe
597            "model.layers.{bid}.block_sparse_moe.experts.w1",           # phimoe (merged)
598            "model.layers.{bid}.feed_forward.experts.gate_proj",        # llama4
599            "model.layers.{bid}.block_sparse_moe.experts.gate",         # smallthinker
600            "model.layers.{bid}.moe.gate_proj",                         # step3.5
601        ),
602
603        MODEL_TENSOR.FFN_GATE_SHEXP: (
604            "model.layers.{bid}.mlp.shared_expert.gate_proj",          # qwen2moe
605            "model.layers.{bid}.mlp.shared_experts.gate_proj",         # deepseek deepseek2
606            "model.layers.{bid}.feed_forward.shared_expert.gate_proj", # llama4
607            "model.layers.{bid}.mlp.shared_mlp.gate_proj",             # hunyuan
608            "layers.{bid}.shared_experts.w1",                          # mistral-large
609            "model.layers.{bid}.block_sparse_moe.shared_experts.gate_proj", # kimi
610            "model.layers.{bid}.share_expert.gate_proj",               # step3.5
611        ),
612
613        MODEL_TENSOR.FFN_GATE_CHEXP: (
614            "model.layers.{bid}.mlp.chunk_experts.gate_proj",           # grovemoe
615        ),
616
617        MODEL_TENSOR.FFN_GATE_UP_EXP: (
618            "model.layers.{bid}.mlp.experts.gate_up_proj",
619            "model.layers.{bid}.experts.gate_up_proj", # gemma4
620        ),
621
622        MODEL_TENSOR.MOE_LATENT_DOWN: (
623            "backbone.layers.{bid}.mixer.fc1_latent_proj",                 # nemotron 3 super
624        ),
625
626        MODEL_TENSOR.MOE_LATENT_UP: (
627            "backbone.layers.{bid}.mixer.fc2_latent_proj",                 # nemotron 3 super
628        ),
629
630        # Feed-forward down
631        MODEL_TENSOR.FFN_DOWN: (
632            "gpt_neox.layers.{bid}.mlp.dense_4h_to_h",                # gptneox
633            "transformer.h.{bid}.mlp.c_proj",                         # gpt2 refact qwen jais
634            "transformer.blocks.{bid}.ffn.down_proj",                 # mpt
635            "transformer.h.{bid}.mlp.dense_4h_to_h",                  # falcon
636            "h.{bid}.mlp.dense_4h_to_h",                              # bloom
637            "model.layers.{bid}.mlp.down_proj",                       # llama-hf nemotron olmo2
638            "layers.{bid}.mlp.down_proj",                             # embeddinggemma
639            "layers.{bid}.feed_forward.w2",                           # llama-pth
640            "encoder.layer.{bid}.output.dense",                       # bert
641            "layers.{bid}.mlp.Wo",                                    # modern-bert
642            "transformer.layer.{bid}.ffn.lin2",                       # distillbert
643            "transformer.h.{bid}.mlp.fc_out",                         # gpt-j
644            "model.layers.{bid}.mlp.dense_4h_to_h",                   # persimmon
645            "h.{bid}.mlp.c_proj",                                     # gpt2
646            "transformer.h.{bid}.mlp.fc2",                            # phi2
647            "model.layers.{bid}.mlp.fc2",                             # phi2
648            "model.layers.layers.{bid}.mlp.down_proj",                # plamo
649            "model.layers.{bid}.feed_forward.w2",                     # internlm2
650            "encoder.layers.{bid}.mlp.fc2",                           # nomic-bert
651            "model.layers.{bid}.mlp.c_proj",                          # starcoder2
652            "encoder.layer.{bid}.mlp.wo",                             # jina-bert-v2
653            "transformer.layers.{bid}.ffn.proj_2",                    # openelm
654            "model.layers.{bid}.residual_mlp.w2",                     # arctic
655            "encoder.layer.{bid}.mlp.down_layer",                     # jina-bert-v2
656            "encoder.layers.{bid}.mlp.dense_4h_to_h",                 # chatglm
657            "model.layers.h.{bid}.mlp.c_proj",                        # exaone
658            "model.layers.{bid}.feed_forward.down_proj",              # llama4 jamba granite-hybrid
659            "transformer_encoder.{bid}.ffn.w3",                       # neobert
660            "model.layers.{bid}.block_sparse_moe.down",               # smallthinker
661            "model.transformer.blocks.{bid}.ff_out",                  # llada
662            "layers.{bid}.mlp.down_proj",                             # qwen3-embedding
663            "backbone.layers.{bid}.mixer.down_proj",                  # nemotron-h
664            "model.layers.{bid}.mlp.language_mlp.down_proj",          # cogvlm
665            "model.blocks.{bid}.mlp.mlp_resid",                       # talkie
666        ),
667
668        MODEL_TENSOR.FFN_DOWN_EXP: (
669            "layers.{bid}.feed_forward.experts.w2",                 # mixtral (merged)
670            "transformer.decoder_layer.{bid}.moe.linear_1",         # Grok (merged)
671            "transformer.blocks.{bid}.ffn.experts.mlp.w2",          # dbrx
672            "model.layers.{bid}.mlp.experts.down_proj",             # qwen2moe olmoe (merged) ernie4.5-moe nemotron-h-moe (merged)
673            "model.layers.{bid}.block_sparse_moe.output_linear",    # granitemoe
674            "model.layers.{bid}.block_sparse_moe.experts.w2",       # phimoe (merged)
675            "model.layers.{bid}.feed_forward.experts.down_proj",    # llama4
676            "encoder.layers.{bid}.mlp.experts.mlp.w2",              # nomic-bert-moe
677            "model.layers.{bid}.block_sparse_moe.experts.down",     # smallthinker
678            "model.layers.{bid}.moe.down_proj",                     # step3.5
679            "model.layers.{bid}.experts.down_proj",                 # gemma4
680        ),
681
682        MODEL_TENSOR.FFN_DOWN_SHEXP: (
683            "model.layers.{bid}.mlp.shared_expert.down_proj",          # qwen2moe
684            "model.layers.{bid}.mlp.shared_experts.down_proj",         # deepseek deepseek2
685            "model.layers.{bid}.feed_forward.shared_expert.down_proj", # llama4
686            "model.layers.{bid}.shared_mlp.output_linear",             # granitemoe
687            "model.layers.{bid}.mlp.shared_mlp.down_proj",             # hunyuan
688            "layers.{bid}.shared_experts.w2",                          # mistral-large
689            "backbone.layers.{bid}.mixer.shared_experts.down_proj",    # nemotron-h-moe
690            "model.layers.{bid}.block_sparse_moe.shared_experts.down_proj", # kimi
691            "model.layers.{bid}.share_expert.down_proj",               # step3.5
692        ),
693
694        MODEL_TENSOR.FFN_DOWN_CHEXP: (
695            "model.layers.{bid}.mlp.chunk_experts.down_proj",           # grovemoe
696        ),
697
698        MODEL_TENSOR.ATTN_Q_NORM: (
699            "encoder.layers.{bid}.self_attention.q_layernorm",
700            "model.layers.{bid}.self_attn.q_layernorm",                       # persimmon
701            "model.layers.{bid}.self_attn.query_layernorm",                   # hunyuan
702            "model.layers.{bid}.attention.query_layernorm",                   # bailingmoe2
703            "model.layers.{bid}.self_attn.q_norm",                            # cohere olmoe chameleon olmo2
704            "layers.{bid}.self_attn.q_norm",                                  # embeddinggemma
705            "transformer.blocks.{bid}.attn.q_ln",                             # sea-lion
706            "encoder.layer.{bid}.attention.self.layer_norm_q",                # jina-bert-v2
707            "transformer.layers.{bid}.attn.q_norm",                           # openelm
708            "model.layers.layers.{bid}.mixer.q",                              # plamo2
709            "model.layers.layers.{bid}.mixer.q_norm",                         # plamo3
710            "layers.{bid}.self_attn.q_norm",                                  # qwen3-embedding
711            "model.layers.{bid}.attention.query_layernorm",                   # apertus
712            "model.blocks.{bid}.attn.head_gain.head_g",                       # talkie
713        ),
714
715        MODEL_TENSOR.ATTN_K_NORM: (
716            "encoder.layers.{bid}.self_attention.k_layernorm",
717            "model.layers.{bid}.self_attn.k_layernorm",                       # persimmon
718            "model.layers.{bid}.self_attn.key_layernorm",                     # hunyuan
719            "model.layers.{bid}.attention.key_layernorm",                     # bailingmoe2
720            "model.layers.{bid}.self_attn.k_norm",                            # cohere olmoe chameleon olmo2
721            "layers.{bid}.self_attn.k_norm",                                  # embeddinggemma
722            "transformer.blocks.{bid}.attn.k_ln",                             # sea-lion
723            "encoder.layer.{bid}.attention.self.layer_norm_k",                # jina-bert-v2
724            "transformer.layers.{bid}.attn.k_norm",                           # openelm
725            "model.layers.layers.{bid}.mixer.k",                              # plamo2
726            "model.layers.layers.{bid}.mixer.k_norm",                         # plamo3
727            "layers.{bid}.self_attn.k_norm",                                  # qwen3-embedding
728            "model.layers.{bid}.self_attn.k_rope_only_layernorm",             # dots3note
729            "model.layers.{bid}.attention.key_layernorm",                     # apertus
730        ),
731
732        MODEL_TENSOR.ROPE_FREQS: (
733            "encoder.layers.{bid}.self_attention.rotary_emb.inv_freq",  # persimmon
734        ),
735
736        MODEL_TENSOR.LAYER_OUT_NORM: (
737            "encoder.layer.{bid}.output.LayerNorm",         # bert
738            "transformer.layer.{bid}.output_layer_norm",    # distillbert
739            "encoder.layers.{bid}.norm2",                   # nomic-bert
740            "transformer.decoder_layer.{bid}.rms_norm_3",   # Grok
741            "encoder.layer.{bid}.mlp.layernorm",            # jina-bert-v2
742            "encoder.layer.{bid}.layer_norm_2",             # jina-v2-code
743            "model.layers.{bid}.final_layernorm",           # bailingmoe2
744        ),
745
746        MODEL_TENSOR.LAYER_OUT_SCALE: (
747            "model.layers.{bid}.layer_scalar", # gemma4
748            "model.blocks.{bid}.embed_skip.a_g", # talkie
749        ),
750
751        MODEL_TENSOR.PER_LAYER_TOKEN_EMBD: (
752            "model.embed_tokens_per_layer",  # gemma3n
753        ),
754
755        MODEL_TENSOR.PER_LAYER_MODEL_PROJ: (
756            "model.per_layer_model_projection",  # gemma3n
757        ),
758
759        MODEL_TENSOR.PER_LAYER_PROJ_NORM: (
760            "model.per_layer_projection_norm",  # gemma3n
761        ),
762
763        MODEL_TENSOR.ALTUP_PROJ: (
764            "model.altup_projections",  # gemma3n
765        ),
766
767        MODEL_TENSOR.ALTUP_UNEMBD_PROJ: (
768            "model.altup_unembed_projections",  # gemma3n
769        ),
770
771        MODEL_TENSOR.PER_LAYER_INP_GATE: (
772            "model.layers.{bid}.per_layer_input_gate",  # gemma3n
773        ),
774
775        MODEL_TENSOR.PER_LAYER_PROJ: (
776            "model.layers.{bid}.per_layer_projection",  # gemma3n
777        ),
778
779        MODEL_TENSOR.PER_LAYER_POST_NORM: (
780            "model.layers.{bid}.post_per_layer_input_norm",  # gemma3n
781        ),
782
783        MODEL_TENSOR.ALTUP_CORRECT_COEF: (
784            "model.layers.{bid}.altup.correction_coefs",  # gemma3n
785        ),
786
787        MODEL_TENSOR.ALTUP_CORRECT_SCALE: (
788            "model.layers.{bid}.altup.correct_output_scale",  # gemma3n
789        ),
790
791        MODEL_TENSOR.ALTUP_PREDICT_COEF: (
792            "model.layers.{bid}.altup.prediction_coefs",  # gemma3n
793        ),
794
795        MODEL_TENSOR.ALTUP_ROUTER: (
796            "model.layers.{bid}.altup.modality_router",  # gemma3n
797        ),
798
799        MODEL_TENSOR.ALTUP_ROUTER_NORM: (
800            "model.layers.{bid}.altup.router_norm",  # gemma3n
801        ),
802
803        MODEL_TENSOR.LAUREL_L: (
804            "model.layers.{bid}.laurel.linear_left",  # gemma3n
805        ),
806
807        MODEL_TENSOR.LAUREL_R: (
808            "model.layers.{bid}.laurel.linear_right",  # gemma3n
809        ),
810
811        MODEL_TENSOR.LAUREL_POST_NORM: (
812            "model.layers.{bid}.laurel.post_laurel_norm",  # gemma3n
813        ),
814
815        MODEL_TENSOR.SSM_IN: (
816            "model.layers.{bid}.in_proj",                   # mamba-hf
817            "backbone.layers.{bid}.mixer.in_proj",          # mamba
818            "model.layers.{bid}.mamba.in_proj",             # jamba falcon-h1 granite-hybrid
819            "model.layers.layers.{bid}.mixer.in_proj",      # plamo2
820            "model.layers.{bid}.linear_attn.in_proj_qkvz",  # qwen3next
821        ),
822
823        MODEL_TENSOR.SSM_CONV1D: (
824            "model.layers.{bid}.conv1d",               # mamba-hf
825            "backbone.layers.{bid}.mixer.conv1d",      # mamba
826            "model.layers.{bid}.mamba.conv1d",         # jamba falcon-h1 granite-hybrid
827            "model.layers.layers.{bid}.mixer.conv1d",  # plamo2
828            "model.layers.{bid}.linear_attn.conv1d",   # qwen3next
829        ),
830
831        MODEL_TENSOR.SSM_X: (
832            "model.layers.{bid}.x_proj",                  # mamba-hf
833            "backbone.layers.{bid}.mixer.x_proj",         # mamba
834            "model.layers.{bid}.mamba.x_proj",            # jamba
835            "model.layers.layers.{bid}.mixer.bcdt_proj",  # plamo2
836        ),
837
838        MODEL_TENSOR.SSM_DT: (
839            "model.layers.{bid}.dt_proj",               # mamba-hf
840            "backbone.layers.{bid}.mixer.dt_proj",      # mamba
841            "model.layers.{bid}.mamba.dt_proj",         # jamba falcon-h1 granite-hybrid
842            "model.layers.layers.{bid}.mixer.dt_proj",  # plamo2
843            "model.layers.{bid}.linear_attn.dt_proj",   # qwen3next
844            "backbone.layers.{bid}.mixer.dt",           # nemotron-h-moe
845            "model.layers.{bid}.self_attn.dt_proj",     # kimi
846            "model.layers.{bid}.attention.dt_proj",     # bailingmoe3
847        ),
848
849        MODEL_TENSOR.SSM_DT_NORM: (
850            "model.layers.layers.{bid}.mixer.dt_norm.weight",  # plamo2
851            "model.layers.{bid}.mamba.dt_layernorm",  # jamba
852        ),
853
854        MODEL_TENSOR.SSM_A: (
855            "model.layers.{bid}.A_log",               # mamba-hf
856            "backbone.layers.{bid}.mixer.A_log",      # mamba
857            "model.layers.{bid}.mamba.A_log",         # jamba falcon-h1 granite-hybrid
858            "model.layers.layers.{bid}.mixer.A_log",  # plamo2
859            "model.layers.{bid}.linear_attn.A_log",   # qwen3next
860            "model.layers.{bid}.self_attn.A_log",     # kimi
861            "model.layers.{bid}.attention.A_log",     # bailingmoe3
862        ),
863
864        MODEL_TENSOR.SSM_B_NORM: (
865            "model.layers.{bid}.mamba.b_layernorm",           # jamba
866            "model.layers.{bid}.mamba.B_layernorm",           # mini-jamba
867            "model.layers.layers.{bid}.mixer.B_norm.weight",  # plamo2
868        ),
869
870        MODEL_TENSOR.SSM_C_NORM: (
871            "model.layers.{bid}.mamba.c_layernorm",           # jamba
872            "model.layers.{bid}.mamba.C_layernorm",           # mini-jamba
873            "model.layers.layers.{bid}.mixer.C_norm.weight",  # plamo2
874        ),
875
876        MODEL_TENSOR.SSM_D: (
877            "model.layers.{bid}.D",               # mamba-hf
878            "backbone.layers.{bid}.mixer.D",      # mamba
879            "model.layers.{bid}.mamba.D",         # jamba falcon-h1 granite-hybrid
880            "model.layers.layers.{bid}.mixer.D",  # plamo2
881        ),
882
883        MODEL_TENSOR.SSM_NORM: (
884            "model.layers.{bid}.mamba.norm",        # falcon-h1 granite-hybrid
885            "model.layers.{bid}.linear_attn.norm",  # qwen3next
886            "backbone.layers.{bid}.mixer.norm",     # mamba2
887            "model.layers.{bid}.self_attn.o_norm",  # kimi
888            "model.layers.{bid}.attention.o_norm",  # bailingmoe3
889        ),
890
891        MODEL_TENSOR.SSM_OUT: (
892            "model.layers.{bid}.out_proj",               # mamba-hf
893            "backbone.layers.{bid}.mixer.out_proj",      # mamba
894            "model.layers.{bid}.mamba.out_proj",         # jamba falcon-h1 granite-hybrid
895            "model.layers.{bid}.linear_attn.out_proj",   # qwen3next
896            "model.layers.layers.{bid}.mixer.out_proj",  # plamo2
897        ),
898
899        MODEL_TENSOR.SSM_ALPHA: (
900            "model.layers.{bid}.linear_attn.in_proj_a",  # qwen3.5
901        ),
902
903        MODEL_TENSOR.SSM_BETA_ALPHA: (
904            "model.layers.{bid}.linear_attn.in_proj_ba",  # qwen3next
905        ),
906
907        # Kimi Linear KDA (using SSM_ prefix for consistency)
908        MODEL_TENSOR.SSM_CONV1D_Q: (
909            "model.layers.{bid}.self_attn.q_conv1d",
910            "model.layers.{bid}.attention.q_conv1d",
911        ),
912        MODEL_TENSOR.SSM_CONV1D_K: (
913            "model.layers.{bid}.self_attn.k_conv1d",
914            "model.layers.{bid}.attention.k_conv1d",
915        ),
916        MODEL_TENSOR.SSM_CONV1D_V: (
917            "model.layers.{bid}.self_attn.v_conv1d",
918            "model.layers.{bid}.attention.v_conv1d",
919        ),
920        MODEL_TENSOR.SSM_F_A: (
921            "model.layers.{bid}.self_attn.f_a_proj",
922        ),
923        MODEL_TENSOR.SSM_F_B: (
924            "model.layers.{bid}.self_attn.f_b_proj",
925        ),
926        MODEL_TENSOR.SSM_BETA: (
927            "model.layers.{bid}.linear_attn.in_proj_b",  # qwen3.5
928            "model.layers.{bid}.self_attn.b_proj",       # Kimi Linear
929            "model.layers.{bid}.attention.b_proj",       # bailingmoe3
930        ),
931        # Kimi K3 latent MoE: routed experts operate in a down-projected space
932        MODEL_TENSOR.FFN_ROUTED_DOWN: (
933            "model.layers.{bid}.block_sparse_moe.routed_expert_down_proj",
934        ),
935
936        MODEL_TENSOR.FFN_ROUTED_UP: (
937            "model.layers.{bid}.block_sparse_moe.routed_expert_up_proj",
938        ),
939
940        MODEL_TENSOR.FFN_ROUTED_NORM: (
941            "model.layers.{bid}.block_sparse_moe.routed_expert_norm",
942        ),
943
944        MODEL_TENSOR.SSM_G_A: (
945            "model.layers.{bid}.self_attn.g_a_proj",
946        ),
947        MODEL_TENSOR.SSM_G_B: (
948            "model.layers.{bid}.self_attn.g_b_proj",
949        ),
950        MODEL_TENSOR.TIME_MIX_W0: (
951            "model.layers.{bid}.attention.w0",            # rwkv7
952        ),
953
954        MODEL_TENSOR.TIME_MIX_W1: (
955            "rwkv.blocks.{bid}.attention.time_maa_w1",    # rwkv6
956            "model.layers.{bid}.self_attn.time_maa_w1",   # rwkv6qwen2
957            "model.layers.{bid}.attention.w1",            # rwkv7
958        ),
959
960        MODEL_TENSOR.TIME_MIX_W2: (
961            "rwkv.blocks.{bid}.attention.time_maa_w2",    # rwkv6
962            "model.layers.{bid}.self_attn.time_maa_w2",   # rwkv6qwen2
963            "model.layers.{bid}.attention.w2",            # rwkv7
964        ),
965
966        MODEL_TENSOR.TIME_MIX_A0: (
967            "model.layers.{bid}.attention.a0",            # rwkv7
968        ),
969
970        MODEL_TENSOR.TIME_MIX_A1: (
971            "model.layers.{bid}.attention.a1",            # rwkv7
972        ),
973
974        MODEL_TENSOR.TIME_MIX_A2: (
975            "model.layers.{bid}.attention.a2",            # rwkv7
976        ),
977
978        MODEL_TENSOR.TIME_MIX_V0: (
979            "model.layers.{bid}.attention.v0",            # rwkv7
980        ),
981
982        MODEL_TENSOR.TIME_MIX_V1: (
983            "model.layers.{bid}.attention.v1",            # rwkv7
984        ),
985
986        MODEL_TENSOR.TIME_MIX_V2: (
987            "model.layers.{bid}.attention.v2",            # rwkv7
988        ),
989
990        MODEL_TENSOR.TIME_MIX_G1: (
991            "model.layers.{bid}.attention.g1",            # rwkv7
992        ),
993
994        MODEL_TENSOR.TIME_MIX_G2: (
995            "model.layers.{bid}.attention.g2",            # rwkv7
996        ),
997
998        MODEL_TENSOR.TIME_MIX_K_K: (
999            "model.layers.{bid}.attention.k_k",            # rwkv7
1000        ),
1001
1002        MODEL_TENSOR.TIME_MIX_K_A: (
1003            "model.layers.{bid}.attention.k_a",            # rwkv7
1004        ),
1005
1006        MODEL_TENSOR.TIME_MIX_R_K: (
1007            "model.layers.{bid}.attention.r_k",            # rwkv7
1008        ),
1009
1010        MODEL_TENSOR.TIME_MIX_LERP_X: (
1011            "rwkv.blocks.{bid}.attention.time_maa_x",   # rwkv6
1012            "model.layers.{bid}.self_attn.time_maa_x",  # rwkv6qwen2
1013        ),
1014
1015        MODEL_TENSOR.TIME_MIX_LERP_K: (
1016            "rwkv.blocks.{bid}.attention.time_maa_k",   # rwkv6
1017            "model.layers.{bid}.self_attn.time_maa_k",  # rwkv6qwen2
1018        ),
1019
1020        MODEL_TENSOR.TIME_MIX_LERP_V: (
1021            "rwkv.blocks.{bid}.attention.time_maa_v",   # rwkv6
1022            "model.layers.{bid}.self_attn.time_maa_v",  # rwkv6qwen2
1023        ),
1024
1025        MODEL_TENSOR.TIME_MIX_LERP_R: (
1026            "rwkv.blocks.{bid}.attention.time_maa_r",   # rwkv6
1027            "model.layers.{bid}.self_attn.time_maa_r",  # rwkv6qwen2
1028        ),
1029
1030        MODEL_TENSOR.TIME_MIX_LERP_G: (
1031            "rwkv.blocks.{bid}.attention.time_maa_g",   # rwkv6
1032            "model.layers.{bid}.self_attn.time_maa_g",  # rwkv6qwen2
1033        ),
1034
1035        MODEL_TENSOR.TIME_MIX_LERP_W: (
1036            "rwkv.blocks.{bid}.attention.time_maa_w",   # rwkv6
1037            "model.layers.{bid}.self_attn.time_maa_w",  # rwkv6qwen2
1038        ),
1039
1040        MODEL_TENSOR.TIME_MIX_FIRST: (
1041            "rwkv.blocks.{bid}.attention.time_faaaa",   # rwkv6
1042        ),
1043
1044        MODEL_TENSOR.TIME_MIX_DECAY: (
1045            "rwkv.blocks.{bid}.attention.time_decay",   # rwkv6
1046            "model.layers.{bid}.self_attn.time_decay",  # rwkv6qwen2
1047        ),
1048
1049        MODEL_TENSOR.TIME_MIX_DECAY_W1: (
1050            "rwkv.blocks.{bid}.attention.time_decay_w1",  # rwkv6
1051            "model.layers.{bid}.self_attn.time_decay_w1", # rwkv6qwen2
1052        ),
1053
1054        MODEL_TENSOR.TIME_MIX_DECAY_W2: (
1055            "rwkv.blocks.{bid}.attention.time_decay_w2",  # rwkv6
1056            "model.layers.{bid}.self_attn.time_decay_w2", # rwkv6qwen2
1057        ),
1058
1059        MODEL_TENSOR.TIME_MIX_KEY: (
1060            "rwkv.blocks.{bid}.attention.key",     # rwkv6
1061            "model.layers.{bid}.self_attn.k_proj", # rwkv6qwen2
1062            "model.layers.{bid}.attention.key",    # rwkv7
1063            "model.layers.{bid}.attention.k_proj", # rwkv7
1064        ),
1065
1066        MODEL_TENSOR.TIME_MIX_VALUE: (
1067            "rwkv.blocks.{bid}.attention.value",   # rwkv6
1068            "model.layers.{bid}.self_attn.v_proj", # rwkv6qwen2
1069            "model.layers.{bid}.attention.value",  # rwkv7
1070            "model.layers.{bid}.attention.v_proj", # rwkv7
1071        ),
1072
1073        MODEL_TENSOR.TIME_MIX_RECEPTANCE: (
1074            "rwkv.blocks.{bid}.attention.receptance",  # rwkv6
1075            "model.layers.{bid}.self_attn.q_proj",     # rwkv6qwen2
1076            "model.layers.{bid}.attention.receptance", # rwkv7
1077            "model.layers.{bid}.attention.r_proj",     # rwkv7
1078        ),
1079
1080        MODEL_TENSOR.TIME_MIX_GATE: (
1081            "rwkv.blocks.{bid}.attention.gate",        # rwkv6
1082            "model.layers.{bid}.self_attn.gate",       # rwkv6qwen2
1083        ),
1084
1085        MODEL_TENSOR.TIME_MIX_LN: (
1086            "rwkv.blocks.{bid}.attention.ln_x", # rwkv6
1087            "model.layers.{bid}.attention.ln_x" # rwkv7
1088        ),
1089
1090        MODEL_TENSOR.TIME_MIX_OUTPUT: (
1091            "rwkv.blocks.{bid}.attention.output",  # rwkv6
1092            "model.layers.{bid}.self_attn.o_proj", # rwkv6qwen2
1093            "model.layers.{bid}.attention.output", # rwkv7
1094            "model.layers.{bid}.attention.o_proj", # rwkv7
1095        ),
1096
1097        MODEL_TENSOR.CHANNEL_MIX_LERP_K: (
1098            "rwkv.blocks.{bid}.feed_forward.time_maa_k", # rwkv6
1099            "model.layers.{bid}.feed_forward.x_k",       # rwkv7
1100        ),
1101
1102        MODEL_TENSOR.CHANNEL_MIX_LERP_R: (
1103            "rwkv.blocks.{bid}.feed_forward.time_maa_r", # rwkv6
1104        ),
1105
1106        MODEL_TENSOR.CHANNEL_MIX_KEY: (
1107            "rwkv.blocks.{bid}.feed_forward.key",  # rwkv6
1108            "model.layers.{bid}.feed_forward.key", # rwkv7
1109        ),
1110
1111        MODEL_TENSOR.CHANNEL_MIX_RECEPTANCE: (
1112            "rwkv.blocks.{bid}.feed_forward.receptance", # rwkv6
1113        ),
1114
1115        MODEL_TENSOR.CHANNEL_MIX_VALUE: (
1116            "rwkv.blocks.{bid}.feed_forward.value",  # rwkv6
1117            "model.layers.{bid}.feed_forward.value", # rwkv7
1118        ),
1119
1120        MODEL_TENSOR.ATTN_Q_A: (
1121            "model.layers.{bid}.self_attn.q_a_proj", # deepseek2
1122            "model.layers.{bid}.attention.q_a_proj",  # bailingmoe3 (Ling-3.0-tiny)
1123            "layers.{bid}.attention.wq_a",           # mistral-large
1124        ),
1125
1126        MODEL_TENSOR.ATTN_Q_B: (
1127            "model.layers.{bid}.self_attn.q_b_proj", # deepseek2
1128            "model.layers.{bid}.attention.q_b_proj",  # bailingmoe3 (Ling-3.0-tiny)
1129            "layers.{bid}.attention.wq_b",           # mistral-large
1130        ),
1131
1132        MODEL_TENSOR.ATTN_KV_A_MQA: (
1133            "model.layers.{bid}.self_attn.kv_a_proj_with_mqa", # deepseek2
1134            "model.layers.{bid}.attention.kv_a_proj_with_mqa", # bailingmoe3
1135            "layers.{bid}.attention.wkv_a_with_mqa",           # mistral-large
1136        ),
1137
1138        MODEL_TENSOR.ATTN_KV_B: (
1139            "model.layers.{bid}.self_attn.kv_b_proj", # deepseek2
1140            "model.layers.{bid}.attention.kv_b_proj", # bailingmoe3
1141        ),
1142
1143        MODEL_TENSOR.ATTN_K_B: (
1144            "model.layers.{bid}.self_attn.k_b_proj",  # deepseek2
1145            "model.layers.{bid}.attention.k_b_proj",  # bailingmoe3
1146            "layers.{bid}.attention.k_b_proj",        # mistral-large
1147        ),
1148
1149        MODEL_TENSOR.ATTN_V_B: (
1150            "model.layers.{bid}.self_attn.v_b_proj",  # deepseek2
1151            "model.layers.{bid}.attention.v_b_proj",  # bailingmoe3
1152            "layers.{bid}.attention.v_b_proj",        # mistral-large
1153        ),
1154
1155        MODEL_TENSOR.ATTN_Q_A_NORM: (
1156            "model.layers.{bid}.self_attn.q_a_layernorm", # deepseek2
1157            "model.layers.{bid}.attention.q_a_layernorm", # bailingmoe3 (Ling-3.0-tiny)
1158            "layers.{bid}.attention.q_a_norm",            # mistral-large
1159        ),
1160
1161        MODEL_TENSOR.ATTN_KV_A_NORM: (
1162            "model.layers.{bid}.self_attn.kv_a_layernorm", # deepseek2
1163            "model.layers.{bid}.attention.kv_a_layernorm", # bailingmoe3
1164            "layers.{bid}.attention.kv_a_norm",            # mistral-large
1165        ),
1166
1167        MODEL_TENSOR.ATTN_SUB_NORM: (
1168            "model.layers.{bid}.self_attn.inner_attn_ln",  # bitnet
1169        ),
1170
1171        MODEL_TENSOR.FFN_SUB_NORM: (
1172            "model.layers.{bid}.mlp.ffn_layernorm",  # bitnet
1173        ),
1174
1175        MODEL_TENSOR.DEC_ATTN_NORM: (
1176            "decoder.block.{bid}.layer.0.layer_norm", # t5
1177        ),
1178
1179        MODEL_TENSOR.DEC_ATTN_Q: (
1180            "decoder.block.{bid}.layer.0.SelfAttention.q", # t5
1181        ),
1182
1183        MODEL_TENSOR.DEC_ATTN_K: (
1184            "decoder.block.{bid}.layer.0.SelfAttention.k", # t5
1185        ),
1186
1187        MODEL_TENSOR.DEC_ATTN_V: (
1188            "decoder.block.{bid}.layer.0.SelfAttention.v", # t5
1189        ),
1190
1191        MODEL_TENSOR.DEC_ATTN_OUT: (
1192            "decoder.block.{bid}.layer.0.SelfAttention.o", # t5
1193        ),
1194
1195        MODEL_TENSOR.DEC_ATTN_REL_B: (
1196            "decoder.block.{bid}.layer.0.SelfAttention.relative_attention_bias", # t5
1197        ),
1198
1199        MODEL_TENSOR.DEC_CROSS_ATTN_NORM: (
1200            "decoder.block.{bid}.layer.1.layer_norm", # t5
1201        ),
1202
1203        MODEL_TENSOR.DEC_CROSS_ATTN_Q: (
1204            "decoder.block.{bid}.layer.1.EncDecAttention.q", # t5
1205        ),
1206
1207        MODEL_TENSOR.DEC_CROSS_ATTN_K: (
1208            "decoder.block.{bid}.layer.1.EncDecAttention.k", # t5
1209        ),
1210
1211        MODEL_TENSOR.DEC_CROSS_ATTN_V: (
1212            "decoder.block.{bid}.layer.1.EncDecAttention.v", # t5
1213        ),
1214
1215        MODEL_TENSOR.DEC_CROSS_ATTN_OUT: (
1216            "decoder.block.{bid}.layer.1.EncDecAttention.o", # t5
1217        ),
1218
1219        MODEL_TENSOR.DEC_CROSS_ATTN_REL_B: (
1220            "decoder.block.{bid}.layer.1.EncDecAttention.relative_attention_bias", # t5
1221        ),
1222
1223        MODEL_TENSOR.DEC_FFN_NORM: (
1224            "decoder.block.{bid}.layer.2.layer_norm", # t5
1225        ),
1226
1227        MODEL_TENSOR.DEC_FFN_GATE: (
1228            "decoder.block.{bid}.layer.2.DenseReluDense.wi_0", # flan-t5
1229        ),
1230
1231        MODEL_TENSOR.DEC_FFN_UP: (
1232            "decoder.block.{bid}.layer.2.DenseReluDense.wi",   # t5
1233            "decoder.block.{bid}.layer.2.DenseReluDense.wi_1", # flan-t5
1234        ),
1235
1236        MODEL_TENSOR.DEC_FFN_DOWN: (
1237            "decoder.block.{bid}.layer.2.DenseReluDense.wo", # t5
1238        ),
1239
1240        MODEL_TENSOR.DEC_OUTPUT_NORM: (
1241            "decoder.final_layer_norm", # t5
1242        ),
1243
1244        MODEL_TENSOR.ENC_ATTN_NORM: (
1245            "encoder.block.{bid}.layer.0.layer_norm", # t5
1246        ),
1247
1248        MODEL_TENSOR.ENC_ATTN_Q: (
1249            "encoder.block.{bid}.layer.0.SelfAttention.q", # t5
1250        ),
1251
1252        MODEL_TENSOR.ENC_ATTN_K: (
1253            "encoder.block.{bid}.layer.0.SelfAttention.k", # t5
1254        ),
1255
1256        MODEL_TENSOR.ENC_ATTN_V: (
1257            "encoder.block.{bid}.layer.0.SelfAttention.v", # t5
1258        ),
1259
1260        MODEL_TENSOR.ENC_ATTN_OUT: (
1261            "encoder.block.{bid}.layer.0.SelfAttention.o", # t5
1262        ),
1263
1264        MODEL_TENSOR.ENC_ATTN_REL_B: (
1265            "encoder.block.{bid}.layer.0.SelfAttention.relative_attention_bias", # t5
1266        ),
1267
1268        MODEL_TENSOR.ENC_FFN_NORM: (
1269            "encoder.block.{bid}.layer.1.layer_norm", # t5
1270        ),
1271
1272        MODEL_TENSOR.ENC_FFN_GATE: (
1273            "encoder.block.{bid}.layer.1.DenseReluDense.wi_0", # flan-t5
1274        ),
1275
1276        MODEL_TENSOR.ENC_FFN_UP: (
1277            "encoder.block.{bid}.layer.1.DenseReluDense.wi",   # t5
1278            "encoder.block.{bid}.layer.1.DenseReluDense.wi_1", # flan-t5
1279        ),
1280
1281        MODEL_TENSOR.ENC_FFN_DOWN: (
1282            "encoder.block.{bid}.layer.1.DenseReluDense.wo", # t5
1283        ),
1284
1285        MODEL_TENSOR.VISEXP_UP: (
1286            "model.layers.{bid}.mlp.vision_mlp.up_proj",  # cogvlm
1287        ),
1288
1289        MODEL_TENSOR.VISEXP_GATE: (
1290            "model.layers.{bid}.mlp.vision_mlp.gate_proj",  # cogvlm
1291        ),
1292
1293        MODEL_TENSOR.VISEXP_DOWN: (
1294            "model.layers.{bid}.mlp.vision_mlp.down_proj",  # cogvlm
1295        ),
1296
1297        MODEL_TENSOR.VISEXP_ATTN_OUT: (
1298            "model.layers.{bid}.self_attn.vision_expert_dense",  # cogvlm
1299        ),
1300
1301        MODEL_TENSOR.VISEXP_ATTN_QKV: (
1302            "model.layers.{bid}.self_attn.vision_expert_query_key_value",  # cogvlm
1303        ),
1304
1305        MODEL_TENSOR.INDEXER_K_NORM: (
1306            "model.layers.{bid}.self_attn.indexer.k_norm",  # DSA
1307            "model.layers.{bid}.self_attn.index_k_norm",    # MSA
1308        ),
1309
1310        MODEL_TENSOR.INDEXER_PROJ: (
1311            "model.layers.{bid}.self_attn.indexer.weights_proj", # DSA
1312        ),
1313
1314        MODEL_TENSOR.INDEXER_ATTN_K: (
1315            "model.layers.{bid}.self_attn.indexer.wk", # DSA
1316        ),
1317
1318        MODEL_TENSOR.INDEXER_ATTN_Q_B: (
1319            "model.layers.{bid}.self_attn.indexer.wq_b", # DSA
1320        ),
1321
1322        MODEL_TENSOR.INDEXER_Q_PROJ: (
1323            "model.layers.{bid}.self_attn.index_q_proj", # MSA
1324        ),
1325
1326        MODEL_TENSOR.INDEXER_K_PROJ: (
1327            "model.layers.{bid}.self_attn.index_k_proj", # MSA
1328        ),
1329
1330        MODEL_TENSOR.INDEXER_Q_NORM: (
1331            "model.layers.{bid}.self_attn.index_q_norm", # MSA
1332        ),
1333
1334        MODEL_TENSOR.HC_ATTN_FN: (
1335            "model.layers.{bid}.hc_attn_layer.hc_pre.hc_fn", # hy-v4
1336        ),
1337
1338        MODEL_TENSOR.HC_ATTN_BASE: (
1339            "model.layers.{bid}.hc_attn_layer.hc_pre.hc_base", # hy-v4
1340        ),
1341
1342        MODEL_TENSOR.HC_ATTN_SCALE: (
1343            "model.layers.{bid}.hc_attn_layer.hc_pre.hc_scale", # hy-v4
1344        ),
1345
1346        MODEL_TENSOR.HC_FFN_FN: (
1347            "model.layers.{bid}.hc_mlp_layer.hc_pre.hc_fn", # hy-v4
1348        ),
1349
1350        MODEL_TENSOR.HC_FFN_BASE: (
1351            "model.layers.{bid}.hc_mlp_layer.hc_pre.hc_base", # hy-v4
1352        ),
1353
1354        MODEL_TENSOR.HC_FFN_SCALE: (
1355            "model.layers.{bid}.hc_mlp_layer.hc_pre.hc_scale", # hy-v4
1356        ),
1357
1358        MODEL_TENSOR.HC_HEAD_FN: (
1359            "model.hc_head.hc_head_fn",  # hy-v4
1360        ),
1361
1362        MODEL_TENSOR.HC_HEAD_BASE: (
1363            "model.hc_head.hc_head_base", # hy-v4
1364        ),
1365
1366        MODEL_TENSOR.HC_HEAD_SCALE: (
1367            "model.hc_head.hc_head_scale", # hy-v4
1368        ),
1369
1370        ############################################################################
1371        # TODO: these do not belong to block_mappings_cfg - move them to mappings_cfg
1372        MODEL_TENSOR.ENC_OUTPUT_NORM: (
1373            "encoder.final_layer_norm", # t5
1374            "layer_norm",               # neobert
1375            "model.hidden_norm",        # dflash
1376            "encoder.output_norm_enc",  # dflash (transformers MuseGlimmerAssistant)
1377        ),
1378
1379        MODEL_TENSOR.FC: (
1380            "model.fc",   # dflash
1381            "encoder.fc", # dflash (transformers MuseGlimmerAssistant)
1382        ),
1383
1384        MODEL_TENSOR.DSPARK_MARKOV_W1: (
1385            "model.markov_head.markov_w1", # dspark
1386        ),
1387
1388        MODEL_TENSOR.DSPARK_MARKOV_W2: (
1389            "model.markov_head.markov_w2", # dspark
1390        ),
1391
1392        MODEL_TENSOR.DSPARK_CONF_PROJ: (
1393            "model.confidence_head.proj", # dspark
1394        ),
1395
1396        MODEL_TENSOR.DFLASH_ATTN_CONV_BASE: (
1397            "model.layers.{bid}.attention_conv.base_kernel",
1398        ),
1399
1400        MODEL_TENSOR.DFLASH_ATTN_CONV_PROJ: (
1401            "model.layers.{bid}.attention_conv.kernel_projection",
1402        ),
1403
1404        MODEL_TENSOR.DFLASH_FFN_CONV_BASE: (
1405            "model.layers.{bid}.mlp_conv.base_kernel",
1406        ),
1407
1408        MODEL_TENSOR.DFLASH_FFN_CONV_PROJ: (
1409            "model.layers.{bid}.mlp_conv.kernel_projection",
1410        ),
1411
1412        MODEL_TENSOR.DFLASH_SELECTOR_PREV: (
1413            "model.candidate_selector.predecessor_codebook",
1414        ),
1415
1416        MODEL_TENSOR.DFLASH_SELECTOR_NEXT: (
1417            "model.candidate_selector.successor_codebook",
1418        ),
1419
1420        MODEL_TENSOR.DFLASH_SELECTOR_HIDDEN: (
1421            "model.candidate_selector.hidden_projection",
1422        ),
1423
1424        MODEL_TENSOR.CLS: (
1425            "classifier",       # jina
1426            "classifier.dense", # roberta
1427            "pre_classifier",   # distillbert
1428            "dense",            # neobert
1429            "head.dense",       # modern-bert
1430        ),
1431
1432        MODEL_TENSOR.CLS_OUT: (
1433            "classifier.out_proj", # roberta
1434        ),
1435
1436        MODEL_TENSOR.CLS_NORM: (
1437            "head.norm", # modern-bert
1438        ),
1439        #############################################################################
1440
1441        MODEL_TENSOR.CONVNEXT_DW: (
1442            "backbone.convnext.{bid}.dwconv", # wavtokenizer
1443        ),
1444
1445        MODEL_TENSOR.CONVNEXT_NORM: (
1446            "backbone.convnext.{bid}.norm", # wavtokenizer
1447        ),
1448
1449        MODEL_TENSOR.CONVNEXT_PW1: (
1450            "backbone.convnext.{bid}.pwconv1", # wavtokenizer
1451        ),
1452
1453        MODEL_TENSOR.CONVNEXT_PW2: (
1454            "backbone.convnext.{bid}.pwconv2", # wavtokenizer
1455        ),
1456
1457        MODEL_TENSOR.CONVNEXT_GAMMA: (
1458            "backbone.convnext.{bid}.gamma", # wavtokenizer
1459        ),
1460
1461        MODEL_TENSOR.POSNET_CONV1: (
1462            "backbone.posnet.{bid}.conv1", # wavtokenizer
1463        ),
1464
1465        MODEL_TENSOR.POSNET_CONV2: (
1466            "backbone.posnet.{bid}.conv2", # wavtokenizer
1467        ),
1468
1469        MODEL_TENSOR.POSNET_NORM: (
1470            "backbone.posnet.{bid}.norm", # wavtokenizer
1471        ),
1472
1473        MODEL_TENSOR.POSNET_NORM1: (
1474            "backbone.posnet.{bid}.norm1", # wavtokenizer
1475        ),
1476
1477        MODEL_TENSOR.POSNET_NORM2: (
1478            "backbone.posnet.{bid}.norm2", # wavtokenizer
1479        ),
1480
1481        MODEL_TENSOR.POSNET_ATTN_NORM: (
1482            "backbone.posnet.{bid}.norm", # wavtokenizer
1483        ),
1484
1485        MODEL_TENSOR.POSNET_ATTN_Q: (
1486            "backbone.posnet.{bid}.q", # wavtokenizer
1487        ),
1488
1489        MODEL_TENSOR.POSNET_ATTN_K: (
1490            "backbone.posnet.{bid}.k", # wavtokenizer
1491        ),
1492
1493        MODEL_TENSOR.POSNET_ATTN_V: (
1494            "backbone.posnet.{bid}.v", # wavtokenizer
1495        ),
1496
1497        MODEL_TENSOR.POSNET_ATTN_OUT: (
1498            "backbone.posnet.{bid}.proj_out", # wavtokenizer
1499        ),
1500
1501        MODEL_TENSOR.SHORTCONV_CONV: (
1502            "model.layers.{bid}.conv.conv",
1503        ),
1504
1505        MODEL_TENSOR.SHORTCONV_INPROJ: (
1506            "model.layers.{bid}.conv.in_proj",
1507        ),
1508
1509        MODEL_TENSOR.SHORTCONV_OUTPROJ: (
1510            "model.layers.{bid}.conv.out_proj",
1511        ),
1512
1513        #############################################################################
1514        ## Vision encoder
1515
1516        MODEL_TENSOR.V_MMPROJ: (
1517            "aligner.w{bid}", # deepseek4v (w1 -> mm.1, w2 -> mm.2)
1518            "multi_modal_projector.linear_{bid}",
1519            "mm_projector.proj.linear_{bid}", # Kimi-K2.5
1520            "visual.merger.mlp.{bid}", # qwen2vl
1521            "mlp_AR.linear_{bid}", # PaddleOCR-VL
1522            "merger.mlp.{bid}",
1523            "vision_tower.merger.mlp.{bid}", # dots.ocr
1524            "vision_encoder.adapter.mlp.{bid}", # dots3note
1525            "vit.perceive.proj.{bid}", # HunyuanVL (proj.0 = conv1, proj.2 = conv2)
1526        ),
1527
1528        MODEL_TENSOR.V_MMPROJ_FC: (
1529            "model.connector.modality_projection.proj", # SmolVLM
1530            "model.vision.linear_proj.linear_proj", # cogvlm
1531            "model.projector.layers", # Deepseek-OCR
1532            "visual.merger.proj", # glm4v
1533            "vit.perceive.mlp", # HunyuanVL
1534        ),
1535
1536        MODEL_TENSOR.V_MMPROJ_MLP: (
1537            "model.mm_projector.mlp.mlp.{bid}",
1538            "vision_model.vision_adapter.mlp.fc{bid}", # llama 4
1539            "mlp1.{bid}", # InternVL
1540            "model.aligner.fc1.hidden_layers.{bid}", # Janus Pro
1541        ),
1542
1543        MODEL_TENSOR.V_MMPROJ_PEG: (
1544            "model.mm_projector.peg.peg.{bid}",
1545        ),
1546
1547        MODEL_TENSOR.V_ENC_EMBD_CLS: (
1548            "vision_tower.vision_model.embeddings.class_embedding",
1549            "model.vision_tower.embeddings.cls_token", # Intern-S1
1550            "vision_model.class_embedding", # llama 4
1551            "model.vision.patch_embedding.cls_embedding", # cogvlm
1552            "vision_model.radio_model.model.patch_generator.cls_token.token", # Nemotron Nano v2 VL
1553            "model.vision_model.embeddings.class_embedding", # Deepseek-OCR
1554        ),
1555
1556        MODEL_TENSOR.V_ENC_EMBD_PATCH: (
1557            "vision.patch_embed.proj", # deepseek4v
1558            "model.vision_tower.vision_model.embeddings.patch_embedding", # Granite4Vision
1559            "vision_tower.vision_model.embeddings.patch_embedding",
1560            "model.vision_tower.embeddings.patch_embedding", # minicpmv4_6
1561            "model.vision_tower.embeddings.patch_embeddings.projection", # Intern-S1
1562            "vpm.embeddings.patch_embedding",
1563            "model.vision_model.embeddings.patch_embedding", # SmolVLM
1564            "vit.embeddings.patch_embedding", # HunyuanVL
1565            "vision_tower.patch_conv", # pixtral-hf
1566            "vision_encoder.patch_conv", # pixtral
1567            "vision_model.patch_embedding.linear", # llama 4
1568            "visual.patch_embed.proj", # qwen2vl
1569            "vision_tower.patch_embed.proj", # kimi-vl
1570            "model.vision.patch_embedding.proj", # cogvlm
1571            "model.vision_model.embeddings.patch_embedding", # Deepseek-OCR CLIP
1572            "siglip2.vision_model.embeddings.patch_embedding",
1573            "vision_model.radio_model.model.patch_generator.embedder", # Nemotron Nano v2 VL
1574            "model.vision_tower.patch_embedder.input_proj", # gemma4
1575            "vision_tower.patch_embed.patchifier.proj", # dots.ocr
1576            "vision_encoder.patch_embed.proj", # dots3note
1577            "vision_model.conv1", # Step3-VL
1578            "model.vision_embedder.patch_dense", # gemma4 unified
1579            "model.vision_tower.patch_embedder.patch_embedding", # muse-glimmer
1580        ),
1581
1582        MODEL_TENSOR.V_ENC_EMBD_NORM: (
1583            "visual.post_conv_layernorm", # glm4v
1584            "vision_tower.patch_embed.patchifier.norm", # dots.ocr
1585            "vision_encoder.patch_embed.norm", # dots3note
1586        ),
1587
1588        MODEL_TENSOR.V_ENC_EMBD_PATCH_NORM: (
1589            "model.vision_embedder.patch_ln{bid}", # gemma4 unified
1590        ),
1591
1592        MODEL_TENSOR.V_ENC_EMBD_POS: (
1593            "model.vision_tower.vision_model.embeddings.position_embedding", # Granite4Vision
1594            "vision_tower.vision_model.embeddings.position_embedding",
1595            "model.vision_tower.embeddings.position_embedding", # minicpmv4_6
1596            "model.vision_tower.embeddings.position_embeddings", # Intern-S1
1597            "vpm.embeddings.position_embedding",
1598            "model.vision_model.embeddings.position_embedding", # SmolVLM
1599            "vit.embeddings.position_embedding", # HunyuanVL
1600            "vision_model.positional_embedding_vlm", # llama 4
1601            "vision_tower.patch_embed.pos_emb", # kimi-vl
1602            "visual.pos_embed", # qwen3vl
1603            "model.vision.patch_embedding.position_embedding", # cogvlm
1604            "visual.embeddings.position_embedding", # glm4v
1605            "vision_model.radio_model.model.patch_generator.pos_embed", # Nemotron Nano v2 VL
1606            "model.vision_tower.patch_embedder.position_embedding_table", # gemma4
1607            "vision_model.positional_embedding", # Step3-VL
1608            "model.vision_embedder.pos_embedding", # gemma4 unified
1609        ),
1610
1611        # TODO: I think these should all be moved to mapping_cfg?
1612        MODEL_TENSOR.V_ENC_EMBD_IMGNL: (
1613            "image_newline", # deepseek4v
1614            "model.image_newline",  # Deepseek-OCR, Granite4Vision
1615            "vit.perceive.image_newline", # HunyuanVL
1616        ),
1617
1618        MODEL_TENSOR.V_ENC_EMBD_VSEP: (
1619            "model.view_seperator",  # Deepseek-OCR
1620            "vit.perceive.image_sep", # HunyuanVL
1621        ),
1622
1623        MODEL_TENSOR.V_ENC_ATTN_QKV: (
1624            "vision.blocks.{bid}.attn.wqkv", # deepseek4v
1625            "visual.blocks.{bid}.attn.qkv", # qwen3vl
1626            "vision_tower.blocks.{bid}.attn.qkv", # dots.ocr
1627            "vision_encoder.blocks.{bid}.attn.qkv", # dots3note
1628            "model.vision.transformer.layers.{bid}.attention.query_key_value", # cogvlm
1629            "model.vision_model.transformer.layers.{bid}.self_attn.qkv_proj", # Deepseek-OCR CLIP
1630            "vision_tower.encoder.blocks.{bid}.wqkv", # Kimi-K2.5
1631            "vision_model.radio_model.model.blocks.{bid}.attn.qkv", # Nemotron Nano v2 VL
1632            "vision_model.transformer.resblocks.{bid}.attn.in_proj", # Step3-VL
1633        ),
1634
1635        MODEL_TENSOR.V_ENC_ATTN_Q: (
1636            "model.vision_tower.vision_model.encoder.layers.{bid}.self_attn.q_proj", # Granite4Vision
1637            "vision_tower.vision_model.encoder.layers.{bid}.self_attn.q_proj",
1638            "model.vision_tower.encoder.layers.{bid}.self_attn.q_proj", # minicpmv4_6
1639            "model.vision_tower.encoder.layer.{bid}.attention.q_proj", # Intern-S1
1640            "vpm.encoder.layers.{bid}.self_attn.q_proj",
1641            "model.vision_model.encoder.layers.{bid}.self_attn.q_proj", # SmolVLM
1642            "vit.layers.{bid}.self_attn.q_proj", # HunyuanVL
1643            "vision_model.model.layers.{bid}.self_attn.q_proj", # llama4
1644            "vision_tower.transformer.layers.{bid}.attention.q_proj", # pixtral-hf
1645            "vision_encoder.transformer.layers.{bid}.attention.wq", # pixtral
1646            "visual.blocks.{bid}.attn.q", # qwen2vl, generated
1647            "vision_tower.encoder.blocks.{bid}.wq", # kimi-vl, generated
1648            "siglip2.vision_model.encoder.layers.{bid}.self_attn.q_proj", # youtuvl
1649            "model.vision_model.transformer.layers.{bid}.self_attn.q_proj", # Deepseek-OCR CLIP, generated
1650            "vision_model.model.layers.{bid}.self_attn.q_proj.linear", # gemma4
1651            "model.qwen2_model.model.model.layers.{bid}.self_attn.q_proj", # Deepseek-OCR-2 qwen2
1652            "model.vision_tower.layers.{bid}.attn.q_proj", # muse-glimmer
1653        ),
1654
1655        MODEL_TENSOR.V_ENC_ATTN_Q_NORM: (
1656            "vision_encoder.blocks.{bid}.attn.q_norm", # dots3note
1657            "vision_tower.vision_model.encoder.layers.{bid}.attn.q_norm", # InternVL
1658            "model.vision_tower.encoder.layer.{bid}.attention.q_norm", # Intern-S1
1659            "visual.blocks.{bid}.attn.q_norm", # GLM-OCR
1660            "vision_model.model.layers.{bid}.self_attn.q_norm", # gemma4
1661        ),
1662
1663        MODEL_TENSOR.V_ENC_ATTN_K: (
1664            "model.vision_tower.vision_model.encoder.layers.{bid}.self_attn.k_proj", # Granite4Vision
1665            "vision_tower.vision_model.encoder.layers.{bid}.self_attn.k_proj",
1666            "model.vision_tower.encoder.layers.{bid}.self_attn.k_proj", # minicpmv4_6
1667            "model.vision_tower.encoder.layer.{bid}.attention.k_proj", # Intern-S1
1668            "vpm.encoder.layers.{bid}.self_attn.k_proj",
1669            "model.vision_model.encoder.layers.{bid}.self_attn.k_proj", # SmolVLM
1670            "vit.layers.{bid}.self_attn.k_proj", # HunyuanVL
1671            "vision_model.model.layers.{bid}.self_attn.k_proj", # llama4
1672            "vision_tower.transformer.layers.{bid}.attention.k_proj", # pixtral-hf
1673            "vision_encoder.transformer.layers.{bid}.attention.wk", # pixtral
1674            "visual.blocks.{bid}.attn.k", # qwen2vl, generated
1675            "vision_tower.encoder.blocks.{bid}.wk", # kimi-vl, generated
1676            "model.vision_model.transformer.layers.{bid}.self_attn.k_proj", # Deepseek-OCR CLIP, generated
1677            "siglip2.vision_model.encoder.layers.{bid}.self_attn.k_proj",
1678            "vision_model.model.layers.{bid}.self_attn.k_proj.linear", # gemma4
1679            "model.qwen2_model.model.model.layers.{bid}.self_attn.k_proj", # Deepseek-OCR-2 qwen2
1680            "model.vision_tower.layers.{bid}.attn.k_proj", # muse-glimmer
1681        ),
1682
1683        MODEL_TENSOR.V_ENC_ATTN_K_NORM: (
1684            "vision_encoder.blocks.{bid}.attn.k_norm", # dots3note
1685            "vision_tower.vision_model.encoder.layers.{bid}.attn.k_norm", # InternVL
1686            "model.vision_tower.encoder.layer.{bid}.attention.k_norm", # Intern-S1
1687            "visual.blocks.{bid}.attn.k_norm", # GLM-OCR
1688            "vision_model.model.layers.{bid}.self_attn.k_norm", # gemma4
1689        ),
1690
1691        MODEL_TENSOR.V_ENC_ATTN_V: (
1692            "model.vision_tower.vision_model.encoder.layers.{bid}.self_attn.v_proj", # Granite4Vision
1693            "vision_tower.vision_model.encoder.layers.{bid}.self_attn.v_proj",
1694            "model.vision_tower.encoder.layers.{bid}.self_attn.v_proj", # minicpmv4_6
1695            "model.vision_tower.encoder.layer.{bid}.attention.v_proj", # Intern-S1
1696            "vpm.encoder.layers.{bid}.self_attn.v_proj",
1697            "model.vision_model.encoder.layers.{bid}.self_attn.v_proj", # SmolVLM
1698            "vit.layers.{bid}.self_attn.v_proj", # HunyuanVL
1699            "vision_model.model.layers.{bid}.self_attn.v_proj", # llama4
1700            "vision_tower.transformer.layers.{bid}.attention.v_proj", # pixtral-hf
1701            "vision_encoder.transformer.layers.{bid}.attention.wv", # pixtral
1702            "visual.blocks.{bid}.attn.v", # qwen2vl, generated
1703            "vision_tower.encoder.blocks.{bid}.wv", # kimi-vl, generated
1704            "siglip2.vision_model.encoder.layers.{bid}.self_attn.v_proj",
1705            "model.vision_model.transformer.layers.{bid}.self_attn.v_proj", # Deepseek-OCR CLIP, generated
1706            "vision_model.model.layers.{bid}.self_attn.v_proj.linear", # gemma4
1707            "model.qwen2_model.model.model.layers.{bid}.self_attn.v_proj", # Deepseek-OCR-2 qwen2
1708            "model.vision_tower.layers.{bid}.attn.v_proj", # muse-glimmer
1709        ),
1710
1711        MODEL_TENSOR.V_ENC_INPUT_NORM: (
1712            "vision.blocks.{bid}.norm1", # deepseek4v
1713            "model.vision_tower.vision_model.encoder.layers.{bid}.layer_norm1", # Granite4Vision
1714            "vision_tower.vision_model.encoder.layers.{bid}.layer_norm1",
1715            "model.vision_tower.encoder.layers.{bid}.layer_norm1", # minicpmv4_6
1716            "vision_tower.vision_model.encoder.layers.{bid}.norm1", # InternVL
1717            "model.vision_tower.encoder.layer.{bid}.layernorm_before", # Intern-S1
1718            "vpm.encoder.layers.{bid}.layer_norm1",
1719            "model.vision_model.encoder.layers.{bid}.layer_norm1", # SmolVLM
1720            "vit.layers.{bid}.input_layernorm", # HunyuanVL
1721            "vision_tower.transformer.layers.{bid}.attention_norm", # pixtral-hf
1722            "vision_encoder.transformer.layers.{bid}.attention_norm", # pixtral
1723            "vision_model.model.layers.{bid}.input_layernorm", # llama4, gemma4
1724            "visual.blocks.{bid}.norm1", # qwen2vl
1725            "vision_tower.encoder.blocks.{bid}.norm0", # kimi-vl (norm0/norm1)
1726            "model.vision.transformer.layers.{bid}.input_layernorm", # cogvlm
1727            "model.vision_model.transformer.layers.{bid}.layer_norm1", # Deepseek-OCR CLIP
1728            "siglip2.vision_model.encoder.layers.{bid}.layer_norm1",
1729            "vision_model.radio_model.model.blocks.{bid}.norm1", # Nemotron Nano v2 VL
1730            "vision_tower.blocks.{bid}.norm1", # dots.ocr
1731            "vision_encoder.blocks.{bid}.norm_1", # dots3note
1732            "vision_model.transformer.resblocks.{bid}.ln_1", # Step3-VL
1733            "model.qwen2_model.model.model.layers.{bid}.input_layernorm", # Deepseek-OCR-2 qwen2
1734            "model.vision_tower.layers.{bid}.norm1", # muse-glimmer
1735        ),
1736
1737        MODEL_TENSOR.V_ENC_ATTN_O: (
1738            "vision.blocks.{bid}.attn.wo", # deepseek4v
1739            "model.vision_tower.vision_model.encoder.layers.{bid}.self_attn.out_proj", # Granite4Vision
1740            "vision_tower.vision_model.encoder.layers.{bid}.self_attn.out_proj",
1741            "model.vision_tower.encoder.layers.{bid}.self_attn.out_proj", # minicpmv4_6
1742            "vision_tower.vision_model.encoder.layers.{bid}.attn.proj", # InternVL
1743            "model.vision_tower.encoder.layer.{bid}.attention.projection_layer", # Intern-S1
1744            "vpm.encoder.layers.{bid}.self_attn.out_proj",
1745            "model.vision_model.encoder.layers.{bid}.self_attn.out_proj", # SmolVLM
1746            "vit.layers.{bid}.self_attn.o_proj", # HunyuanVL
1747            "model.vision_model.encoder.layers.{bid}.self_attn.projection_layer", # Janus Pro
1748            "vision_model.model.layers.{bid}.self_attn.o_proj", # llama4
1749            "vision_tower.transformer.layers.{bid}.attention.o_proj", # pixtral-hf
1750            "vision_encoder.transformer.layers.{bid}.attention.wo", # pixtral
1751            "visual.blocks.{bid}.attn.proj", # qwen2vl
1752            "vision_tower.encoder.blocks.{bid}.wo", # kimi-vl
1753            "model.vision.transformer.layers.{bid}.attention.dense", # cogvlm
1754            "model.vision_model.transformer.layers.{bid}.self_attn.out_proj", # Deepseek-OCR CLIP
1755            "siglip2.vision_model.encoder.layers.{bid}.self_attn.out_proj", # youtuvl
1756            "vision_model.radio_model.model.blocks.{bid}.attn.proj", # Nemotron Nano v2 VL
1757            "model.qwen2_model.model.model.layers.{bid}.self_attn.o_proj", # Deepseek-OCR-2 qwen2
1758            "vision_model.model.layers.{bid}.self_attn.o_proj.linear", # gemma4
1759            "vision_tower.blocks.{bid}.attn.proj", # dots.ocr
1760            "vision_encoder.blocks.{bid}.attn.proj", # dots3note
1761            "vision_model.transformer.resblocks.{bid}.attn.out_proj", # Step3-VL
1762            "model.vision_tower.layers.{bid}.attn.proj", # muse-glimmer
1763        ),
1764
1765        MODEL_TENSOR.V_ENC_ATTN_SINKS: (
1766            "visual.blocks.{bid}.attn.sinks", # mimovl
1767        ),
1768
1769        MODEL_TENSOR.V_ENC_POST_ATTN_NORM: (
1770            "vision.blocks.{bid}.norm2", # deepseek4v
1771            "model.vision_tower.vision_model.encoder.layers.{bid}.layer_norm2", # Granite4Vision
1772            "vision_tower.vision_model.encoder.layers.{bid}.layer_norm2",
1773            "model.vision_tower.encoder.layers.{bid}.layer_norm2", # minicpmv4_6
1774            "vision_tower.vision_model.encoder.layers.{bid}.norm2", # InternVL
1775            "model.vision_tower.encoder.layer.{bid}.layernorm_after", # Intern-S1
1776            "vpm.encoder.layers.{bid}.layer_norm2",
1777            "model.vision_model.encoder.layers.{bid}.layer_norm2", # SmolVLM
1778            "vit.layers.{bid}.post_attention_layernorm", # HunyuanVL
1779            "vision_model.model.layers.{bid}.post_attention_layernorm", # llama4
1780            "vision_tower.transformer.layers.{bid}.ffn_norm", # pixtral-hf
1781            "vision_encoder.transformer.layers.{bid}.ffn_norm", # pixtral
1782            "visual.blocks.{bid}.norm2", # qwen2vl
1783            "vision_tower.encoder.blocks.{bid}.norm1", # kimi-vl (norm0/norm1)
1784            "model.vision.transformer.layers.{bid}.post_attention_layernorm", # cogvlm
1785            "model.vision_model.transformer.layers.{bid}.layer_norm2", # Deepseek-OCR CLIP
1786            "siglip2.vision_model.encoder.layers.{bid}.layer_norm2",
1787            "vision_model.radio_model.model.blocks.{bid}.norm2", # Nemotron Nano v2 VL
1788            "vision_model.model.layers.{bid}.pre_feedforward_layernorm", # gemma4
1789            "vision_tower.blocks.{bid}.norm2", # dots.ocr
1790            "vision_encoder.blocks.{bid}.norm_2", # dots3note
1791            "vision_model.transformer.resblocks.{bid}.ln_2", # Step3-VL
1792            "model.qwen2_model.model.model.layers.{bid}.post_attention_layernorm", # Deepseek-OCR-2 qwen2
1793            "model.vision_tower.layers.{bid}.norm2", # muse-glimmer
1794        ),
1795
1796        MODEL_TENSOR.V_ENC_FFN_UP: (
1797            "vision.blocks.{bid}.mlp.w1_up", # deepseek4v (split from fused w1)
1798            "vision_encoder.blocks.{bid}.mlp.fc3", # dots3note
1799            "model.vision_tower.vision_model.encoder.layers.{bid}.mlp.fc1", # Granite4Vision
1800            "vision_tower.vision_model.encoder.layers.{bid}.mlp.fc1",
1801            "model.vision_tower.encoder.layers.{bid}.mlp.fc1", # minicpmv4_6
1802            "model.vision_tower.encoder.layer.{bid}.mlp.fc1", # Intern-S1
1803            "vpm.encoder.layers.{bid}.mlp.fc1",
1804            "model.vision_model.encoder.layers.{bid}.mlp.fc1", # SmolVLM, gemma3
1805            "vit.layers.{bid}.mlp.dense_h_to_4h", # HunyuanVL
1806            "vision_tower.transformer.layers.{bid}.feed_forward.up_proj", # pixtral-hf
1807            "vision_encoder.transformer.layers.{bid}.feed_forward.w3", # pixtral
1808            "vision_model.model.layers.{bid}.mlp.fc1", # llama4
1809            "visual.blocks.{bid}.mlp.fc1", # qwen2vl
1810            "visual.blocks.{bid}.mlp.up_proj", # qwen2.5vl
1811            "visual.blocks.{bid}.mlp.linear_fc1", # qwen3vl
1812            "vision_tower.encoder.blocks.{bid}.mlp.fc0", # kimi-vl (fc0/fc1)
1813            "model.vision_model.transformer.layers.{bid}.mlp.fc1", # Deepseek-OCR CLIP
1814            "model.vision.transformer.layers.{bid}.mlp.fc1", # cogvlm
1815            "siglip2.vision_model.encoder.layers.{bid}.mlp.fc1",
1816            "vision_model.radio_model.model.blocks.{bid}.mlp.fc1", # Nemotron Nano v2 VL
1817            "vision_model.model.layers.{bid}.mlp.up_proj", # gemma4
1818            "vision_model.transformer.resblocks.{bid}.mlp.c_fc", # Step3-VL
1819            "model.qwen2_model.model.model.layers.{bid}.mlp.up_proj", # Deepseek-OCR-2 qwen2
1820            "model.vision_tower.layers.{bid}.mlp.fc1", # muse-glimmer
1821        ),
1822
1823        MODEL_TENSOR.V_ENC_FFN_GATE: (
1824            "vision.blocks.{bid}.mlp.w1_gate", # deepseek4v (split from fused w1)
1825            "vision_encoder.blocks.{bid}.mlp.fc1", # dots3note
1826            "vision_tower.transformer.layers.{bid}.feed_forward.gate_proj", # pixtral-hf
1827            "vision_encoder.transformer.layers.{bid}.feed_forward.w1", # pixtral
1828            "visual.blocks.{bid}.mlp.gate_proj", # qwen2.5vl
1829            "vision_model.model.layers.{bid}.mlp.gate_proj", # gemma4
1830            "model.qwen2_model.model.model.layers.{bid}.mlp.gate_proj", # Deepseek-OCR-2 qwen2
1831        ),
1832
1833        MODEL_TENSOR.V_ENC_FFN_DOWN: (
1834            "vision.blocks.{bid}.mlp.w2", # deepseek4v
1835            "vision_encoder.blocks.{bid}.mlp.fc2", # dots3note
1836            "model.vision_tower.vision_model.encoder.layers.{bid}.mlp.fc2", # Granite4Vision
1837            "vision_tower.vision_model.encoder.layers.{bid}.mlp.fc2",
1838            "model.vision_tower.encoder.layers.{bid}.mlp.fc2", # minicpmv4_6
1839            "model.vision_tower.encoder.layer.{bid}.mlp.fc2", # Intern-S1
1840            "vpm.encoder.layers.{bid}.mlp.fc2",
1841            "model.vision_model.encoder.layers.{bid}.mlp.fc2", # SmolVLM, gemma3
1842            "vit.layers.{bid}.mlp.dense_4h_to_h", # HunyuanVL
1843            "vision_tower.transformer.layers.{bid}.feed_forward.down_proj", # pixtral-hf
1844            "vision_encoder.transformer.layers.{bid}.feed_forward.w2", # pixtral
1845            "vision_model.model.layers.{bid}.mlp.fc2", # llama4
1846            "visual.blocks.{bid}.mlp.fc2", # qwen2vl
1847            "visual.blocks.{bid}.mlp.down_proj", # qwen2.5vl
1848            "visual.blocks.{bid}.mlp.linear_fc2", # qwen3vl
1849            "vision_tower.encoder.blocks.{bid}.mlp.fc1", # kimi-vl (fc0/fc1)
1850            "model.vision.transformer.layers.{bid}.mlp.fc2", # cogvlm
1851            "model.vision_model.transformer.layers.{bid}.mlp.fc2", # Deepseek-OCR CLIP
1852            "siglip2.vision_model.encoder.layers.{bid}.mlp.fc2",
1853            "vision_model.radio_model.model.blocks.{bid}.mlp.fc2", # Nemotron Nano v2 VL
1854            "model.qwen2_model.model.model.layers.{bid}.mlp.down_proj" , # Deepseek-OCR-2 qwen2
1855            "vision_model.model.layers.{bid}.mlp.down_proj", # gemma4
1856            "vision_model.transformer.resblocks.{bid}.mlp.c_proj", # Step3-VL
1857            "model.vision_tower.layers.{bid}.mlp.fc2", # muse-glimmer
1858        ),
1859
1860
1861        MODEL_TENSOR.V_ENC_FFN_GATE_INP: (
1862            "vision_encoder.blocks.{bid}.mlp.gate_weight", # dots3note
1863        ),
1864
1865        MODEL_TENSOR.V_ENC_FFN_EXP_PROBS_B: (
1866            "vision_encoder.blocks.{bid}.mlp.router_bias", # dots3note
1867        ),
1868
1869        # note: expert weights are stacked into a single 3D tensor in conversion code,
1870        # which emits the pseudo-names below
1871        MODEL_TENSOR.V_ENC_FFN_GATE_EXPS: (
1872            "vision_encoder.blocks.{bid}.mlp.experts.fc1", # dots3note
1873        ),
1874
1875        MODEL_TENSOR.V_ENC_FFN_UP_EXPS: (
1876            "vision_encoder.blocks.{bid}.mlp.experts.fc3", # dots3note
1877        ),
1878
1879        MODEL_TENSOR.V_ENC_FFN_DOWN_EXPS: (
1880            "vision_encoder.blocks.{bid}.mlp.experts.fc2", # dots3note
1881        ),
1882
1883        MODEL_TENSOR.V_ENC_ATTN_POST_NORM: (
1884            "vision_model.model.layers.{bid}.post_attention_layernorm", # gemma4
1885        ),
1886
1887        MODEL_TENSOR.V_ENC_FFN_POST_NORM: (
1888            "vision_model.model.layers.{bid}.post_feedforward_layernorm", # gemma4
1889        ),
1890
1891        MODEL_TENSOR.V_LAYER_SCALE_1: (
1892            "vision_tower.vision_model.encoder.layers.{bid}.ls1", # InternVL
1893            "model.vision_tower.encoder.layer.{bid}.lambda_1", # Intern-S1
1894            "vision_model.transformer.resblocks.{bid}.ls_1", # Step3-VL
1895        ),
1896
1897        MODEL_TENSOR.V_LAYER_SCALE_2: (
1898            "vision_tower.vision_model.encoder.layers.{bid}.ls2", # InternVL
1899            "model.vision_tower.encoder.layer.{bid}.lambda_2", # Intern-S1
1900            "vision_model.transformer.resblocks.{bid}.ls_2", # Step3-VL
1901        ),
1902
1903        MODEL_TENSOR.V_LAYER_OUT_SCALE: (
1904            "vision_model.model.layers.{bid}.layer_scalar", # gemma4
1905        ),
1906
1907        MODEL_TENSOR.V_PRE_NORM: (
1908            "vision_tower.vision_model.pre_layrnorm",
1909            "vision_tower.ln_pre", # pixtral-hf
1910            "vision_encoder.ln_pre", # pixtral
1911            "vision_model.layernorm_pre", # llama4
1912            "model.vision_model.pre_layrnorm", # Deepseek-OCR CLIP
1913            "vision_tower.patch_embed.patchifier.norm", # dots.ocr
1914            "vision_encoder.patch_embed.norm", # dots3note
1915            "vision_model.ln_pre", # Step3-VL
1916            "model.vision_tower.ln_pre", # muse-glimmer
1917        ),
1918
1919        MODEL_TENSOR.V_POST_NORM: (
1920            "vision.norm", # deepseek4v
1921            "model.vision_tower.vision_model.post_layernorm", # Granite4Vision
1922            "vision_tower.vision_model.post_layernorm",
1923            "model.vision_tower.post_layernorm", # minicpmv4_6
1924            "model.vision_model.post_layernorm", # SmolVLM
1925            "vision_model.layernorm_post", # llama4
1926            "visual.merger.ln_q", # qwen2vl
1927            "vision_tower.encoder.final_layernorm", # kimi-vl
1928            "visual.post_layernorm", # glm4v
1929            "siglip2.vision_model.post_layernorm",
1930            "model.qwen2_model.model.model.norm", # Deepseek-OCR-2 qwen2
1931            "model.vision_tower.ln_post", # muse-glimmer
1932        ),
1933
1934        MODEL_TENSOR.V_MM_POST_NORM: (
1935            "visual.merger.post_projection_norm", # glm4v
1936            "vision_tower.post_trunk_norm", # dots.ocr
1937            "vision_encoder.post_trunk_norm", # dots3note
1938            "vit.perceive.after_rms", # HunyuanVL
1939        ),
1940
1941        MODEL_TENSOR.V_MM_INP_PROJ: (
1942            "multi_modal_projector.mm_input_projection",
1943        ),
1944
1945        MODEL_TENSOR.V_MM_INP_NORM: (
1946            "multi_modal_projector.norm",
1947            "multi_modal_projector.layer_norm",
1948            "multi_modal_projector.pre_norm",
1949            "mm_projector.pre_norm", # Kimi-K2.5
1950            "pre_mm_projector_norm",
1951            "model.vision.linear_proj.norm1", # cogvlm
1952            "mlp_AR.pre_norm", # PaddleOCR-VL
1953            "merger.ln_q",
1954            "vision_tower.merger.ln_q", # dots.ocr
1955            "vision_encoder.adapter.ln_q", # dots3note
1956            "model.merger.mlp.0.pre_norm", # minicpmv4_6
1957        ),
1958
1959        MODEL_TENSOR.V_MM_SOFT_EMB_NORM: (
1960            "multi_modal_projector.mm_soft_emb_norm",
1961        ),
1962
1963        MODEL_TENSOR.V_RESMPL_POS_EMBD_K: (
1964            "resampler.pos_embed_k",
1965        ),
1966
1967        MODEL_TENSOR.V_RESMPL_ATTN_Q: (
1968            "resampler.attn.in_proj_q", # tensor generated from resampler.attn.in_proj
1969        ),
1970
1971        MODEL_TENSOR.V_RESMPL_ATTN_K: (
1972            "resampler.attn.in_proj_k", # tensor generated from resampler.attn.in_proj
1973        ),
1974
1975        MODEL_TENSOR.V_RESMPL_ATTN_V: (
1976            "resampler.attn.in_proj_v", # tensor generated from resampler.attn.in_proj
1977        ),
1978
1979        MODEL_TENSOR.V_RESMPL_ATTN_OUT: (
1980            "resampler.attn.out_proj",
1981            "model.vision_model.head.attention.out_proj",
1982        ),
1983
1984        MODEL_TENSOR.V_RESMPL_KV: (
1985            "resampler.kv_proj",
1986        ),
1987
1988        MODEL_TENSOR.V_RESMPL_POST_NORM: (
1989            "resampler.ln_post",
1990        ),
1991
1992        MODEL_TENSOR.V_RESMPL_KV_NORM: (
1993            "resampler.ln_kv",
1994        ),
1995
1996        MODEL_TENSOR.V_RESMPL_Q_NORM: (
1997            "resampler.ln_q",
1998        ),
1999
2000        MODEL_TENSOR.V_RESMPL_PROJ: (
2001            "resampler.proj",
2002        ),
2003
2004        MODEL_TENSOR.V_RESMPL_QUERY: (
2005            "resampler.query",
2006        ),
2007
2008        MODEL_TENSOR.V_TOK_EMBD_IMG_BREAK: (
2009            "v.token_embd.img_break", # for pixtral, this is a generated vector
2010        ),
2011
2012        MODEL_TENSOR.V_TOK_EMBD_IMG_START: (
2013            "image_start", # deepseek4v
2014        ),
2015
2016        MODEL_TENSOR.V_TOK_EMBD_IMG_END: (
2017            "image_end", # deepseek4v
2018        ),
2019
2020        MODEL_TENSOR.V_TOK_EMBD_IMG_PAD: (
2021            "image_pad", # deepseek4v
2022        ),
2023
2024        MODEL_TENSOR.V_MM_PATCH_MERGER: (
2025            "multi_modal_projector.patch_merger.merging_layer", # mistral small 3.1 - hf
2026            "patch_merger.merging_layer", # mistral
2027            "visual.downsample", # glm4v
2028        ),
2029
2030        MODEL_TENSOR.V_MM_MERGER_FC1: (
2031            "patch_merge_mlp.linear_1", # minimax-m3
2032        ),
2033
2034        MODEL_TENSOR.V_MM_MERGER_FC2: (
2035            "patch_merge_mlp.linear_2", # minimax-m3
2036        ),
2037
2038        MODEL_TENSOR.V_DS_NORM: (
2039            "model.visual.deepstack_merger_list.{bid}.norm", # deepstack in qwen3vl
2040        ),
2041
2042        MODEL_TENSOR.V_DS_FC1: (
2043            "model.visual.deepstack_merger_list.{bid}.linear_fc1", # deepstack in qwen3vl
2044        ),
2045
2046        MODEL_TENSOR.V_DS_FC2: (
2047            "model.visual.deepstack_merger_list.{bid}.linear_fc2", # deepstack in qwen3vl
2048        ),
2049
2050        MODEL_TENSOR.V_MERGER_LN1: (
2051            "model.vision_tower.vit_merger.layer_norm1", # minicpmv4_6
2052        ),
2053
2054        MODEL_TENSOR.V_MERGER_ATTN_Q: (
2055            "model.vision_tower.vit_merger.self_attn.q_proj", # minicpmv4_6
2056        ),
2057
2058        MODEL_TENSOR.V_MERGER_ATTN_K: (
2059            "model.vision_tower.vit_merger.self_attn.k_proj", # minicpmv4_6
2060        ),
2061
2062        MODEL_TENSOR.V_MERGER_ATTN_V: (
2063            "model.vision_tower.vit_merger.self_attn.v_proj", # minicpmv4_6
2064        ),
2065
2066        MODEL_TENSOR.V_MERGER_ATTN_O: (
2067            "model.vision_tower.vit_merger.self_attn.out_proj", # minicpmv4_6
2068        ),
2069
2070        MODEL_TENSOR.V_MERGER_DS_LN: (
2071            "model.vision_tower.vit_merger.pre_norm", # minicpmv4_6
2072        ),
2073
2074        MODEL_TENSOR.V_MERGER_DS_UP: (
2075            "model.vision_tower.vit_merger.linear_1", # minicpmv4_6
2076        ),
2077
2078        MODEL_TENSOR.V_MERGER_DS_DOWN: (
2079            "model.vision_tower.vit_merger.linear_2", # minicpmv4_6
2080        ),
2081
2082        MODEL_TENSOR.V_SAM_POS_EMBD: (
2083            "model.sam_model.pos_embed",
2084        ),
2085
2086        MODEL_TENSOR.V_SAM_PATCH_EMBD: (
2087            "model.sam_model.patch_embed.proj",
2088        ),
2089
2090        MODEL_TENSOR.V_SAM_PRE_NORM: (
2091            "model.sam_model.blocks.{bid}.norm1", # deepstack in qwen3vl
2092        ),
2093
2094        MODEL_TENSOR.V_SAM_POST_NORM: (
2095            "model.sam_model.blocks.{bid}.norm2", # deepstack in qwen3vl
2096        ),
2097
2098        MODEL_TENSOR.V_SAM_ATTN_POS_H: (
2099            "model.sam_model.blocks.{bid}.attn.rel_pos_h",
2100        ),
2101
2102        MODEL_TENSOR.V_SAM_ATTN_POS_W: (
2103            "model.sam_model.blocks.{bid}.attn.rel_pos_w",
2104        ),
2105
2106        MODEL_TENSOR.V_SAM_ATTN_QKV: (
2107            "model.sam_model.blocks.{bid}.attn.qkv",
2108        ),
2109
2110        MODEL_TENSOR.V_SAM_ATTN_OUT: (
2111            "model.sam_model.blocks.{bid}.attn.proj",
2112        ),
2113
2114        MODEL_TENSOR.V_SAM_MLP_LIN_1: (
2115            "model.sam_model.blocks.{bid}.mlp.lin1",
2116        ),
2117
2118        MODEL_TENSOR.V_SAM_MLP_LIN_2: (
2119            "model.sam_model.blocks.{bid}.mlp.lin2",
2120        ),
2121
2122        MODEL_TENSOR.V_SAM_NECK: (
2123            "model.sam_model.neck.{bid}",
2124        ),
2125
2126        MODEL_TENSOR.V_SAM_NET_2: (
2127            "model.sam_model.net_2",
2128        ),
2129
2130        MODEL_TENSOR.V_SAM_NET_3: (
2131            "model.sam_model.net_3",
2132        ),
2133
2134        MODEL_TENSOR.V_RESMPL_QUERY_768: (
2135            "model.qwen2_model.query_768", # Deepseek-OCR-2 qwen2
2136        ),
2137
2138        MODEL_TENSOR.V_RESMPL_QUERY_1024: (
2139            "model.qwen2_model.query_1024", # Deepseek-OCR-2 qwen2
2140        ),
2141
2142        MODEL_TENSOR.V_MM_POST_FC_NORM: (
2143            "model.vision.linear_proj.norm1", # cogvlm
2144        ),
2145
2146        MODEL_TENSOR.V_MM_UP: (
2147            "model.vision.linear_proj.dense_h_to_4h", # cogvlm
2148            "visual.merger.up_proj", # glm4v
2149            "model.merger.mlp.0.linear_1", # minicpmv4_6
2150        ),
2151
2152        MODEL_TENSOR.V_MM_DOWN: (
2153            "model.vision.linear_proj.dense_4h_to_h", # cogvlm
2154            "visual.merger.down_proj", # glm4v
2155            "model.merger.mlp.0.linear_2", # minicpmv4_6
2156        ),
2157
2158        MODEL_TENSOR.V_MM_GATE: (
2159            "model.vision.linear_proj.gate_proj", # cogvlm
2160            "visual.merger.gate_proj", # glm4v
2161        ),
2162
2163        MODEL_TENSOR.V_TOK_BOI: (
2164            "model.vision.boi", # cogvlm
2165        ),
2166
2167        MODEL_TENSOR.V_TOK_EOI: (
2168            "model.vision.eoi", # cogvlm
2169        ),
2170
2171        MODEL_TENSOR.V_MM_PRE_NORM: (
2172            "vit.perceive.before_rms", # HunyuanVL
2173        ),
2174
2175        MODEL_TENSOR.V_TOK_IMG_BEGIN: (
2176            "vit.perceive.image_begin", # HunyuanVL
2177        ),
2178
2179        MODEL_TENSOR.V_TOK_IMG_END: (
2180            "vit.perceive.image_end", # HunyuanVL
2181        ),
2182
2183        MODEL_TENSOR.V_STD_BIAS: (
2184            "model.vision_tower.std_bias", # gemma4
2185        ),
2186
2187        MODEL_TENSOR.V_STD_SCALE: (
2188            "model.vision_tower.std_scale", # gemma4
2189        ),
2190
2191        # For these tensors, bid => projector ID
2192        MODEL_TENSOR.V_MULTI_PROJ_IMG_POS: (
2193            "model.layerwise_projectors.{bid}.image_positions", # Granite4 Vision
2194            "model.spatial_projectors.{bid}.image_positions",   # Granite4 Vision
2195        ),
2196        MODEL_TENSOR.V_MULTI_PROJ_QUERY: (
2197            "model.layerwise_projectors.{bid}.query", # Granite4 Vision
2198            "model.spatial_projectors.{bid}.query",   # Granite4 Vision
2199        ),
2200        MODEL_TENSOR.V_MULTI_PROJ_LINEAR: (
2201            "model.layerwise_projectors.{bid}.out_linear", # Granite4 Vision
2202            "model.spatial_projectors.{bid}.out_linear",   # Granite4 Vision
2203        ),
2204        MODEL_TENSOR.V_MULTI_PROJ_NORM: (
2205            "model.layerwise_projectors.{bid}.norm", # Granite4 Vision
2206            "model.spatial_projectors.{bid}.norm",   # Granite4 Vision
2207        ),
2208        MODEL_TENSOR.V_MULTI_PROJ_POST_NORM: (
2209            "model.layerwise_projectors.{bid}.qformer.layernorm", # Granite4 Vision
2210            "model.spatial_projectors.{bid}.qformer.layernorm",   # Granite4 Vision
2211        ),
2212
2213        # For these tensors, bid => proj-id
2214        MODEL_TENSOR.V_QF_SELF_ATTN_Q: (
2215            "model.layerwise_projectors.qformer.encoder.layer.{bid}.attention.attention.query", # Granite4 Vision
2216            "model.spatial_projectors.qformer.encoder.layer.{bid}.attention.attention.query",   # Granite4 Vision
2217        ),
2218        MODEL_TENSOR.V_QF_SELF_ATTN_K: (
2219            "model.layerwise_projectors.qformer.encoder.layer.{bid}.attention.attention.key", # Granite4 Vision
2220            "model.spatial_projectors.qformer.encoder.layer.{bid}.attention.attention.key",   # Granite4 Vision
2221        ),
2222        MODEL_TENSOR.V_QF_SELF_ATTN_V: (
2223            "model.layerwise_projectors.qformer.encoder.layer.{bid}.attention.attention.value", # Granite4 Vision
2224            "model.spatial_projectors.qformer.encoder.layer.{bid}.attention.attention.value",   # Granite4 Vision
2225        ),
2226        MODEL_TENSOR.V_QF_SELF_ATTN_O: (
2227            "model.layerwise_projectors.qformer.encoder.layer.{bid}.attention.output.dense", # Granite4 Vision
2228            "model.spatial_projectors.qformer.encoder.layer.{bid}.attention.output.dense",   # Granite4 Vision
2229        ),
2230        MODEL_TENSOR.V_QF_SELF_ATTN_NORM: (
2231            "model.layerwise_projectors.qformer.encoder.layer.{bid}.attention.output.LayerNorm", # Granite4 Vision
2232            "model.spatial_projectors.qformer.encoder.layer.{bid}.attention.output.LayerNorm",   # Granite4 Vision
2233        ),
2234        MODEL_TENSOR.V_QF_CROSS_ATTN_Q: (
2235            "model.layerwise_projectors.qformer.encoder.layer.{bid}.crossattention.attention.query", # Granite4 Vision
2236            "model.spatial_projectors.qformer.encoder.layer.{bid}.crossattention.attention.query",   # Granite4 Vision
2237        ),
2238        MODEL_TENSOR.V_QF_CROSS_ATTN_K: (
2239            "model.layerwise_projectors.qformer.encoder.layer.{bid}.crossattention.attention.key", # Granite4 Vision
2240            "model.spatial_projectors.qformer.encoder.layer.{bid}.crossattention.attention.key",   # Granite4 Vision
2241        ),
2242        MODEL_TENSOR.V_QF_CROSS_ATTN_V: (
2243            "model.layerwise_projectors.qformer.encoder.layer.{bid}.crossattention.attention.value", # Granite4 Vision
2244            "model.spatial_projectors.qformer.encoder.layer.{bid}.crossattention.attention.value",   # Granite4 Vision
2245        ),
2246        MODEL_TENSOR.V_QF_CROSS_ATTN_O: (
2247            "model.layerwise_projectors.qformer.encoder.layer.{bid}.crossattention.output.dense", # Granite4 Vision
2248            "model.spatial_projectors.qformer.encoder.layer.{bid}.crossattention.output.dense",   # Granite4 Vision
2249        ),
2250        MODEL_TENSOR.V_QF_CROSS_ATTN_NORM: (
2251            "model.layerwise_projectors.qformer.encoder.layer.{bid}.crossattention.output.LayerNorm", # Granite4 Vision
2252            "model.spatial_projectors.qformer.encoder.layer.{bid}.crossattention.output.LayerNorm",   # Granite4 Vision
2253        ),
2254        MODEL_TENSOR.V_QF_FFN_UP: (
2255            "model.layerwise_projectors.qformer.encoder.layer.{bid}.intermediate_query.dense", # Granite4 Vision
2256            "model.spatial_projectors.qformer.encoder.layer.{bid}.intermediate_query.dense",   # Granite4 Vision
2257        ),
2258        MODEL_TENSOR.V_QF_FFN_DOWN: (
2259            "model.layerwise_projectors.qformer.encoder.layer.{bid}.output_query.dense", # Granite4 Vision
2260            "model.spatial_projectors.qformer.encoder.layer.{bid}.output_query.dense",   # Granite4 Vision
2261        ),
2262        MODEL_TENSOR.V_QF_FFN_NORM: (
2263            "model.layerwise_projectors.qformer.encoder.layer.{bid}.output_query.LayerNorm", # Granite4 Vision
2264            "model.spatial_projectors.qformer.encoder.layer.{bid}.output_query.LayerNorm",   # Granite4 Vision
2265        ),
2266
2267        # audio (mtmd)
2268
2269        MODEL_TENSOR.A_ENC_EMBD_POS: (
2270            "audio_tower.embed_positions", # ultravox
2271            "audio_embedding.embedding", # lfm2
2272        ),
2273
2274        MODEL_TENSOR.A_ENC_EMBD_NORM: (
2275            "audio_embedding.embedding_norm", # lfm2
2276        ),
2277
2278        MODEL_TENSOR.A_ENC_EMBD_TO_LOGITS: (
2279            "audio_embedding.to_logits", # lfm2
2280        ),
2281
2282        MODEL_TENSOR.A_ENC_CONV1D: (
2283            "audio_tower.conv{bid}", # ultravox
2284            "conformer.pre_encode.conv.{bid}", # lfm2
2285            "model.audio_tower.subsample_conv_projection.conv_{bid}.conv", # gemma3n
2286            "conformer.subsample_conv_projection.layer{bid}.conv", # gemma4
2287            "sound_encoder.encoder.subsampling.layers.{bid}", # parakeet
2288            "encoder.conv{bid}", # mimo-audio-tokenizer
2289            "speaker_encoder.blocks.{bid}.conv", # qwen3tts speaker encoder (only bid=0, the stem TDNN)
2290        ),
2291
2292        MODEL_TENSOR.A_ENC_CONV1D_NORM: (
2293            "conformer.subsample_conv_projection.layer{bid}.norm", # gemma4
2294        ),
2295
2296        MODEL_TENSOR.A_ENC_INP_PROJ: (
2297            "conformer.subsample_conv_projection.input_proj_linear", # gemma4
2298            "encoder.input_linear",
2299        ),
2300
2301        MODEL_TENSOR.A_ENC_CONV2D: (
2302            "audio_tower.conv2d{bid}", # qwen3omni
2303            "audio_encoder.dots_encoder.speech_encoder.conv2d{bid}", # dots3note
2304        ),
2305
2306        MODEL_TENSOR.A_ENC_CONV_OUT: (
2307            "audio_tower.conv_out", # qwen3omni
2308            "audio_encoder.dots_encoder.speech_encoder.conv_out", # dots3note
2309            "speaker_encoder.mfa.conv", # qwen3tts speaker encoder: multi-layer feature aggregation
2310        ),
2311
2312        MODEL_TENSOR.A_PRE_NORM: (),
2313
2314        MODEL_TENSOR.A_POST_NORM: (
2315            "audio_tower.layer_norm", # ultravox
2316            "audio_encoder.dots_encoder.speech_encoder.layer_norm", # dots3note
2317            "audio_tower.ln_post", # qwen2omni
2318            "encoder.layer_norm", # mimo-audio-tokenizer
2319        ),
2320
2321        MODEL_TENSOR.A_ENC_ATTN_Q: (
2322            "audio_tower.layers.{bid}.self_attn.q_proj", # ultravox
2323            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.self_attn.q_proj", # dots3note
2324            "conformer.layers.{bid}.self_attn.linear_q", # lfm2
2325            "conformer.layers.{bid}.attention.attn.q_proj", # gemma3n
2326            "conformer.layers.{bid}.self_attn.q_proj", # gemma4
2327            "sound_encoder.encoder.layers.{bid}.self_attn.q_proj", # parakeet
2328            "encoder.layers.{bid}.attn.to_q", # granite_speech
2329            "encoder.layers.{bid}.self_attn.q_proj", # mimo-audio-tokenizer
2330        ),
2331
2332        MODEL_TENSOR.A_ENC_ATTN_K: (
2333            "audio_tower.layers.{bid}.self_attn.k_proj", # ultravox
2334            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.self_attn.k_proj", # dots3note
2335            "conformer.layers.{bid}.self_attn.linear_k", # lfm2
2336            "conformer.layers.{bid}.attention.attn.k_proj", # gemma3n
2337            "conformer.layers.{bid}.self_attn.k_proj", # gemma4
2338            "sound_encoder.encoder.layers.{bid}.self_attn.k_proj", # parakeet
2339            "encoder.layers.{bid}.attn.to_k", # granite_speech (split from to_kv)
2340            "encoder.layers.{bid}.self_attn.k_proj", # mimo-audio-tokenizer
2341        ),
2342
2343        MODEL_TENSOR.A_ENC_ATTN_V: (
2344            "audio_tower.layers.{bid}.self_attn.v_proj", # ultravox
2345            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.self_attn.v_proj", # dots3note
2346            "conformer.layers.{bid}.self_attn.linear_v", # lfm2
2347            "conformer.layers.{bid}.attention.attn.v_proj", # gemma3n
2348            "conformer.layers.{bid}.self_attn.v_proj", # gemma4
2349            "sound_encoder.encoder.layers.{bid}.self_attn.v_proj", # parakeet
2350            "encoder.layers.{bid}.attn.to_v", # granite_speech (split from to_kv)
2351            "encoder.layers.{bid}.self_attn.v_proj", # mimo-audio-tokenizer
2352        ),
2353
2354        MODEL_TENSOR.A_ENC_ATTN_K_REL: (
2355            "conformer.layers.{bid}.self_attn.relative_k_proj", # gemma4
2356        ),
2357
2358        MODEL_TENSOR.A_ENC_ATTN_POST_NORM: (
2359            "conformer.layers.{bid}.norm_post_attn", # gemma4
2360        ),
2361
2362        MODEL_TENSOR.A_ENC_ATTN_PRE_NORM: (
2363            "conformer.layers.{bid}.norm_pre_attn", # gemma4
2364        ),
2365
2366        MODEL_TENSOR.A_ENC_PER_DIM_SCALE: (
2367            "conformer.layers.{bid}.attention.attn.per_dim_scale", # gemma3n
2368            "conformer.layers.{bid}.self_attn.per_dim_scale", # gemma3n
2369        ),
2370
2371        MODEL_TENSOR.A_ENC_LAYER_PRE_NORM: (
2372            "conformer.layers.{bid}.norm", # gemma3n
2373        ),
2374
2375        MODEL_TENSOR.A_ENC_INPUT_NORM: (
2376            "audio_tower.layers.{bid}.self_attn_layer_norm", # ultravox
2377            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.self_attn_layer_norm", # dots3note
2378            "conformer.layers.{bid}.norm_self_att", # lfm2
2379            "conformer.layers.{bid}.attention.pre_attn_norm", # gemma3n
2380            "sound_encoder.encoder.layers.{bid}.norm_self_att", # parakeet
2381            "encoder.layers.{bid}.attn.pre_norm", # granite_speech
2382            "encoder.layers.{bid}.self_attn_layer_norm", # mimo-audio-tokenizer
2383        ),
2384
2385        MODEL_TENSOR.A_ENC_OUTPUT: (
2386            "audio_tower.layers.{bid}.self_attn.out_proj", # ultravox
2387            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.self_attn.out_proj", # dots3note
2388            "conformer.layers.{bid}.self_attn.linear_out", # lfm2
2389            "conformer.layers.{bid}.attention.post", # gemma3n
2390            "conformer.layers.{bid}.self_attn.post", # gemma4
2391            "sound_encoder.encoder.layers.{bid}.self_attn.o_proj", # parakeet
2392            "encoder.layers.{bid}.attn.to_out", # granite_speech
2393            "encoder.layers.{bid}.self_attn.out_proj", # mimo-audio-tokenizer
2394        ),
2395
2396        MODEL_TENSOR.A_ENC_OUTPUT_NORM: (
2397            "audio_tower.layers.{bid}.final_layer_norm", # ultravox
2398            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.final_layer_norm", # dots3note
2399            "conformer.layers.{bid}.norm_out", # lfm2
2400            "conformer.layers.{bid}.attention.post_norm", # gemma3n
2401            "sound_encoder.encoder.layers.{bid}.norm_out", # parakeet
2402            "encoder.layers.{bid}.post_norm", # granite_speech
2403            "encoder.layers.{bid}.final_layer_norm", # mimo-audio-tokenizer
2404        ),
2405
2406        MODEL_TENSOR.A_ENC_FFN_NORM: (
2407            "conformer.layers.{bid}.norm_feed_forward1", # lfm2
2408            "conformer.layers.{bid}.ffw_layer_start.pre_layer_norm", # gemma3n
2409            "conformer.layers.{bid}.feed_forward1.pre_layer_norm", # gemma4
2410            "sound_encoder.encoder.layers.{bid}.norm_feed_forward1", # parakeet
2411            "encoder.layers.{bid}.ff1.pre_norm", # granite_speech
2412        ),
2413
2414        MODEL_TENSOR.A_ENC_FFN_POST_NORM: (
2415            "conformer.layers.{bid}.ffw_layer_start.post_layer_norm", # gemma3n
2416            "conformer.layers.{bid}.feed_forward1.post_layer_norm", # gemma4
2417        ),
2418
2419        MODEL_TENSOR.A_ENC_FFN_SCALE: (
2420            "conformer.layers.{bid}.ffw_layer_start.post_layer_scale", # gemma3n
2421        ),
2422
2423        MODEL_TENSOR.A_ENC_FFN_UP: (
2424            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.fc1_up", # dots3note (split from fc1 in conversion code)
2425            "audio_tower.layers.{bid}.fc1", # ultravox
2426            "conformer.layers.{bid}.feed_forward1.linear1", # lfm2
2427            "conformer.layers.{bid}.ffw_layer_start.ffw_layer_1", # gemma3n
2428            "conformer.layers.{bid}.feed_forward1.ffw_layer_1", # gemma4
2429            "sound_encoder.encoder.layers.{bid}.feed_forward1.linear1", # parakeet
2430            "encoder.layers.{bid}.ff1.up_proj", # granite_speech
2431            "encoder.layers.{bid}.fc1", # mimo-audio-tokenizer
2432        ),
2433
2434        MODEL_TENSOR.A_ENC_FFN_GATE: (
2435            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.fc1_gate", # dots3note (split from fc1 in conversion code)
2436        ),
2437
2438        MODEL_TENSOR.A_ENC_FFN_DOWN: (
2439            "audio_encoder.dots_encoder.speech_encoder.layers.{bid}.fc2", # dots3note
2440            "audio_tower.layers.{bid}.fc2", # ultravox
2441            "conformer.layers.{bid}.feed_forward1.linear2", # lfm2
2442            "conformer.layers.{bid}.ffw_layer_start.ffw_layer_2", # gemma3n
2443            "conformer.layers.{bid}.feed_forward1.ffw_layer_2", # gemma4
2444            "sound_encoder.encoder.layers.{bid}.feed_forward1.linear2", # parakeet
2445            "encoder.layers.{bid}.ff1.down_proj", # granite_speech
2446            "encoder.layers.{bid}.fc2", # mimo-audio-tokenizer
2447        ),
2448
2449        MODEL_TENSOR.A_ENC_FFN_UP_1: (
2450            "conformer.layers.{bid}.feed_forward2.linear1", # lfm2
2451            "conformer.layers.{bid}.ffw_layer_end.ffw_layer_1", # gemma3n
2452            "conformer.layers.{bid}.feed_forward2.ffw_layer_1", # gemma4
2453            "sound_encoder.encoder.layers.{bid}.feed_forward2.linear1", # parakeet
2454            "encoder.layers.{bid}.ff2.up_proj", # granite_speech
2455        ),
2456
2457        MODEL_TENSOR.A_ENC_FFN_DOWN_1: (
2458            "conformer.layers.{bid}.feed_forward2.linear2", # lfm2
2459            "conformer.layers.{bid}.ffw_layer_end.ffw_layer_2", # gemma3n
2460            "conformer.layers.{bid}.feed_forward2.ffw_layer_2", # gemma4
2461            "sound_encoder.encoder.layers.{bid}.feed_forward2.linear2", # parakeet
2462            "encoder.layers.{bid}.ff2.down_proj", # granite_speech
2463        ),
2464
2465        MODEL_TENSOR.A_ENC_FFN_NORM_1: (
2466            "conformer.layers.{bid}.norm_feed_forward2", # lfm2
2467            "conformer.layers.{bid}.ffw_layer_end.pre_layer_norm", # gemma3n
2468            "conformer.layers.{bid}.feed_forward2.pre_layer_norm", # gemma4
2469            "sound_encoder.encoder.layers.{bid}.norm_feed_forward2", # parakeet
2470            "encoder.layers.{bid}.ff2.pre_norm", # granite_speech
2471        ),
2472
2473        MODEL_TENSOR.A_ENC_DOWNSAMPLE_CONV: (
2474            "encoder.down_sample_layer.0", # mimo-audio-tokenizer
2475        ),
2476
2477        MODEL_TENSOR.A_ENC_DOWNSAMPLE_NORM: (
2478            "encoder.down_sample_norm", # mimo-audio-tokenizer
2479        ),
2480
2481        # note: the raw per-quantizer "encoder.quantizer.vq.layers.{i}._codebook.embed"
2482        # tensors are merged (padded + stacked, like MoE experts) into this single 3D
2483        # tensor in conversion code, so no raw-name mapping is registered here.
2484        MODEL_TENSOR.A_ENC_RVQ_CODEBOOK: (),
2485
2486        MODEL_TENSOR.A_ENC_FFN_POST_NORM_1: (
2487            "conformer.layers.{bid}.ffw_layer_end.post_layer_norm", # gemma3n
2488            "conformer.layers.{bid}.feed_forward2.post_layer_norm", # gemma4
2489        ),
2490
2491        MODEL_TENSOR.A_ENC_FFN_SCALE_1: (
2492            "conformer.layers.{bid}.ffw_layer_end.post_layer_scale", # gemma3n
2493        ),
2494
2495        MODEL_TENSOR.A_ENC_LINEAR_POS: (
2496            "conformer.layers.{bid}.self_attn.linear_pos", # lfm2
2497            "conformer.layers.{bid}.attention.attn.relative_position_embedding.pos_proj", # gemma3n
2498            "sound_encoder.encoder.layers.{bid}.self_attn.relative_k_proj", # parakeet
2499        ),
2500
2501        MODEL_TENSOR.A_ENC_POS_BIAS_U: (
2502            "conformer.layers.{bid}.self_attn.pos_bias_u", # lfm2
2503            "sound_encoder.encoder.layers.{bid}.self_attn.bias_u", # parakeet
2504        ),
2505
2506        MODEL_TENSOR.A_ENC_POS_BIAS_V: (
2507            "conformer.layers.{bid}.self_attn.pos_bias_v", # lfm2
2508            "sound_encoder.encoder.layers.{bid}.self_attn.bias_v", # parakeet
2509        ),
2510
2511        MODEL_TENSOR.A_ENC_OUT: (
2512            "conformer.pre_encode.out", # lfm2
2513            "model.audio_tower.subsample_conv_projection.input_proj_linear", # gemma3n (note: it should be A_ENC_INP_PROJ, this is a mistake; it should be corrected in C++ code when it's supported)
2514            "conformer.output_proj", # gemma4
2515            "sound_encoder.encoder.subsampling.linear", # parakeet
2516        ),
2517
2518        # note: some tensors below has "audio." pseudo-prefix, to prevent conflicts with vision tensors
2519        # this prefix is added in the conversion code in modify_tensors()
2520
2521        MODEL_TENSOR.A_MMPROJ: (
2522            "audio.multi_modal_projector.linear_{bid}", # ultravox, meralion
2523            "audio_encoder.audio_adapter.proj.{bid}", # dots3note (proj.1, proj.3)
2524            "audio_adapter.model.{bid}", # lfm2
2525            "audio_tower.proj{bid}", # qwen3omni
2526            "sound_projection.linear{bid}", # parakeet (linear1, linear2)
2527        ),
2528
2529        MODEL_TENSOR.A_MMPROJ_FC: (
2530            "audio.multi_modal_projector.linear", # qwen2audio
2531            "audio_tower.proj", # qwen2omni
2532            "model.audio_tower.output_proj", # gemma4
2533            "speaker_encoder.fc", # qwen3tts speaker encoder: final speaker embedding projection
2534        ),
2535
2536        MODEL_TENSOR.A_MM_NORM_PRE: (
2537            "audio.multi_modal_projector.ln_pre", # ultravox
2538            "audio_encoder.audio_adapter.proj.0", # dots3note
2539            "sound_projection.norm", # parakeet
2540        ),
2541
2542        MODEL_TENSOR.A_MM_NORM_MID: (
2543            "audio.multi_modal_projector.ln_mid", # ultravox
2544        ),
2545
2546        # note: the raw per-channel "speech_embeddings.{i}" tensors are merged
2547        # (stacked, like MoE experts) into this single 3D tensor in conversion
2548        # code, so no raw-name mapping is registered here.
2549        MODEL_TENSOR.A_MM_CODE_EMBD: (),
2550
2551        MODEL_TENSOR.A_MM_LOCAL_ATTN_Q: (
2552            "audio_encoder.input_local_transformer.layers.{bid}.self_attn.q_proj", # mimo-v2.5
2553        ),
2554        MODEL_TENSOR.A_MM_LOCAL_ATTN_K: (
2555            "audio_encoder.input_local_transformer.layers.{bid}.self_attn.k_proj", # mimo-v2.5
2556        ),
2557        MODEL_TENSOR.A_MM_LOCAL_ATTN_V: (
2558            "audio_encoder.input_local_transformer.layers.{bid}.self_attn.v_proj", # mimo-v2.5
2559        ),
2560        MODEL_TENSOR.A_MM_LOCAL_ATTN_OUT: (
2561            "audio_encoder.input_local_transformer.layers.{bid}.self_attn.o_proj", # mimo-v2.5
2562        ),
2563        MODEL_TENSOR.A_MM_LOCAL_FFN_GATE: (
2564            "audio_encoder.input_local_transformer.layers.{bid}.mlp.gate_proj", # mimo-v2.5
2565        ),
2566        MODEL_TENSOR.A_MM_LOCAL_FFN_UP: (
2567            "audio_encoder.input_local_transformer.layers.{bid}.mlp.up_proj", # mimo-v2.5
2568        ),
2569        MODEL_TENSOR.A_MM_LOCAL_FFN_DOWN: (
2570            "audio_encoder.input_local_transformer.layers.{bid}.mlp.down_proj", # mimo-v2.5
2571        ),
2572        MODEL_TENSOR.A_MM_LOCAL_LN1: (
2573            "audio_encoder.input_local_transformer.layers.{bid}.input_layernorm", # mimo-v2.5
2574        ),
2575        MODEL_TENSOR.A_MM_LOCAL_LN2: (
2576            "audio_encoder.input_local_transformer.layers.{bid}.post_attention_layernorm", # mimo-v2.5
2577        ),
2578        MODEL_TENSOR.A_MM_LOCAL_NORM: (
2579            "audio_encoder.input_local_transformer.norm", # mimo-v2.5
2580        ),
2581
2582        MODEL_TENSOR.A_ENC_CONV_DW: (
2583            "conformer.layers.{bid}.conv.depthwise_conv", # lfm2
2584            "conformer.layers.{bid}.lconv1d.depthwise_conv1d", # gemma3n
2585            "sound_encoder.encoder.layers.{bid}.conv.depthwise_conv", # parakeet
2586            "encoder.layers.{bid}.conv.depth_conv.conv", # granite_speech
2587        ),
2588
2589        MODEL_TENSOR.A_ENC_CONV_NORM: (
2590            "conformer.layers.{bid}.conv.batch_norm", # lfm2
2591            "conformer.layers.{bid}.lconv1d.pre_layer_norm", # gemma3n
2592            "sound_encoder.encoder.layers.{bid}.conv.norm", # parakeet
2593        ),
2594
2595        MODEL_TENSOR.A_ENC_CONV_NORM_MEAN: (
2596            "sound_encoder.encoder.layers.{bid}.conv.norm.running_mean", # parakeet
2597        ),
2598
2599        MODEL_TENSOR.A_ENC_CONV_NORM_VAR: (
2600            "sound_encoder.encoder.layers.{bid}.conv.norm.running_var", # parakeet
2601            "encoder.layers.{bid}.conv.batch_norm", # granite_speech
2602        ),
2603
2604        MODEL_TENSOR.A_ENC_CONV_PW1: (
2605            "conformer.layers.{bid}.conv.pointwise_conv1", # lfm2
2606            "conformer.layers.{bid}.lconv1d.linear_start", # gemma3n
2607            "sound_encoder.encoder.layers.{bid}.conv.pointwise_conv1", # parakeet
2608            "encoder.layers.{bid}.conv.up_conv", # granite_speech
2609            "speaker_encoder.blocks.{bid}.tdnn1.conv", # qwen3tts speaker encoder
2610        ),
2611
2612        MODEL_TENSOR.A_ENC_CONV_PW2: (
2613            "conformer.layers.{bid}.conv.pointwise_conv2", # lfm2
2614            "conformer.layers.{bid}.lconv1d.linear_end", # gemma3n
2615            "sound_encoder.encoder.layers.{bid}.conv.pointwise_conv2", # parakeet
2616            "encoder.layers.{bid}.conv.down_conv", # granite_speech
2617            "speaker_encoder.blocks.{bid}.tdnn2.conv", # qwen3tts speaker encoder
2618        ),
2619
2620        MODEL_TENSOR.A_ENC_SE_CONV1: (
2621            "speaker_encoder.blocks.{bid}.se_block.conv1", # qwen3tts
2622        ),
2623
2624        MODEL_TENSOR.A_ENC_SE_CONV2: (
2625            "speaker_encoder.blocks.{bid}.se_block.conv2", # qwen3tts
2626        ),
2627
2628        MODEL_TENSOR.A_ENC_ASP_ATTN: (
2629            "speaker_encoder.asp.conv", # qwen3tts
2630        ),
2631
2632        MODEL_TENSOR.A_ENC_ASP_TDNN: (
2633            "speaker_encoder.asp.tdnn.conv", # qwen3tts
2634        ),
2635
2636        MODEL_TENSOR.A_ENC_NORM_CONV: (
2637            "conformer.layers.{bid}.norm_conv", # lfm2
2638            "conformer.layers.{bid}.lconv1d.conv_norm", # gemma3n
2639            "sound_encoder.encoder.layers.{bid}.norm_conv", # parakeet
2640            "encoder.layers.{bid}.conv.norm", # granite_speech
2641        ),
2642
2643        MODEL_TENSOR.A_PER_DIM_K_SCALE: (
2644            "conformer.layers.{bid}.attention.attn.per_dim_key_scale", # gemma4
2645        ),
2646
2647        MODEL_TENSOR.A_PER_DIM_SCALE: (
2648            "conformer.layers.{bid}.attention.attn.per_dim_scale", # gemma4
2649        ),
2650
2651        MODEL_TENSOR.A_ENC_MEL_FILTERS: (
2652            "sound_encoder.encoder.feature_extractor.featurizer.fb", # parakeet
2653        ),
2654
2655        MODEL_TENSOR.A_ENC_WINDOW: (
2656            "sound_encoder.encoder.feature_extractor.featurizer.window", # parakeet
2657        ),
2658
2659        MODEL_TENSOR.A_MM_EMBEDDING: (
2660            "model.embed_audio.embedding", # gemma3n
2661        ),
2662        MODEL_TENSOR.A_MM_HARD_EMB_NORM: (
2663            "model.embed_audio.hard_embedding_norm", # gemma3n
2664        ),
2665        MODEL_TENSOR.A_MM_INP_PROJ: (
2666            "model.embed_audio.embedding_projection", # gemma3n
2667        ),
2668        MODEL_TENSOR.A_MM_SOFT_EMB_NORM: (
2669            "model.embed_audio.soft_embedding_norm", # gemma3n
2670        ),
2671
2672        MODEL_TENSOR.A_ENC_ATTN_REL_POS_EMB: (
2673            "encoder.layers.{bid}.attn.rel_pos_emb.weight",
2674        ),
2675
2676        MODEL_TENSOR.A_QF_SELF_ATTN_Q: (
2677            "projector.qformer.encoder.layer.{bid}.attention.attention.query",
2678        ),
2679
2680        MODEL_TENSOR.A_QF_SELF_ATTN_K: (
2681            "projector.qformer.encoder.layer.{bid}.attention.attention.key",
2682        ),
2683
2684        MODEL_TENSOR.A_QF_SELF_ATTN_V: (
2685            "projector.qformer.encoder.layer.{bid}.attention.attention.value",
2686        ),
2687
2688        MODEL_TENSOR.A_QF_SELF_ATTN_O: (
2689            "projector.qformer.encoder.layer.{bid}.attention.output.dense",
2690        ),
2691
2692        MODEL_TENSOR.A_QF_SELF_ATTN_NORM: (
2693            "projector.qformer.encoder.layer.{bid}.attention.output.LayerNorm",
2694        ),
2695
2696        MODEL_TENSOR.A_QF_CROSS_ATTN_Q: (
2697            "projector.qformer.encoder.layer.{bid}.crossattention.attention.query",
2698        ),
2699
2700        MODEL_TENSOR.A_QF_CROSS_ATTN_K: (
2701            "projector.qformer.encoder.layer.{bid}.crossattention.attention.key",
2702        ),
2703
2704        MODEL_TENSOR.A_QF_CROSS_ATTN_V: (
2705            "projector.qformer.encoder.layer.{bid}.crossattention.attention.value",
2706        ),
2707
2708        MODEL_TENSOR.A_QF_CROSS_ATTN_O: (
2709            "projector.qformer.encoder.layer.{bid}.crossattention.output.dense",
2710        ),
2711
2712        MODEL_TENSOR.A_QF_CROSS_ATTN_NORM: (
2713            "projector.qformer.encoder.layer.{bid}.crossattention.output.LayerNorm",
2714        ),
2715
2716        MODEL_TENSOR.A_QF_FFN_UP: (
2717            "projector.qformer.encoder.layer.{bid}.intermediate_query.dense",
2718        ),
2719
2720        MODEL_TENSOR.A_QF_FFN_DOWN: (
2721            "projector.qformer.encoder.layer.{bid}.output_query.dense",
2722        ),
2723
2724        MODEL_TENSOR.A_QF_FFN_NORM: (
2725            "projector.qformer.encoder.layer.{bid}.output_query.LayerNorm",
2726        ),
2727
2728        # NextN/MTP tensors
2729        MODEL_TENSOR.NEXTN_PROJ_PRE: (
2730            "pre_projection",
2731        ),
2732
2733        MODEL_TENSOR.NEXTN_PROJ_POST: (
2734            "post_projection",
2735        ),
2736
2737        MODEL_TENSOR.NEXTN_EH_PROJ: (
2738            "model.layers.{bid}.eh_proj",
2739        ),
2740
2741        MODEL_TENSOR.NEXTN_EMBED_TOKENS: (
2742            "model.layers.{bid}.embed_tokens",
2743        ),
2744
2745        MODEL_TENSOR.NEXTN_ENORM: (
2746            "model.layers.{bid}.enorm",
2747        ),
2748
2749        MODEL_TENSOR.NEXTN_HNORM: (
2750            "model.layers.{bid}.hnorm",
2751        ),
2752
2753        MODEL_TENSOR.NEXTN_SHARED_HEAD_HEAD: (
2754            "model.layers.{bid}.shared_head.head",
2755        ),
2756
2757        MODEL_TENSOR.NEXTN_SHARED_HEAD_NORM: (
2758            "model.layers.{bid}.shared_head.norm",
2759        ),
2760    }
2761
2762    # architecture-specific block mappings
2763    arch_block_mappings_cfg: dict[MODEL_ARCH, dict[MODEL_TENSOR, tuple[str, ...]]] = {
2764        MODEL_ARCH.ARCTIC: {
2765            MODEL_TENSOR.FFN_NORM: (
2766                "model.layers.{bid}.residual_layernorm",
2767            ),
2768            MODEL_TENSOR.FFN_NORM_EXP: (
2769                "model.layers.{bid}.post_attention_layernorm",
2770            ),
2771        },
2772        MODEL_ARCH.QWEN4EXP: {
2773            MODEL_TENSOR.HC_ATTN_NORM: (
2774                "model.layers.{bid}.attn_hyper_connection.hc_norm",
2775            ),
2776            MODEL_TENSOR.HC_ATTN_DOWN: (
2777                "model.layers.{bid}.attn_hyper_connection.input_mix_weight_down",
2778            ),
2779            MODEL_TENSOR.HC_ATTN_UP: (
2780                "model.layers.{bid}.attn_hyper_connection.input_mix_weight_up",
2781            ),
2782            MODEL_TENSOR.HC_ATTN_INJECT: (
2783                "model.layers.{bid}.attn_hyper_connection.block_inject_weight",
2784            ),
2785            MODEL_TENSOR.HC_FFN_NORM: (
2786                "model.layers.{bid}.mlp_hyper_connection.hc_norm",
2787            ),
2788            MODEL_TENSOR.HC_FFN_DOWN: (
2789                "model.layers.{bid}.mlp_hyper_connection.input_mix_weight_down",
2790            ),
2791            MODEL_TENSOR.HC_FFN_UP: (
2792                "model.layers.{bid}.mlp_hyper_connection.input_mix_weight_up",
2793            ),
2794            MODEL_TENSOR.HC_FFN_INJECT: (
2795                "model.layers.{bid}.mlp_hyper_connection.block_inject_weight",
2796            ),
2797            MODEL_TENSOR.HC_HEAD_NORM: (
2798                "model.hyper_connection_mixer.hc_norm",
2799            ),
2800            MODEL_TENSOR.HC_HEAD_DOWN: (
2801                "model.hyper_connection_mixer.input_mix_weight_down",
2802            ),
2803            MODEL_TENSOR.HC_HEAD_UP: (
2804                "model.hyper_connection_mixer.input_mix_weight_up",
2805            ),
2806            MODEL_TENSOR.INDEXER_Q_NORM: (
2807                "model.layers.{bid}.self_attn.indexer.q_layernorm",
2808            ),
2809            MODEL_TENSOR.INDEXER_K_NORM: (
2810                "model.layers.{bid}.self_attn.indexer.k_layernorm",
2811            ),
2812            MODEL_TENSOR.PLE_KEY: (
2813                "model.layers.{bid}.ple.key_proj",
2814            ),
2815            MODEL_TENSOR.PLE_VALUE: (
2816                "model.layers.{bid}.ple.value_proj",
2817            ),
2818            MODEL_TENSOR.PLE_NORM_KEY: (
2819                "model.layers.{bid}.ple.norm_key",
2820            ),
2821            MODEL_TENSOR.PLE_NORM_QUERY: (
2822                "model.layers.{bid}.ple.norm_query",
2823            ),
2824            MODEL_TENSOR.PLE_NORM_CONV: (
2825                "model.layers.{bid}.ple.norm_conv",
2826            ),
2827            MODEL_TENSOR.PLE_CONV1D: (
2828                "model.layers.{bid}.ple.conv1d",
2829            ),
2830        },
2831    }
2832
2833    mapping: dict[str, tuple[MODEL_TENSOR, str]]
2834
2835    def __init__(self, arch: MODEL_ARCH, n_blocks: int):
2836        self.mapping = {}
2837        for tensor, keys in self.mappings_cfg.items():
2838            if tensor not in MODEL_TENSORS[arch]:
2839                continue
2840            tensor_name = TENSOR_NAMES[tensor]
2841            self.mapping[tensor_name] = (tensor, tensor_name)
2842            for key in keys:
2843                self.mapping[key] = (tensor, tensor_name)
2844        if arch in self.arch_block_mappings_cfg:
2845            self.block_mappings_cfg.update(self.arch_block_mappings_cfg[arch])
2846        for bid in range(n_blocks):
2847            for tensor, keys in self.block_mappings_cfg.items():
2848                if tensor not in MODEL_TENSORS[arch]:
2849                    continue
2850
2851                tensor_name = TENSOR_NAMES[tensor].format(bid = bid)
2852                self.mapping[tensor_name] = (tensor, tensor_name)
2853                for key in keys:
2854                    key = key.format(bid = bid)
2855                    self.mapping[key] = (tensor, tensor_name)
2856
2857    def get_type_and_name(self, key: str, try_suffixes: Sequence[str] = ()) -> tuple[MODEL_TENSOR, str] | None:
2858        result = self.mapping.get(key)
2859        if result is not None:
2860            return result
2861        for suffix in try_suffixes:
2862            if key.endswith(suffix):
2863                result = self.mapping.get(key[:-len(suffix)])
2864                if result is not None:
2865                    return result[0], result[1] + suffix
2866        return None
2867
2868    def get_name(self, key: str, try_suffixes: Sequence[str] = ()) -> str | None:
2869        result = self.get_type_and_name(key, try_suffixes = try_suffixes)
2870        if result is None:
2871            return None
2872        return result[1]
2873
2874    def get_type(self, key: str, try_suffixes: Sequence[str] = ()) -> MODEL_TENSOR | None:
2875        result = self.get_type_and_name(key, try_suffixes = try_suffixes)
2876        if result is None:
2877            return None
2878        return result[0]
2879
2880    def __getitem__(self, key: str) -> str:
2881        try:
2882            return self.mapping[key][1]
2883        except KeyError:
2884            raise KeyError(key)
2885
2886    def __contains__(self, key: str) -> bool:
2887        return key in self.mapping
2888
2889    def __repr__(self) -> str:
2890        return repr(self.mapping)
2891
2892
2893def get_tensor_name_map(arch: MODEL_ARCH, n_blocks: int) -> TensorNameMap:
2894    return TensorNameMap(arch, n_blocks)