krishnateja95 commited on
Commit
8df1ce0
·
verified ·
1 Parent(s): c782ba3

Upload folder using huggingface_hub

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ tokenizer.json filter=lfs diff=lfs merge=lfs -text
chat_template.jinja ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {{- '[@BOS@]\n' }}
2
+ {%- if tools -%}
3
+ <|start_of_turn|><|tool_declare|>
4
+ <tools>
5
+ {% for tool in tools %}
6
+ {{ tool | tojson(ensure_ascii=False) }}
7
+ {% endfor %}
8
+ </tools>
9
+ {{- '<|end_of_turn|>\n' }}{%- endif -%}
10
+ {%- macro visible_text(content) -%}
11
+ {%- if content is string -%}
12
+ {{- content }}
13
+ {%- elif content is iterable and content is not mapping -%}
14
+ {%- for item in content -%}
15
+ {%- if item is mapping and item.type == 'text' -%}
16
+ {{- item.text }}
17
+ {%- elif item is string -%}
18
+ {{- item }}
19
+ {%- endif -%}
20
+ {%- endfor -%}
21
+ {%- elif content is none -%}
22
+ {{- '' }}
23
+ {%- else -%}
24
+ {{- content }}
25
+ {%- endif -%}
26
+ {%- endmacro -%}
27
+ {%- set ns = namespace(last_user_index=-1) %}
28
+ {%- for m in messages %}
29
+ {%- if m.role == 'user' %}
30
+ {% set ns.last_user_index = loop.index0 -%}
31
+ {%- endif %}
32
+ {%- endfor %}
33
+ {% for m in messages %}
34
+ {%- if m.role == 'user' -%}<|start_of_turn|><|user|>
35
+ {{ visible_text(m.content) }}
36
+ {{- '<|nothink|>' if (enable_thinking is defined and not enable_thinking and not visible_text(m.content).endswith("<|nothink|>")) else '' -}}
37
+ {{- '<|end_of_turn|>\n' }}
38
+ {%- elif m.role == 'assistant' -%}
39
+ {{- '<|start_of_turn|><|assistant|>\n' }}
40
+ {%- set reasoning_content = '' %}
41
+ {%- set content = visible_text(m.content) %}
42
+ {%- if m.reasoning_content is string %}
43
+ {%- set reasoning_content = m.reasoning_content %}
44
+ {%- else %}
45
+ {%- if '</think>' in content %}
46
+ {%- set reasoning_content = content.split('</think>')[0].rstrip('\n').split('<think>')[-1].lstrip('\n') %}
47
+ {%- set content = content.split('</think>')[-1].lstrip('\n') %}
48
+ {%- endif %}
49
+ {%- endif %}
50
+ {%- if loop.index0 > ns.last_user_index and reasoning_content -%}
51
+ {{ '<think>' + reasoning_content.strip() + '</think>'}}
52
+ {%- else -%}
53
+ {{ '<think></think>' }}
54
+ {%- endif -%}
55
+ {%- if content.strip() -%}
56
+ {{ '\n' + content.strip() }}
57
+ {%- endif -%}
58
+ {% if m.tool_calls %}
59
+ {% for tc in m.tool_calls %}
60
+ {%- if tc.function %}
61
+ {%- set tc = tc.function %}
62
+ {%- endif %}
63
+ {{ '\n<tool_call>' + tc.name }}
64
+ {% set _args = tc.arguments %}
65
+ {% for k, v in _args.items() %}
66
+ <arg_key>{{ k }}</arg_key>
67
+ <arg_value>{{ v | tojson(ensure_ascii=False) if v is not string else v }}</arg_value>
68
+ {% endfor %}
69
+ </tool_call>{% endfor %}
70
+ {% endif %}
71
+ {{- '<|end_of_turn|>\n' }}
72
+ {%- elif m.role == 'tool' -%}
73
+ {%- if m.content is string -%}
74
+ {%- if loop.first or (messages[loop.index0 - 1].role != "tool") %}
75
+ {{- '<|start_of_turn|><|observation|>' }}
76
+ {%- endif %}
77
+ {{- '\n<tool_response>\n' }}
78
+ {{- m.content }}
79
+ {{- '\n</tool_response>' }}
80
+ {%- else -%}
81
+ <|start_of_turn|><|observation|>{% for tr in m.content %}
82
+
83
+ <tool_response>
84
+ {{ tr.output if tr.output is defined else tr }}
85
+ </tool_response>{% endfor -%}
86
+ {% endif -%}
87
+ {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %}
88
+ {{- '<|end_of_turn|>\n' }}{%- endif -%}
89
+ {%- elif m.role == 'system' -%}
90
+ <|start_of_turn|><|system|>
91
+ {{ visible_text(m.content) }}
92
+ {{- '<|end_of_turn|>\n' }}
93
+ {%- endif -%}
94
+ {%- endfor -%}
95
+ {%- if add_generation_prompt -%}
96
+ {{- '<|start_of_turn|><|assistant|>\n' }}
97
+ {%- endif -%}
config.json ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "SarvamMLAForCausalLM"
4
+ ],
5
+ "attention_dropout": 0.0,
6
+ "attn_implementation": null,
7
+ "auto_map": {
8
+ "AutoConfig": "configuration_sarvam_moe.SarvamMLAConfig",
9
+ "AutoModel": "modeling_sarvam_moe.SarvamMLAModel",
10
+ "AutoModelForCausalLM": "modeling_sarvam_moe.SarvamMLAForCausalLM"
11
+ },
12
+ "default_theta": 10000.0,
13
+ "dtype": "float32",
14
+ "embedding_dropout": 0.0,
15
+ "eos_token_id": 1,
16
+ "first_k_dense_replace": 1,
17
+ "head_dim": 576,
18
+ "hidden_act": "silu",
19
+ "hidden_size": 4096,
20
+ "initializer_range": 0.006,
21
+ "intermediate_size": 16384,
22
+ "kv_lora_rank": 512,
23
+ "max_position_embeddings": 131072,
24
+ "model_type": "sarvam_mla",
25
+ "moe_intermediate_size": 2048,
26
+ "moe_router_enable_expert_bias": true,
27
+ "num_attention_heads": 64,
28
+ "num_experts": 128,
29
+ "num_experts_per_tok": 8,
30
+ "num_hidden_layers": 32,
31
+ "num_shared_experts": 1,
32
+ "output_dropout": 0.0,
33
+ "output_router_logits": false,
34
+ "pad_token_id": 0,
35
+ "q_head_dim": 192,
36
+ "qk_nope_head_dim": 128,
37
+ "qk_rope_head_dim": 64,
38
+ "quantization_config": {
39
+ "config_groups": {
40
+ "group_0": {
41
+ "format": "float-quantized",
42
+ "input_activations": {
43
+ "actorder": null,
44
+ "block_structure": null,
45
+ "dynamic": true,
46
+ "group_size": null,
47
+ "num_bits": 8,
48
+ "observer": null,
49
+ "observer_kwargs": {},
50
+ "scale_dtype": null,
51
+ "strategy": "token",
52
+ "symmetric": true,
53
+ "type": "float",
54
+ "zp_dtype": null
55
+ },
56
+ "output_activations": null,
57
+ "targets": [
58
+ "Linear"
59
+ ],
60
+ "weights": {
61
+ "actorder": null,
62
+ "block_structure": null,
63
+ "dynamic": false,
64
+ "group_size": null,
65
+ "num_bits": 8,
66
+ "observer": "memoryless_minmax",
67
+ "observer_kwargs": {},
68
+ "scale_dtype": null,
69
+ "strategy": "channel",
70
+ "symmetric": true,
71
+ "type": "float",
72
+ "zp_dtype": null
73
+ }
74
+ }
75
+ },
76
+ "format": "float-quantized",
77
+ "global_compression_ratio": null,
78
+ "ignore": [
79
+ "lm_head"
80
+ ],
81
+ "kv_cache_scheme": null,
82
+ "quant_method": "compressed-tensors",
83
+ "quantization_status": "compressed",
84
+ "sparsity_config": {},
85
+ "transform_config": {},
86
+ "version": "0.14.0"
87
+ },
88
+ "rms_norm_eps": 1e-06,
89
+ "rope_scaling": {
90
+ "beta_fast": 32,
91
+ "beta_slow": 1,
92
+ "factor": 40,
93
+ "mscale": 1.0,
94
+ "mscale_all_dim": 1.0,
95
+ "original_max_position_embeddings": 4096,
96
+ "type": "deepseek_yarn"
97
+ },
98
+ "rope_theta": 10000.0,
99
+ "routed_scaling_factor": 2.5,
100
+ "tie_word_embeddings": false,
101
+ "transformers_version": "4.56.2",
102
+ "use_cache": true,
103
+ "use_qk_norm": true,
104
+ "v_head_dim": 128,
105
+ "vocab_size": 262144
106
+ }
configuration_sarvam_moe.py ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from transformers.configuration_utils import PretrainedConfig
2
+
3
+
4
+ class SarvamMLAConfig(PretrainedConfig):
5
+ model_type = "sarvam_mla"
6
+
7
+ base_model_pp_plan = {
8
+ "embed_tokens": (["input_ids"], ["inputs_embeds"]),
9
+ "layers": (["hidden_states", "attention_mask"], ["hidden_states"]),
10
+ "norm": (["hidden_states"], ["hidden_states"]),
11
+ }
12
+
13
+ base_model_tp_plan = {
14
+ "layers.*.self_attn.q_proj": "colwise",
15
+ "layers.*.self_attn.kv_b_proj": "colwise",
16
+ "layers.*.self_attn.o_proj": "rowwise",
17
+ }
18
+
19
+ def __init__(
20
+ self,
21
+ vocab_size: int = 262144,
22
+ hidden_size: int = 4096,
23
+ num_hidden_layers: int = 32,
24
+ intermediate_size: int = 16384,
25
+ moe_intermediate_size: int = 2048,
26
+ num_experts: int = 128,
27
+ num_experts_per_tok: int = 8,
28
+ num_shared_experts: int = 1,
29
+ first_k_dense_replace: int = 1,
30
+ num_attention_heads: int = 64,
31
+ qk_rope_head_dim: int = 64,
32
+ qk_nope_head_dim: int = 128,
33
+ kv_lora_rank: int = 512,
34
+ v_head_dim: int = 128,
35
+ max_position_embeddings: int = 4096,
36
+ rope_theta: float = 10000.0,
37
+ rope_scaling: dict = None,
38
+ attention_dropout: float = 0.0,
39
+ output_dropout: float = 0.0,
40
+ rms_norm_eps: float = 1e-6,
41
+ hidden_act: str = "silu",
42
+ use_cache: bool = True,
43
+ use_qk_norm: bool = True,
44
+ moe_router_enable_expert_bias: bool = True,
45
+ routed_scaling_factor: float = 2.5,
46
+ output_router_logits: bool = False,
47
+ tie_word_embeddings: bool = False,
48
+ pad_token_id: int = 0,
49
+ eos_token_id: int = 1,
50
+ embedding_dropout: float = 0.0,
51
+ initializer_range: float = 0.006,
52
+ attn_implementation: str = "eager",
53
+ **kwargs,
54
+ ):
55
+ # core geometry
56
+ self.vocab_size = vocab_size
57
+ self.hidden_size = hidden_size
58
+ self.num_hidden_layers = num_hidden_layers
59
+ self.intermediate_size = intermediate_size
60
+ self.num_attention_heads = num_attention_heads
61
+ self.max_position_embeddings = max_position_embeddings
62
+
63
+ # MLA geometry
64
+ self.qk_rope_head_dim = qk_rope_head_dim
65
+ self.qk_nope_head_dim = qk_nope_head_dim
66
+ self.kv_lora_rank = kv_lora_rank
67
+ self.v_head_dim = v_head_dim
68
+ # convenient derived dim
69
+ self.q_head_dim = qk_rope_head_dim + qk_nope_head_dim
70
+ # vLLM MLA expects "head size" = Lkv + R, not hidden_size/num_heads.
71
+ self.head_dim = int(self.kv_lora_rank + self.qk_rope_head_dim)
72
+
73
+ # MoE
74
+ self.moe_intermediate_size = moe_intermediate_size
75
+ self.num_experts = num_experts
76
+ self.num_experts_per_tok = num_experts_per_tok
77
+ self.num_shared_experts = num_shared_experts
78
+ self.first_k_dense_replace = first_k_dense_replace
79
+
80
+ # Router
81
+ self.moe_router_enable_expert_bias = moe_router_enable_expert_bias
82
+ self.routed_scaling_factor = routed_scaling_factor
83
+ self.output_router_logits = output_router_logits
84
+
85
+ # dropouts / norms / init
86
+ self.attention_dropout = attention_dropout
87
+ self.output_dropout = output_dropout
88
+ self.embedding_dropout = embedding_dropout
89
+ self.rms_norm_eps = rms_norm_eps
90
+ self.initializer_range = initializer_range
91
+ self.hidden_act = hidden_act
92
+
93
+ # rope / cache
94
+ self.rope_theta = rope_theta
95
+ self.use_cache = use_cache
96
+ self.use_qk_norm = use_qk_norm
97
+ self.rope_scaling = rope_scaling
98
+ self.default_theta = 10000.0
99
+
100
+ if self.rope_scaling is None:
101
+ self.rope_scaling = {
102
+ 'beta_fast': 32,
103
+ 'beta_slow': 1,
104
+ 'factor': 40,
105
+ 'mscale': 1.0,
106
+ 'mscale_all_dim': 1.0,
107
+ 'original_max_position_embeddings': 4096,
108
+ 'rope_type': 'deepseek_yarn',
109
+ }
110
+
111
+ self.attn_implementation = attn_implementation
112
+ self._attn_implementation = attn_implementation
113
+
114
+ if "_attn_implementation" in kwargs:
115
+ self._attn_implementation = kwargs.pop("_attn_implementation")
116
+ if hasattr(self, "attn_implementation"):
117
+ self.attn_implementation = self._attn_implementation
118
+
119
+ super().__init__(
120
+ pad_token_id=pad_token_id,
121
+ eos_token_id=eos_token_id,
122
+ tie_word_embeddings=tie_word_embeddings,
123
+ **kwargs,
124
+ )
125
+
126
+ def convert_rope_params_to_dict(self, ignore_keys_at_rope_validation: set | None = None, **kwargs):
127
+ rope_scaling = kwargs.pop("rope_scaling", None)
128
+ self.rope_parameters = rope_scaling or self.rope_parameters
129
+ self.rope_parameters = self.rope_parameters if self.rope_parameters is not None else {}
130
+
131
+ # Standardize and validate the correctness of rotary position embeddings parameters
132
+ self.rope_parameters.setdefault("rope_theta", kwargs.pop("rope_theta", self.default_theta))
133
+ self.standardize_rope_params()
134
+ self.validate_rope(ignore_keys=ignore_keys_at_rope_validation)
135
+
136
+ # Convert to float because RoPE fn expect a float. Models on the hub were saved as int
137
+ for key in ["beta_fast", "beta_slow", "factor"]:
138
+ if key in self.rope_parameters:
139
+ self.rope_parameters[key] = float(self.rope_parameters[key])
140
+ return kwargs
generation_config.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "eos_token_id": 26,
4
+ "pad_token_id": 0,
5
+ "transformers_version": "4.56.2"
6
+ }
model-00001-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cf5b7c9e157657d7f290def46c0f28112e48210a55be2950efad89a20d35e943
3
+ size 4996805440
model-00002-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:93f6631475a79d4ba91e2a50a9f298d5aa21b2faa630c3501758a24079340c2e
3
+ size 4993969096
model-00003-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:92137034b445533f808d20b0835c001a1202e4b584fc97a68a7551651af402e0
3
+ size 4998478576
model-00004-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e521e0616f5766dac7ee880ea3ff7ce755021b4c9410048d9e3dfd77bfbc06b5
3
+ size 4993969096
model-00005-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:51fac18750b9051d47920e5df14a1a78c5c7fb1e144954c245e4b83ba4b3620b
3
+ size 4998478568
model-00006-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:aa22382d246a4b6474ea28ea0c4502cbd741ebf77f186ca0cf6614758d36577a
3
+ size 4993969080
model-00007-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:580939774069b8a15cb6c1ed1aacfa62174fa5abfcd2c377a9a977d201f37823
3
+ size 4998478592
model-00008-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ba5019a3c32b739ccac8aaf7f94f462791162efbcbdb4c2ef0e64ab7dbd94875
3
+ size 4993970248
model-00009-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:79bfeaf035988663dff36c96a80422afe73f7fae97755f09ae81a210feb29eda
3
+ size 4998479744
model-00010-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e609c60bb0b2e4c79015ffbdef16507d14aeef70abccec841939939af83ff694
3
+ size 4993970240
model-00011-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:29c6a87710de576e46945e6422989a684651811c15582ebb26ae5da1fc1544e1
3
+ size 4998479744
model-00012-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:45c031c3b85996f1c08a9bb33be9395f1364073b6249f902dd6d4eb14cf6045c
3
+ size 4993970224
model-00013-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:220f443e1c48d5214d386fadc5d3cdc848561bccd758741bec13dabcb79f315e
3
+ size 4998479744
model-00014-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7918c07833567c8ac9b1f55aad79be5b5a8de16f0ed70cde2fa34580ad2859df
3
+ size 4993970216
model-00015-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:535fff52f9ca47d10f0712a465dc7b587cba437037c16c62aef6fc721a005ccf
3
+ size 4998455928
model-00016-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a312018300760135bfa0dae4d968df3697e6813717b3aeba84d3f9e70fb74cd1
3
+ size 4993994016
model-00017-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3be239ccda76955d1119fa1eabfeef0512429c66f4654a0db0da28a8176ca911
3
+ size 4996109552
model-00018-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eb908921941cf80fd78bfd60e46642d9f8c9205b74f12755997007414fd5a221
3
+ size 4996340392
model-00019-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:daf3fa66a460545668c7de27697cf04f1481cf1873c2628fbafd634b6db2d3d7
3
+ size 4993978632
model-00020-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:289565a3f4817652ea9cc2a8747abf160ad121f90a5000d55d59d427810f46b2
3
+ size 4998471600
model-00021-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4111a2d11f2e9bd322205ca90791e3ff80be99ae4a9d970a02e078014e36a22d
3
+ size 4993978624
model-00022-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8629d3a3dba1eb35656f6fec549d797b61e59cd254a887e32b56f7e1cd1bc017
3
+ size 3450560960
model-00023-of-00023.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7b705792f86d54e5c8f859fa7de49f88fffa1391373e24a93110fb1f13ab6987
3
+ size 4294967424
model.safetensors.index.json ADDED
The diff for this file is too large to render. See raw diff
 
modeling_sarvam_moe.py ADDED
@@ -0,0 +1,993 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2026 Sarvam AI team. All rights reserved.
2
+ #
3
+ # This code is based on Llama and Deepseek MoE implementations
4
+ # in this library. It has been modified from its original forms to
5
+ # accommodate Sarvam's MLA (multi-latent attention) MoE architecture.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ import math
20
+ import warnings
21
+ from typing import List, Optional, Tuple, Union
22
+
23
+ import torch
24
+ import torch.nn.functional as F
25
+ import torch.utils.checkpoint
26
+ from torch import nn
27
+ from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss
28
+
29
+ from transformers.activations import ACT2FN
30
+ from transformers.cache_utils import Cache, DynamicCache
31
+ from transformers.modeling_attn_mask_utils import (
32
+ AttentionMaskConverter,
33
+ _prepare_4d_attention_mask,
34
+ _prepare_4d_causal_attention_mask,
35
+ )
36
+ from transformers.modeling_outputs import (
37
+ BaseModelOutputWithPast,
38
+ CausalLMOutputWithPast,
39
+ )
40
+ from transformers.modeling_utils import PreTrainedModel, ALL_ATTENTION_FUNCTIONS
41
+ from transformers.pytorch_utils import (
42
+ ALL_LAYERNORM_LAYERS,
43
+ is_torch_greater_or_equal_than_1_13,
44
+ )
45
+ from transformers.utils import (
46
+ add_start_docstrings,
47
+ add_start_docstrings_to_model_forward,
48
+ logging,
49
+ replace_return_docstrings,
50
+ )
51
+ from transformers.utils.import_utils import is_torch_fx_available
52
+
53
+ import torch.distributed as dist
54
+ import numpy as np
55
+
56
+ from .configuration_sarvam_moe import SarvamMLAConfig
57
+
58
+ if is_torch_fx_available():
59
+ if not is_torch_greater_or_equal_than_1_13:
60
+ import torch.fx
61
+
62
+ _prepare_4d_causal_attention_mask = torch.fx.wrap(_prepare_4d_causal_attention_mask)
63
+
64
+
65
+ logger = logging.get_logger(__name__)
66
+
67
+ _CONFIG_FOR_DOC = "SarvamMLAConfig"
68
+
69
+
70
+ def _get_unpad_data(attention_mask):
71
+ seqlens_in_batch = attention_mask.sum(dim=-1, dtype=torch.int32)
72
+ indices = torch.nonzero(attention_mask.flatten(), as_tuple=False).flatten()
73
+ max_seqlen_in_batch = seqlens_in_batch.max().item()
74
+ cu_seqlens = F.pad(torch.cumsum(seqlens_in_batch, dim=0, dtype=torch.torch.int32), (1, 0))
75
+ return (
76
+ indices,
77
+ cu_seqlens,
78
+ max_seqlen_in_batch,
79
+ )
80
+
81
+
82
+ def _get_usable_past_kv_length(cache: Cache, new_seq_length: int, layer_idx: int = 0) -> int:
83
+ previous_length = cache.get_seq_length(layer_idx)
84
+ # Dynamic layers return -1, static layers return an int
85
+ max_length = cache.get_max_cache_shape(layer_idx)
86
+ if max_length is not None and max_length != -1 and previous_length + new_seq_length > max_length:
87
+ return max_length - new_seq_length
88
+ return previous_length
89
+
90
+
91
+ class SarvamMLARMSNorm(nn.Module):
92
+ def __init__(self, hidden_size, eps=1e-6):
93
+ """
94
+ SarvamMLARMSNorm is equivalent to T5LayerNorm
95
+ """
96
+ super().__init__()
97
+ self.weight = nn.Parameter(torch.ones(hidden_size))
98
+ self.variance_epsilon = eps
99
+
100
+ def forward(self, hidden_states):
101
+ input_dtype = hidden_states.dtype
102
+ hidden_states = hidden_states.to(torch.float32)
103
+ variance = hidden_states.pow(2).mean(-1, keepdim=True)
104
+ hidden_states = hidden_states * torch.rsqrt(variance + self.variance_epsilon)
105
+ return self.weight * hidden_states.to(input_dtype)
106
+
107
+
108
+ ALL_LAYERNORM_LAYERS.append(SarvamMLARMSNorm)
109
+
110
+
111
+ class SarvamMLARotaryEmbedding(nn.Module):
112
+ def __init__(self, dim, max_position_embeddings=2048, base=10000, device=None):
113
+ super().__init__()
114
+
115
+ self.dim = dim
116
+ self.max_position_embeddings = max_position_embeddings
117
+ self.base = base
118
+ inv_freq = 1.0 / (self.base ** (torch.arange(0, self.dim, 2).float().to(device) / self.dim))
119
+ self.register_buffer("inv_freq", inv_freq, persistent=False)
120
+
121
+ self._set_cos_sin_cache(
122
+ seq_len=max_position_embeddings,
123
+ device=self.inv_freq.device,
124
+ dtype=torch.get_default_dtype(),
125
+ )
126
+ self.max_seq_len_cached = None
127
+
128
+ def _set_cos_sin_cache(self, seq_len, device, dtype):
129
+ self.max_seq_len_cached = seq_len
130
+ t = torch.arange(self.max_seq_len_cached, device=device, dtype=self.inv_freq.dtype)
131
+
132
+ freqs = torch.outer(t, self.inv_freq.to(t.device))
133
+ emb = torch.cat((freqs, freqs), dim=-1)
134
+ self.register_buffer("cos_cached", emb.cos().to(dtype), persistent=False)
135
+ self.register_buffer("sin_cached", emb.sin().to(dtype), persistent=False)
136
+
137
+ def forward(self, x, seq_len=None):
138
+ if self.max_seq_len_cached is None or seq_len > self.max_seq_len_cached:
139
+ self._set_cos_sin_cache(seq_len=seq_len, device=x.device, dtype=x.dtype)
140
+
141
+ return (
142
+ self.cos_cached[:seq_len].to(dtype=x.dtype),
143
+ self.sin_cached[:seq_len].to(dtype=x.dtype),
144
+ )
145
+
146
+
147
+ def yarn_find_correction_dim(num_rotations, dim, base=10000, max_position_embeddings=2048):
148
+ return (dim * math.log(max_position_embeddings / (num_rotations * 2 * math.pi))) / (2 * math.log(base))
149
+
150
+
151
+ def yarn_find_correction_range(low_rot, high_rot, dim, base=10000, max_position_embeddings=2048):
152
+ low = math.floor(yarn_find_correction_dim(low_rot, dim, base, max_position_embeddings))
153
+ high = math.ceil(yarn_find_correction_dim(high_rot, dim, base, max_position_embeddings))
154
+ return max(low, 0), min(high, dim - 1)
155
+
156
+
157
+ def yarn_get_mscale(scale=1, mscale=1):
158
+ if scale <= 1:
159
+ return 1.0
160
+ return 0.1 * mscale * math.log(scale) + 1.0
161
+
162
+
163
+ def yarn_linear_ramp_mask(min_val, max_val, dim):
164
+ if min_val == max_val:
165
+ max_val += 0.001
166
+ linear_func = (torch.arange(dim, dtype=torch.float32) - min_val) / (max_val - min_val)
167
+ return torch.clamp(linear_func, 0, 1)
168
+
169
+
170
+ class SarvamMLAYarnRotaryEmbedding(SarvamMLARotaryEmbedding):
171
+ def __init__(
172
+ self,
173
+ dim,
174
+ max_position_embeddings=2048,
175
+ base=10000,
176
+ device=None,
177
+ scaling_factor=40.0,
178
+ original_max_position_embeddings=4096,
179
+ beta_fast=32,
180
+ beta_slow=1,
181
+ mscale=1.0,
182
+ mscale_all_dim=1.0,
183
+ ):
184
+ self.scaling_factor = float(scaling_factor)
185
+ self.original_max_position_embeddings = int(original_max_position_embeddings)
186
+ self.beta_fast = float(beta_fast)
187
+ self.beta_slow = float(beta_slow)
188
+ self.mscale = float(mscale)
189
+ self.mscale_all_dim = float(mscale_all_dim)
190
+ super().__init__(dim, max_position_embeddings, base, device)
191
+
192
+ def _set_cos_sin_cache(self, seq_len, device, dtype):
193
+ self.max_seq_len_cached = seq_len
194
+ dim = self.dim
195
+
196
+ freq_extra = 1.0 / (self.base ** (torch.arange(0, dim, 2, dtype=torch.float32, device=device) / dim))
197
+ freq_inter = 1.0 / (
198
+ self.scaling_factor * self.base ** (torch.arange(0, dim, 2, dtype=torch.float32, device=device) / dim)
199
+ )
200
+
201
+ low, high = yarn_find_correction_range(
202
+ self.beta_fast,
203
+ self.beta_slow,
204
+ dim,
205
+ self.base,
206
+ self.original_max_position_embeddings,
207
+ )
208
+
209
+ inv_freq_mask = 1.0 - yarn_linear_ramp_mask(low, high, dim // 2).to(device=device, dtype=torch.float32)
210
+ inv_freq = freq_inter * (1 - inv_freq_mask) + freq_extra * inv_freq_mask
211
+ self.register_buffer("inv_freq", inv_freq, persistent=False)
212
+
213
+ t = torch.arange(seq_len, device=device, dtype=torch.float32)
214
+ freqs = torch.outer(t, inv_freq)
215
+
216
+ _mscale = float(
217
+ yarn_get_mscale(self.scaling_factor, self.mscale)
218
+ / yarn_get_mscale(self.scaling_factor, self.mscale_all_dim)
219
+ )
220
+
221
+ emb = torch.cat((freqs, freqs), dim=-1)
222
+ self.register_buffer("cos_cached", (emb.cos() * _mscale).to(dtype), persistent=False)
223
+ self.register_buffer("sin_cached", (emb.sin() * _mscale).to(dtype), persistent=False)
224
+
225
+
226
+ # Copied from transformers.models.llama.modeling_llama.rotate_half
227
+ def rotate_half(x):
228
+ """Rotates half the hidden dims of the input."""
229
+ x1 = x[..., : x.shape[-1] // 2]
230
+ x2 = x[..., x.shape[-1] // 2 :]
231
+ return torch.cat((-x2, x1), dim=-1)
232
+
233
+
234
+ # Copied from transformers.models.llama.modeling_llama.apply_rotary_pos_emb
235
+ def apply_rotary_pos_emb(q, k, cos, sin, position_ids, unsqueeze_dim=1):
236
+ cos = cos[position_ids].unsqueeze(unsqueeze_dim)
237
+ sin = sin[position_ids].unsqueeze(unsqueeze_dim)
238
+
239
+ b, h, s, d = q.shape
240
+ q = q.view(b, h, s, d // 2, 2).transpose(4, 3).reshape(b, h, s, d)
241
+
242
+ b, h, s, d = k.shape
243
+ k = k.view(b, h, s, d // 2, 2).transpose(4, 3).reshape(b, h, s, d)
244
+
245
+ q_embed = (q * cos) + (rotate_half(q) * sin)
246
+ k_embed = (k * cos) + (rotate_half(k) * sin)
247
+ return q_embed, k_embed
248
+
249
+
250
+ class SarvamMLAMLP(nn.Module):
251
+ def __init__(self, config, hidden_size=None, intermediate_size=None):
252
+ super().__init__()
253
+ self.config = config
254
+ self.hidden_size = config.hidden_size if hidden_size is None else hidden_size
255
+ self.intermediate_size = config.intermediate_size if intermediate_size is None else intermediate_size
256
+
257
+ self.gate_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False)
258
+ self.up_proj = nn.Linear(self.hidden_size, self.intermediate_size, bias=False)
259
+ self.down_proj = nn.Linear(self.intermediate_size, self.hidden_size, bias=False)
260
+ self.act_fn = ACT2FN[config.hidden_act]
261
+
262
+ def forward(self, x):
263
+ down_proj = self.down_proj(self.act_fn(self.gate_proj(x)) * self.up_proj(x))
264
+ return down_proj
265
+
266
+
267
+ class MoEGate(nn.Module):
268
+ def __init__(self, config):
269
+ super().__init__()
270
+ self.config = config
271
+ self.top_k = config.num_experts_per_tok
272
+ self.n_routed_experts = config.num_experts
273
+ self.routed_scaling_factor = config.routed_scaling_factor
274
+ self.scoring_func = "sigmoid"
275
+ self.topk_method = "noaux_tc"
276
+ self.n_group = getattr(config, "n_group", self.n_routed_experts // 8)
277
+ self.topk_group = getattr(config, "topk_group", 2)
278
+
279
+ self.norm_topk_prob = True
280
+ self.gating_dim = config.hidden_size
281
+ self.weight = nn.Parameter(torch.empty((self.n_routed_experts, self.gating_dim)))
282
+ if self.topk_method == "noaux_tc":
283
+ self.e_score_correction_bias = nn.Parameter(torch.empty((self.n_routed_experts)))
284
+ self.reset_parameters()
285
+
286
+ def reset_parameters(self) -> None:
287
+ import torch.nn.init as init
288
+
289
+ init.kaiming_uniform_(self.weight, a=math.sqrt(5))
290
+ if hasattr(self, "e_score_correction_bias"):
291
+ init.zeros_(self.e_score_correction_bias)
292
+
293
+ def forward(self, hidden_states):
294
+ bsz, seq_len, h = hidden_states.shape
295
+ hidden_states = hidden_states.view(-1, h)
296
+ logits = F.linear(hidden_states.type(torch.float32), self.weight.type(torch.float32), None)
297
+ if self.scoring_func == "sigmoid":
298
+ scores = logits.sigmoid()
299
+ else:
300
+ raise NotImplementedError(f"insupportable scoring function for MoE gating: {self.scoring_func}")
301
+
302
+ if self.topk_method == "noaux_tc":
303
+ assert not self.training
304
+ scores_for_choice = scores.view(bsz * seq_len, -1) + self.e_score_correction_bias.unsqueeze(0)
305
+ group_scores = (
306
+ scores_for_choice.view(bsz * seq_len, self.n_group, -1).topk(2, dim=-1)[0].sum(dim=-1)
307
+ ) # [n, n_group]
308
+ group_idx = torch.topk(group_scores, k=self.topk_group, dim=-1, sorted=False)[1] # [n, top_k_group]
309
+ group_mask = torch.zeros_like(group_scores) # [n, n_group]
310
+ group_mask.scatter_(1, group_idx, 1) # [n, n_group]
311
+ score_mask = (
312
+ group_mask.unsqueeze(-1)
313
+ .expand(bsz * seq_len, self.n_group, self.n_routed_experts // self.n_group)
314
+ .reshape(bsz * seq_len, -1)
315
+ ) # [n, e]
316
+ tmp_scores = scores_for_choice.masked_fill(~score_mask.bool(), float("-inf")) # [n, e]
317
+ _, topk_idx = torch.topk(tmp_scores, k=self.top_k, dim=-1, sorted=False)
318
+ topk_weight = scores.gather(1, topk_idx)
319
+ else:
320
+ raise NotImplementedError(f"insupportable TopK function for MoE gating: {self.topk_method}")
321
+
322
+ ### norm gate to sum 1
323
+ if self.top_k > 1 and self.norm_topk_prob:
324
+ denominator = topk_weight.sum(dim=-1, keepdim=True) + 1e-20
325
+ topk_weight = topk_weight / denominator
326
+ topk_weight = topk_weight * self.routed_scaling_factor # must multiply the scaling factor
327
+
328
+ return topk_idx, topk_weight
329
+
330
+
331
+ class SarvamMLAMoE(nn.Module):
332
+ def __init__(self, config):
333
+ super().__init__()
334
+ self.config = config
335
+ self.num_experts_per_tok = config.num_experts_per_tok
336
+
337
+ if hasattr(config, "ep_size") and config.ep_size > 1:
338
+ assert config.ep_size == dist.get_world_size()
339
+ self.ep_size = config.ep_size
340
+ self.experts_per_rank = config.num_experts // config.ep_size
341
+ self.ep_rank = dist.get_rank()
342
+ self.experts = nn.ModuleList(
343
+ [
344
+ (
345
+ SarvamMLAMLP(config, intermediate_size=config.moe_intermediate_size)
346
+ if i >= self.ep_rank * self.experts_per_rank and i < (self.ep_rank + 1) * self.experts_per_rank
347
+ else None
348
+ )
349
+ for i in range(config.num_experts)
350
+ ]
351
+ )
352
+ else:
353
+ self.ep_size = 1
354
+ self.experts_per_rank = config.num_experts
355
+ self.ep_rank = 0
356
+ self.experts = nn.ModuleList(
357
+ [
358
+ SarvamMLAMLP(config, intermediate_size=config.moe_intermediate_size)
359
+ for i in range(config.num_experts)
360
+ ]
361
+ )
362
+ self.gate = MoEGate(config)
363
+ if (
364
+ hasattr(config, "num_shared_experts")
365
+ and config.num_shared_experts is not None
366
+ and config.num_shared_experts > 0
367
+ ):
368
+ intermediate_size = config.moe_intermediate_size * config.num_shared_experts
369
+ self.shared_experts = SarvamMLAMLP(config=config, intermediate_size=intermediate_size)
370
+ else:
371
+ self.shared_experts = None
372
+
373
+ def forward(self, hidden_states):
374
+ identity = hidden_states
375
+ orig_shape = hidden_states.shape
376
+ topk_idx, topk_weight = self.gate(hidden_states)
377
+ hidden_states = hidden_states.view(-1, hidden_states.shape[-1])
378
+ flat_topk_idx = topk_idx.view(-1)
379
+ if not self.training:
380
+ y = self.moe_infer(hidden_states, topk_idx, topk_weight).view(*orig_shape)
381
+ else:
382
+ # Training mode - simple implementation
383
+ # In practice, you'd want a more sophisticated training implementation
384
+ y = self.moe_infer(hidden_states, topk_idx, topk_weight).view(*orig_shape)
385
+ if self.shared_experts is not None:
386
+ y = y + self.shared_experts(identity)
387
+ return y
388
+
389
+ @torch.no_grad()
390
+ def moe_infer(self, x, topk_ids, topk_weight):
391
+ cnts = topk_ids.new_zeros((topk_ids.shape[0], len(self.experts)))
392
+ cnts.scatter_(1, topk_ids, 1)
393
+ tokens_per_expert = cnts.sum(dim=0)
394
+ idxs = topk_ids.view(-1).argsort()
395
+ sorted_tokens = x[idxs // topk_ids.shape[1]]
396
+ sorted_tokens_shape = sorted_tokens.shape
397
+ if self.ep_size > 1:
398
+ tokens_per_ep_rank = tokens_per_expert.view(self.ep_size, -1).sum(dim=1)
399
+ tokens_per_expert_group = tokens_per_expert.new_empty(tokens_per_expert.shape[0])
400
+ dist.all_to_all_single(tokens_per_expert_group, tokens_per_expert)
401
+ output_splits = tokens_per_expert_group.view(self.ep_size, -1).sum(1).cpu().numpy().tolist()
402
+ gathered_tokens = sorted_tokens.new_empty(
403
+ tokens_per_expert_group.sum(dim=0).cpu().item(), sorted_tokens.shape[1]
404
+ )
405
+ input_split_sizes = tokens_per_ep_rank.cpu().numpy().tolist()
406
+ dist.all_to_all(
407
+ list(gathered_tokens.split(output_splits)),
408
+ list(sorted_tokens.split(input_split_sizes)),
409
+ )
410
+ tokens_per_expert_post_gather = tokens_per_expert_group.view(self.ep_size, self.experts_per_rank).sum(dim=0)
411
+ gatherd_idxs = np.zeros(shape=(gathered_tokens.shape[0],), dtype=np.int32)
412
+ s = 0
413
+ for i, k in enumerate(tokens_per_expert_group.cpu().numpy()):
414
+ gatherd_idxs[s : s + k] = i % self.experts_per_rank
415
+ s += k
416
+ gatherd_idxs = gatherd_idxs.argsort()
417
+ sorted_tokens = gathered_tokens[gatherd_idxs]
418
+ tokens_per_expert = tokens_per_expert_post_gather
419
+ tokens_per_expert = tokens_per_expert.cpu().numpy()
420
+
421
+ outputs = []
422
+ start_idx = 0
423
+ for i, num_tokens in enumerate(tokens_per_expert):
424
+ end_idx = start_idx + num_tokens
425
+ if num_tokens == 0:
426
+ continue
427
+ expert = self.experts[i + self.ep_rank * self.experts_per_rank]
428
+ if expert is None:
429
+ continue
430
+ tokens_for_this_expert = sorted_tokens[start_idx:end_idx]
431
+ expert_out = expert(tokens_for_this_expert)
432
+ outputs.append(expert_out)
433
+ start_idx = end_idx
434
+
435
+ outs = torch.cat(outputs, dim=0) if len(outputs) else sorted_tokens.new_empty(0)
436
+ if self.ep_size > 1:
437
+ new_x = torch.empty_like(outs)
438
+ new_x[gatherd_idxs] = outs
439
+ gathered_tokens = new_x.new_empty(*sorted_tokens_shape)
440
+ dist.all_to_all(
441
+ list(gathered_tokens.split(input_split_sizes)),
442
+ list(new_x.split(output_splits)),
443
+ )
444
+ outs = gathered_tokens
445
+
446
+ new_x = torch.empty_like(outs)
447
+ new_x[idxs] = outs
448
+ final_out = (
449
+ new_x.view(*topk_ids.shape, -1)
450
+ .type(topk_weight.dtype)
451
+ .mul_(topk_weight.unsqueeze(dim=-1))
452
+ .sum(dim=1)
453
+ .type(new_x.dtype)
454
+ )
455
+ return final_out
456
+
457
+
458
+ # Copied from transformers.models.llama.modeling_llama.repeat_kv
459
+ def repeat_kv(hidden_states: torch.Tensor, n_rep: int) -> torch.Tensor:
460
+ batch, num_key_value_heads, slen, head_dim = hidden_states.shape
461
+ if n_rep == 1:
462
+ return hidden_states
463
+ hidden_states = hidden_states[:, :, None, :, :].expand(batch, num_key_value_heads, n_rep, slen, head_dim)
464
+ return hidden_states.reshape(batch, num_key_value_heads * n_rep, slen, head_dim)
465
+
466
+
467
+ class SarvamMLAAttention(nn.Module):
468
+ is_causal = True
469
+ def __init__(self, config: SarvamMLAConfig, layer_idx: Optional[int] = None):
470
+ super().__init__()
471
+ self.config = config
472
+ self.layer_idx = layer_idx
473
+ if layer_idx is None:
474
+ logger.warning_once(
475
+ f"Instantiating {self.__class__.__name__} without passing `layer_idx` is not recommended and will "
476
+ "to errors during the forward call, if caching is used. Please make sure to provide a `layer_idx` "
477
+ "when creating this class."
478
+ )
479
+
480
+ self.attention_dropout = config.attention_dropout
481
+ self.hidden_size = config.hidden_size
482
+ self.num_heads = config.num_attention_heads
483
+
484
+ self.max_position_embeddings = config.max_position_embeddings
485
+ self.rope_theta = config.rope_theta
486
+ self.q_lora_rank = getattr(config, "q_lora_rank", None)
487
+ self.qk_rope_head_dim = config.qk_rope_head_dim
488
+ self.kv_lora_rank = config.kv_lora_rank
489
+ self.v_head_dim = config.v_head_dim
490
+ self.qk_nope_head_dim = config.qk_nope_head_dim
491
+ self.q_head_dim = config.q_head_dim
492
+
493
+ if self.q_lora_rank is None:
494
+ self.q_proj = nn.Linear(self.hidden_size, self.num_heads * self.q_head_dim, bias=False)
495
+ else:
496
+ self.q_a_proj = nn.Linear(
497
+ self.hidden_size, config.q_lora_rank, bias=getattr(config, "attention_bias", False)
498
+ )
499
+ self.q_a_layernorm = SarvamMLARMSNorm(config.q_lora_rank)
500
+ self.q_b_proj = nn.Linear(config.q_lora_rank, self.num_heads * self.q_head_dim, bias=False)
501
+
502
+ self.kv_a_proj_with_mqa = nn.Linear(
503
+ self.hidden_size,
504
+ config.kv_lora_rank + config.qk_rope_head_dim,
505
+ bias=getattr(config, "attention_bias", False),
506
+ )
507
+ self.kv_a_layernorm = SarvamMLARMSNorm(config.kv_lora_rank)
508
+ self.kv_b_proj = nn.Linear(
509
+ config.kv_lora_rank,
510
+ self.num_heads * (self.q_head_dim - self.qk_rope_head_dim + self.v_head_dim),
511
+ bias=False,
512
+ )
513
+
514
+ self.o_proj = nn.Linear(
515
+ self.num_heads * self.v_head_dim,
516
+ self.hidden_size,
517
+ bias=getattr(config, "attention_bias", False),
518
+ )
519
+ self._init_rope()
520
+
521
+ self.softmax_scale = self.q_head_dim ** (-0.5)
522
+ if self.config.rope_scaling is not None:
523
+ mscale_all_dim = self.config.rope_scaling.get("mscale_all_dim", 0)
524
+ scaling_factor = self.config.rope_scaling["factor"]
525
+ if mscale_all_dim:
526
+ mscale = yarn_get_mscale(scaling_factor, mscale_all_dim)
527
+ self.softmax_scale = self.softmax_scale * mscale * mscale
528
+
529
+ def _init_rope(self):
530
+ rope_scaling = getattr(self.config, "rope_scaling", None)
531
+ if rope_scaling is None or rope_scaling.get("type", None) in (None, "default"):
532
+ self.rotary_emb = SarvamMLARotaryEmbedding(
533
+ self.qk_rope_head_dim,
534
+ max_position_embeddings=self.max_position_embeddings,
535
+ base=self.rope_theta,
536
+ )
537
+ return
538
+
539
+ rope_type = rope_scaling.get("type")
540
+ if rope_type == "deepseek_yarn":
541
+ self.rotary_emb = SarvamMLAYarnRotaryEmbedding(
542
+ self.qk_rope_head_dim,
543
+ max_position_embeddings=self.max_position_embeddings,
544
+ base=self.rope_theta,
545
+ scaling_factor=rope_scaling.get("factor", 40.0),
546
+ original_max_position_embeddings=rope_scaling.get("original_max_position_embeddings", 4096),
547
+ beta_fast=rope_scaling.get("beta_fast", 32),
548
+ beta_slow=rope_scaling.get("beta_slow", 1),
549
+ mscale=rope_scaling.get("mscale", 1.0),
550
+ mscale_all_dim=rope_scaling.get("mscale_all_dim", 1.0),
551
+ )
552
+ return
553
+ raise ValueError(f"Unknown rope_scaling type: {rope_type}")
554
+
555
+ def _shape(self, tensor: torch.Tensor, seq_len: int, bsz: int):
556
+ return tensor.view(bsz, seq_len, self.num_heads, self.v_head_dim).transpose(1, 2).contiguous()
557
+
558
+ def forward(
559
+ self,
560
+ hidden_states: torch.Tensor,
561
+ attention_mask: Optional[torch.Tensor] = None,
562
+ position_ids: Optional[torch.LongTensor] = None,
563
+ past_key_value: Optional[Cache] = None,
564
+ output_attentions: bool = False,
565
+ use_cache: bool = False,
566
+ **kwargs,
567
+ ) -> Tuple[torch.Tensor, Optional[torch.Tensor], Optional[Tuple[torch.Tensor]]]:
568
+ bsz, q_len, _ = hidden_states.size()
569
+
570
+ if self.q_lora_rank is None:
571
+ q = self.q_proj(hidden_states)
572
+ else:
573
+ q = self.q_b_proj(self.q_a_layernorm(self.q_a_proj(hidden_states)))
574
+ q = q.view(bsz, q_len, self.num_heads, self.q_head_dim).transpose(1, 2)
575
+ q_nope, q_pe = torch.split(q, [self.qk_nope_head_dim, self.qk_rope_head_dim], dim=-1)
576
+
577
+ compressed_kv = self.kv_a_proj_with_mqa(hidden_states)
578
+ compressed_kv, k_pe = torch.split(compressed_kv, [self.kv_lora_rank, self.qk_rope_head_dim], dim=-1)
579
+ k_pe = k_pe.view(bsz, q_len, 1, self.qk_rope_head_dim).transpose(1, 2)
580
+ kv = (
581
+ self.kv_b_proj(self.kv_a_layernorm(compressed_kv))
582
+ .view(bsz, q_len, self.num_heads, self.qk_nope_head_dim + self.v_head_dim)
583
+ .transpose(1, 2)
584
+ )
585
+
586
+ k_nope, value_states = torch.split(kv, [self.qk_nope_head_dim, self.v_head_dim], dim=-1)
587
+ kv_seq_len = value_states.shape[-2]
588
+ if past_key_value is not None:
589
+ if self.layer_idx is None:
590
+ raise ValueError(
591
+ f"The cache structure has changed in a previous version. If you are using {self.__class__.__name__} "
592
+ "for auto-regressive decoding with k/v caching, please make sure to initialize the attention class "
593
+ "with a layer index."
594
+ )
595
+ kv_seq_len += _get_usable_past_kv_length(past_key_value, kv_seq_len, self.layer_idx)
596
+ cos, sin = self.rotary_emb(value_states, seq_len=kv_seq_len)
597
+
598
+ q_pe, k_pe = apply_rotary_pos_emb(q_pe, k_pe, cos, sin, position_ids)
599
+
600
+ query_states = k_pe.new_empty(bsz, self.num_heads, q_len, self.q_head_dim)
601
+ query_states[:, :, :, : self.qk_nope_head_dim] = q_nope
602
+ query_states[:, :, :, self.qk_nope_head_dim :] = q_pe
603
+
604
+ key_states = k_pe.new_empty(bsz, self.num_heads, q_len, self.q_head_dim)
605
+ key_states[:, :, :, : self.qk_nope_head_dim] = k_nope
606
+ key_states[:, :, :, self.qk_nope_head_dim :] = k_pe
607
+ if past_key_value is not None:
608
+ cache_kwargs = {"sin": sin, "cos": cos} # Specific to RoPE models
609
+ key_states, value_states = past_key_value.update(key_states, value_states, self.layer_idx, cache_kwargs)
610
+
611
+ attn_weights = torch.matmul(query_states, key_states.transpose(2, 3)) * self.softmax_scale
612
+
613
+ if attn_weights.size() != (bsz, self.num_heads, q_len, kv_seq_len):
614
+ raise ValueError(
615
+ f"Attention weights should be of size {(bsz, self.num_heads, q_len, kv_seq_len)}, but is"
616
+ f" {attn_weights.size()}"
617
+ )
618
+ assert attention_mask is not None
619
+ if attention_mask is not None:
620
+ if attention_mask.size() != (bsz, 1, q_len, kv_seq_len):
621
+ raise ValueError(
622
+ f"Attention mask should be of size {(bsz, 1, q_len, kv_seq_len)}, but is {attention_mask.size()}"
623
+ )
624
+ attn_weights = attn_weights + attention_mask
625
+
626
+ attn_weights = nn.functional.softmax(attn_weights, dim=-1, dtype=torch.float32).to(query_states.dtype)
627
+ attn_weights = nn.functional.dropout(attn_weights, p=self.attention_dropout, training=self.training)
628
+ attn_output = torch.matmul(attn_weights, value_states)
629
+
630
+ if attn_output.size() != (bsz, self.num_heads, q_len, self.v_head_dim):
631
+ raise ValueError(
632
+ f"`attn_output` should be of size {(bsz, self.num_heads, q_len, self.v_head_dim)}, but is"
633
+ f" {attn_output.size()}"
634
+ )
635
+ attn_output = attn_output.transpose(1, 2).contiguous()
636
+ attn_output = attn_output.reshape(bsz, q_len, self.num_heads * self.v_head_dim)
637
+ attn_output = self.o_proj(attn_output)
638
+
639
+ if not output_attentions:
640
+ attn_weights = None
641
+
642
+ return attn_output, attn_weights, past_key_value
643
+
644
+
645
+ class SarvamMLADecoderLayer(nn.Module):
646
+ def __init__(self, config: SarvamMLAConfig, layer_idx: int):
647
+ super().__init__()
648
+ self.hidden_size = config.hidden_size
649
+ self.self_attn = SarvamMLAAttention(config=config, layer_idx=layer_idx)
650
+
651
+ use_moe = (
652
+ hasattr(config, "num_experts")
653
+ and config.num_experts is not None
654
+ and layer_idx >= getattr(config, "first_k_dense_replace", 0)
655
+ and layer_idx % getattr(config, "moe_layer_freq", 1) == 0
656
+ )
657
+
658
+ self.mlp = SarvamMLAMoE(config) if use_moe else SarvamMLAMLP(config)
659
+ self.input_layernorm = SarvamMLARMSNorm(config.hidden_size, eps=config.rms_norm_eps)
660
+ self.post_attention_layernorm = SarvamMLARMSNorm(config.hidden_size, eps=config.rms_norm_eps)
661
+
662
+ def forward(
663
+ self,
664
+ hidden_states: torch.Tensor,
665
+ attention_mask: Optional[torch.Tensor] = None,
666
+ position_ids: Optional[torch.LongTensor] = None,
667
+ past_key_value: Optional[Tuple[torch.Tensor]] = None,
668
+ output_attentions: Optional[bool] = False,
669
+ use_cache: Optional[bool] = False,
670
+ **kwargs,
671
+ ) -> Tuple[torch.FloatTensor, Optional[Tuple[torch.FloatTensor, torch.FloatTensor]]]:
672
+ residual = hidden_states
673
+ hidden_states = self.input_layernorm(hidden_states)
674
+
675
+ hidden_states, self_attn_weights, present_key_value = self.self_attn(
676
+ hidden_states=hidden_states,
677
+ attention_mask=attention_mask,
678
+ position_ids=position_ids,
679
+ past_key_value=past_key_value,
680
+ output_attentions=output_attentions,
681
+ use_cache=use_cache,
682
+ **kwargs,
683
+ )
684
+ hidden_states = residual + hidden_states
685
+
686
+ residual = hidden_states
687
+ hidden_states = self.post_attention_layernorm(hidden_states)
688
+ hidden_states = self.mlp(hidden_states)
689
+ hidden_states = residual + hidden_states
690
+
691
+ outputs = (hidden_states,)
692
+
693
+ if output_attentions:
694
+ outputs += (self_attn_weights,)
695
+ if use_cache:
696
+ outputs += (present_key_value,)
697
+ return outputs
698
+
699
+
700
+ class SarvamMLAPreTrainedModel(PreTrainedModel):
701
+ config_class = SarvamMLAConfig
702
+ base_model_prefix = "model"
703
+ supports_gradient_checkpointing = True
704
+ _no_split_modules = ["SarvamMLADecoderLayer"]
705
+ _skip_keys_device_placement = "past_key_values"
706
+ _supports_flash_attn_2 = False # Not implemented yet
707
+ _supports_cache_class = True
708
+
709
+ def _init_weights(self, module):
710
+ std = self.config.initializer_range
711
+ if isinstance(module, nn.Linear):
712
+ module.weight.data.normal_(mean=0.0, std=std)
713
+ if module.bias is not None:
714
+ module.bias.data.zero_()
715
+ elif isinstance(module, nn.Embedding):
716
+ module.weight.data.normal_(mean=0.0, std=std)
717
+ if module.padding_idx is not None:
718
+ module.weight.data[module.padding_idx].zero_()
719
+
720
+
721
+ class SarvamMLAModel(SarvamMLAPreTrainedModel):
722
+ def __init__(self, config: SarvamMLAConfig):
723
+ super().__init__(config)
724
+ self.padding_idx = config.pad_token_id
725
+ self.vocab_size = config.vocab_size
726
+
727
+ self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.padding_idx)
728
+ self.layers = nn.ModuleList(
729
+ [SarvamMLADecoderLayer(config, layer_idx) for layer_idx in range(config.num_hidden_layers)]
730
+ )
731
+ self._use_flash_attention_2 = False # Not implemented yet
732
+ self.norm = SarvamMLARMSNorm(config.hidden_size, eps=config.rms_norm_eps)
733
+
734
+ self.gradient_checkpointing = False
735
+ # Initialize weights and apply final processing
736
+ self.post_init()
737
+
738
+ def get_input_embeddings(self):
739
+ return self.embed_tokens
740
+
741
+ def set_input_embeddings(self, value):
742
+ self.embed_tokens = value
743
+
744
+ def forward(
745
+ self,
746
+ input_ids: torch.LongTensor = None,
747
+ attention_mask: Optional[torch.Tensor] = None,
748
+ position_ids: Optional[torch.LongTensor] = None,
749
+ past_key_values: Optional[List[torch.FloatTensor]] = None,
750
+ inputs_embeds: Optional[torch.FloatTensor] = None,
751
+ use_cache: Optional[bool] = None,
752
+ output_attentions: Optional[bool] = None,
753
+ output_hidden_states: Optional[bool] = None,
754
+ return_dict: Optional[bool] = None,
755
+ ) -> Union[Tuple, BaseModelOutputWithPast]:
756
+ output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
757
+ output_hidden_states = (
758
+ output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
759
+ )
760
+ use_cache = use_cache if use_cache is not None else self.config.use_cache
761
+
762
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
763
+
764
+ # retrieve input_ids and inputs_embeds
765
+ if input_ids is not None and inputs_embeds is not None:
766
+ raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
767
+ elif input_ids is not None:
768
+ batch_size, seq_length = input_ids.shape[:2]
769
+ elif inputs_embeds is not None:
770
+ batch_size, seq_length = inputs_embeds.shape[:2]
771
+ else:
772
+ raise ValueError("You have to specify either input_ids or inputs_embeds")
773
+
774
+ past_key_values_length = 0
775
+ if use_cache:
776
+ use_legacy_cache = not isinstance(past_key_values, Cache)
777
+ if use_legacy_cache:
778
+ past_key_values = DynamicCache.from_legacy_cache(past_key_values)
779
+ past_key_values_length = _get_usable_past_kv_length(past_key_values, seq_length)
780
+
781
+ if position_ids is None:
782
+ device = input_ids.device if input_ids is not None else inputs_embeds.device
783
+ position_ids = torch.arange(
784
+ past_key_values_length,
785
+ seq_length + past_key_values_length,
786
+ dtype=torch.long,
787
+ device=device,
788
+ )
789
+ position_ids = position_ids.unsqueeze(0)
790
+
791
+ if inputs_embeds is None:
792
+ inputs_embeds = self.embed_tokens(input_ids)
793
+
794
+ attention_mask = _prepare_4d_causal_attention_mask(
795
+ attention_mask,
796
+ (batch_size, seq_length),
797
+ inputs_embeds,
798
+ past_key_values_length,
799
+ )
800
+
801
+ hidden_states = inputs_embeds
802
+ all_hidden_states = () if output_hidden_states else None
803
+ all_self_attns = () if output_attentions else None
804
+ next_decoder_cache = None
805
+
806
+ for decoder_layer in self.layers:
807
+ if output_hidden_states:
808
+ all_hidden_states += (hidden_states,)
809
+
810
+ layer_outputs = decoder_layer(
811
+ hidden_states,
812
+ attention_mask=attention_mask,
813
+ position_ids=position_ids,
814
+ past_key_value=past_key_values,
815
+ output_attentions=output_attentions,
816
+ use_cache=use_cache,
817
+ )
818
+
819
+ hidden_states = layer_outputs[0]
820
+ if use_cache:
821
+ next_decoder_cache = layer_outputs[2 if output_attentions else 1]
822
+ if output_attentions:
823
+ all_self_attns += (layer_outputs[1],)
824
+
825
+ hidden_states = self.norm(hidden_states)
826
+
827
+ if output_hidden_states:
828
+ all_hidden_states += (hidden_states,)
829
+
830
+ next_cache = None
831
+ if use_cache:
832
+ next_cache = next_decoder_cache.to_legacy_cache() if use_legacy_cache else next_decoder_cache
833
+ if not return_dict:
834
+ return tuple(v for v in [hidden_states, next_cache, all_hidden_states, all_self_attns] if v is not None)
835
+ return BaseModelOutputWithPast(
836
+ last_hidden_state=hidden_states,
837
+ past_key_values=next_cache,
838
+ hidden_states=all_hidden_states,
839
+ attentions=all_self_attns,
840
+ )
841
+
842
+
843
+ class SarvamMLAForCausalLM(SarvamMLAPreTrainedModel):
844
+ _tied_weights_keys = ["lm_head.weight"]
845
+
846
+ def __init__(self, config):
847
+ super().__init__(config)
848
+ self.model = SarvamMLAModel(config)
849
+ self.vocab_size = config.vocab_size
850
+ self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False)
851
+ self.post_init()
852
+
853
+ def get_input_embeddings(self):
854
+ return self.model.embed_tokens
855
+
856
+ def set_input_embeddings(self, value):
857
+ self.model.embed_tokens = value
858
+
859
+ def get_output_embeddings(self):
860
+ return self.lm_head
861
+
862
+ def set_output_embeddings(self, new_embeddings):
863
+ self.lm_head = new_embeddings
864
+
865
+ def set_decoder(self, decoder):
866
+ self.model = decoder
867
+
868
+ def get_decoder(self):
869
+ return self.model
870
+
871
+ def forward(
872
+ self,
873
+ input_ids: torch.LongTensor = None,
874
+ attention_mask: Optional[torch.Tensor] = None,
875
+ position_ids: Optional[torch.LongTensor] = None,
876
+ past_key_values: Optional[List[torch.FloatTensor]] = None,
877
+ inputs_embeds: Optional[torch.FloatTensor] = None,
878
+ labels: Optional[torch.LongTensor] = None,
879
+ use_cache: Optional[bool] = None,
880
+ output_attentions: Optional[bool] = None,
881
+ output_hidden_states: Optional[bool] = None,
882
+ return_dict: Optional[bool] = None,
883
+ ) -> Union[Tuple, CausalLMOutputWithPast]:
884
+ output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
885
+ output_hidden_states = (
886
+ output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
887
+ )
888
+ return_dict = return_dict if return_dict is not None else self.config.use_return_dict
889
+
890
+ outputs = self.model(
891
+ input_ids=input_ids,
892
+ attention_mask=attention_mask,
893
+ position_ids=position_ids,
894
+ past_key_values=past_key_values,
895
+ inputs_embeds=inputs_embeds,
896
+ use_cache=use_cache,
897
+ output_attentions=output_attentions,
898
+ output_hidden_states=output_hidden_states,
899
+ return_dict=return_dict,
900
+ )
901
+
902
+ hidden_states = outputs[0]
903
+ logits = self.lm_head(hidden_states)
904
+ logits = logits.float()
905
+
906
+ loss = None
907
+ if labels is not None:
908
+ # Shift so that tokens < n predict n
909
+ shift_logits = logits[..., :-1, :].contiguous()
910
+ shift_labels = labels[..., 1:].contiguous()
911
+ # Flatten the tokens
912
+ loss_fct = CrossEntropyLoss()
913
+ shift_logits = shift_logits.view(-1, self.config.vocab_size)
914
+ shift_labels = shift_labels.view(-1)
915
+ # Enable model parallelism
916
+ shift_labels = shift_labels.to(shift_logits.device)
917
+ loss = loss_fct(shift_logits, shift_labels)
918
+
919
+ if not return_dict:
920
+ output = (logits,) + outputs[1:]
921
+ return (loss,) + output if loss is not None else output
922
+
923
+ return CausalLMOutputWithPast(
924
+ loss=loss,
925
+ logits=logits,
926
+ past_key_values=outputs.past_key_values,
927
+ hidden_states=outputs.hidden_states,
928
+ attentions=outputs.attentions,
929
+ )
930
+
931
+ def prepare_inputs_for_generation(
932
+ self,
933
+ input_ids,
934
+ past_key_values=None,
935
+ attention_mask=None,
936
+ inputs_embeds=None,
937
+ **kwargs,
938
+ ):
939
+ if past_key_values is not None:
940
+ if isinstance(past_key_values, Cache):
941
+ cache_length = past_key_values.get_seq_length()
942
+ past_length = past_key_values.get_seq_length() if past_key_values is not None else 0
943
+ if hasattr(past_key_values, "get_max_length"):
944
+ max_cache_length = past_key_values.get_max_length()
945
+ else:
946
+ max_cache_length = None
947
+ else:
948
+ cache_length = past_length = past_key_values[0][0].shape[2]
949
+ max_cache_length = None
950
+
951
+ if attention_mask is not None and attention_mask.shape[1] > input_ids.shape[1]:
952
+ input_ids = input_ids[:, -(attention_mask.shape[1] - past_length) :]
953
+ elif past_length < input_ids.shape[1]:
954
+ input_ids = input_ids[:, past_length:]
955
+
956
+ if (
957
+ max_cache_length is not None
958
+ and attention_mask is not None
959
+ and cache_length + input_ids.shape[1] > max_cache_length
960
+ ):
961
+ attention_mask = attention_mask[:, -max_cache_length:]
962
+
963
+ position_ids = kwargs.get("position_ids", None)
964
+ if attention_mask is not None and position_ids is None:
965
+ position_ids = attention_mask.long().cumsum(-1) - 1
966
+ position_ids.masked_fill_(attention_mask == 0, 1)
967
+ if past_key_values:
968
+ position_ids = position_ids[:, -input_ids.shape[1] :]
969
+
970
+ # if `inputs_embeds` are passed, we only want to use them in the 1st generation step
971
+ if inputs_embeds is not None and past_key_values is None:
972
+ model_inputs = {"inputs_embeds": inputs_embeds}
973
+ else:
974
+ model_inputs = {"input_ids": input_ids}
975
+
976
+ model_inputs.update(
977
+ {
978
+ "position_ids": position_ids,
979
+ "past_key_values": past_key_values,
980
+ "use_cache": kwargs.get("use_cache"),
981
+ "attention_mask": attention_mask,
982
+ }
983
+ )
984
+ return model_inputs
985
+
986
+ @staticmethod
987
+ def _reorder_cache(past_key_values, beam_idx):
988
+ reordered_past = ()
989
+ for layer_past in past_key_values:
990
+ reordered_past += (
991
+ tuple(past_state.index_select(0, beam_idx.to(past_state.device)) for past_state in layer_past),
992
+ )
993
+ return reordered_past
recipe.yaml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ default_stage:
2
+ default_modifiers:
3
+ QuantizationModifier:
4
+ targets: [Linear]
5
+ ignore: [lm_head]
6
+ scheme: FP8_DYNAMIC
7
+ bypass_divisibility_checks: false
special_tokens_map.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "boi_token": "<|start_of_image|>",
3
+ "bos_token": {
4
+ "content": "[@BOS@]",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false
9
+ },
10
+ "eoi_token": "<|end_of_image|>",
11
+ "eos_token": {
12
+ "content": "<|end_of_turn|>",
13
+ "lstrip": false,
14
+ "normalized": false,
15
+ "rstrip": false,
16
+ "single_word": false
17
+ },
18
+ "image_token": "<|image_soft_token|>",
19
+ "pad_token": {
20
+ "content": "<pad>",
21
+ "lstrip": false,
22
+ "normalized": false,
23
+ "rstrip": false,
24
+ "single_word": false
25
+ },
26
+ "unk_token": {
27
+ "content": "<unk>",
28
+ "lstrip": false,
29
+ "normalized": false,
30
+ "rstrip": false,
31
+ "single_word": false
32
+ }
33
+ }
tokenizer.json ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a574ceaaff7c7a8f091179c53fd17ae33567089c099d4ff37d4cb3bc1a87e80e
3
+ size 33627251
tokenizer_config.json ADDED
The diff for this file is too large to render. See raw diff