main
py 397 lines 14.6 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 """Inkling model configs for the text backbone and audio/vision towers."""
4
5 from __future__ import annotations
6
7 from dataclasses import dataclass, field
8 from typing import Any, ClassVar, Literal, cast
9
10 import torch
11 from transformers.configuration_utils import PreTrainedConfig
12
13
14 class InklingModelConfig(PreTrainedConfig):
15 model_type = "inkling_model"
16 keys_to_ignore_at_inference = ["past_key_values"]
17
18 def __init__(
19 self,
20 *,
21 vocab_size: int = 201024,
22 hidden_size: int = 1536,
23 intermediate_size: int = 768,
24 dense_intermediate_size: int | None = None,
25 moe_intermediate_size: int | None = None,
26 num_hidden_layers: int = 16,
27 num_attention_heads: int = 12,
28 num_key_value_heads: int = 4,
29 head_dim: int | None = None,
30 v_head_dim: int | None = None,
31 d_rel: int = 16,
32 rel_extent: int = 1024,
33 local_layer_ids: list[int] | None = None,
34 sliding_window_size: int = 512,
35 swa_num_attention_heads: int | None = None,
36 swa_num_key_value_heads: int | None = None,
37 swa_head_dim: int | None = None,
38 swa_v_head_dim: int | None = None,
39 rms_norm_eps: float = 1e-6,
40 hidden_act: str = "silu",
41 q_bias: bool = False,
42 o_bias: bool = False,
43 use_embed_norm: bool = False,
44 use_sconv: bool = False,
45 sconv_kernel_size: int | None = None,
46 conv_kernel_size: int | None = None,
47 dense_mlp_idx: int = 0,
48 n_routed_experts: int = 0,
49 n_shared_experts: int = 0,
50 num_experts_per_tok: int = 1,
51 route_scale: float = 1.0,
52 use_gate_bias: bool = False,
53 use_global_scale: bool = False,
54 norm_after_topk: bool = True,
55 gate_activation: Literal["sigmoid", "softmax"] = "sigmoid",
56 shared_expert_sink: bool = False,
57 shared_experts_size: int = 1,
58 inference_moe_w13_interleaved: bool = True,
59 log_scaling_n_floor: int | None = None,
60 log_scaling_alpha: float = 0.1,
61 unpadded_vocab_size: int | None = None,
62 padded_vocab_size: int | None = None,
63 logits_mup_width_multiplier: float | None = None,
64 final_logit_softcapping: float | None = None,
65 tie_word_embeddings: bool = False,
66 num_nextn_predict_layers: int = 0,
67 chain_hidden_post_norm: bool = False,
68 **kwargs: Any,
69 ) -> None:
70 if head_dim is None:
71 head_dim = hidden_size // num_attention_heads
72 if v_head_dim is None:
73 v_head_dim = head_dim
74 if swa_num_attention_heads is None:
75 swa_num_attention_heads = num_attention_heads
76 if swa_num_key_value_heads is None:
77 swa_num_key_value_heads = num_key_value_heads
78 if swa_head_dim is None:
79 swa_head_dim = head_dim
80 if swa_v_head_dim is None:
81 swa_v_head_dim = swa_head_dim
82 # OG format: https://huggingface.co/thinkingmachines/Inkling
83 # HF format: https://github.com/huggingface/transformers/blob/fe747d88a3296bd94d426db2717f232f9d4afdb7/src/transformers/models/inkling/configuration_inkling.py#L95
84 # Huggingface Transformers compatibility:
85 # HF intermediate_size == OG dense_intermediate_size
86 # HF moe_intermediate_size == OG intermediate_size
87 # HF conv_kernel_size == OG sconv_kernel_size
88 if (
89 moe_intermediate_size is not None
90 and intermediate_size is not None
91 and dense_intermediate_size is None
92 ):
93 dense_intermediate_size = intermediate_size
94 intermediate_size = moe_intermediate_size
95 if dense_intermediate_size is None:
96 dense_intermediate_size = intermediate_size
97 # HF conv_kernel_size == OG sconv_kernel_size
98 if sconv_kernel_size is None:
99 sconv_kernel_size = conv_kernel_size if conv_kernel_size is not None else 4
100 if local_layer_ids is None:
101 local_layer_ids = []
102
103 if padded_vocab_size is None:
104 padded_vocab_size = vocab_size
105 vocab_size = (
106 unpadded_vocab_size
107 if (
108 unpadded_vocab_size is not None
109 and unpadded_vocab_size < padded_vocab_size
110 )
111 else vocab_size
112 )
113
114 self.vocab_size = vocab_size
115 self.padded_vocab_size = padded_vocab_size
116 self.hidden_size = hidden_size
117 self.intermediate_size = intermediate_size
118 self.dense_intermediate_size = dense_intermediate_size
119 self.num_hidden_layers = num_hidden_layers
120 self.num_attention_heads = num_attention_heads
121 self.num_key_value_heads = num_key_value_heads
122 self.head_dim = head_dim
123 self.v_head_dim = v_head_dim
124 self.d_rel = d_rel
125 self.rel_extent = rel_extent
126 self.local_layer_ids = local_layer_ids
127 self.sliding_window_size = sliding_window_size
128 self.swa_num_attention_heads = swa_num_attention_heads
129 self.swa_num_key_value_heads = swa_num_key_value_heads
130 self.swa_head_dim = swa_head_dim
131 self.swa_v_head_dim = swa_v_head_dim
132 self.rms_norm_eps = rms_norm_eps
133 self.hidden_act = hidden_act
134 self.q_bias = q_bias
135 self.o_bias = o_bias
136 self.use_embed_norm = use_embed_norm
137 self.use_sconv = use_sconv
138 self.sconv_kernel_size = sconv_kernel_size
139 self.dense_mlp_idx = dense_mlp_idx
140 self.n_routed_experts = n_routed_experts
141 self.num_experts = n_routed_experts
142 self.n_shared_experts = n_shared_experts
143 self.num_shared_experts = n_shared_experts
144 self.num_experts_per_tok = num_experts_per_tok
145 self.route_scale = route_scale
146 self.use_gate_bias = use_gate_bias
147 self.use_global_scale = use_global_scale
148 self.norm_after_topk = norm_after_topk
149 self.gate_activation = gate_activation
150 self.shared_expert_sink = shared_expert_sink
151 self.shared_experts_size = shared_experts_size
152 self.inference_moe_w13_interleaved = inference_moe_w13_interleaved
153 self.log_scaling_n_floor = log_scaling_n_floor
154 self.log_scaling_alpha = log_scaling_alpha
155 self.unpadded_vocab_size = self.vocab_size
156 self.logits_mup_width_multiplier = logits_mup_width_multiplier
157 self.final_logit_softcapping = final_logit_softcapping
158 # MTP (multi-token prediction) draft head: number of depth layers in the
159 # checkpoint (0 if absent); chain_norm applied after each depth.
160 self.num_nextn_predict_layers = num_nextn_predict_layers
161 self.chain_hidden_post_norm = chain_hidden_post_norm
162
163 super().__init__(tie_word_embeddings=tie_word_embeddings, **kwargs)
164
165 @property
166 def conv_layer_ids(self) -> list[int]:
167 return list(range(self.num_hidden_layers))
168
169 @property
170 def linear_layer_ids(self) -> list[int]:
171 return self.conv_layer_ids
172
173 @property
174 def full_attention_layer_ids(self) -> list[int]:
175 return list(range(self.num_hidden_layers))
176
177 @property
178 def mamba_chunk_size(self) -> int:
179 # Floor at 64: mamba_cache_chunk_size = max(mamba_chunk_size, page_size),
180 # and a floor of 1 lets the radix tree adopt another request's KV at
181 # tiny shared prefixes, whose different kernel-rounding perturbs decode
182 # logits.
183 return 64
184
185 @property
186 def mamba2_cache_params(self) -> TMLConvCacheParams | None:
187 try:
188 from vllm.distributed import get_tensor_model_parallel_world_size
189
190 tp_size = get_tensor_model_parallel_world_size()
191 except (AssertionError, RuntimeError):
192 tp_size = 1
193
194 def tp_local_kv_conv_dim(num_kv_heads: int, head_dim: int) -> int:
195 return max(1, num_kv_heads // tp_size) * head_dim
196
197 full_kv_conv_dim = tp_local_kv_conv_dim(self.num_key_value_heads, self.head_dim)
198 local_kv_conv_dim = tp_local_kv_conv_dim(
199 self.swa_num_key_value_heads, self.swa_head_dim
200 )
201 stream_dim = self.hidden_size
202 conv_len = self.sconv_kernel_size - 1
203 shape = TMLConvStateShape(
204 conv=[
205 (conv_len, full_kv_conv_dim),
206 (conv_len, full_kv_conv_dim),
207 (conv_len, local_kv_conv_dim),
208 (conv_len, local_kv_conv_dim),
209 (conv_len, stream_dim),
210 (conv_len, stream_dim),
211 ],
212 temporal=(0, 0, 0),
213 )
214 dtype = TMLStateDType(conv=torch.bfloat16, temporal=torch.bfloat16)
215 return TMLConvCacheParams(shape=shape, layers=self.conv_layer_ids, dtype=dtype)
216
217
218 class InklingAudioConfig(PreTrainedConfig):
219 model_type = "inkling_audio_model"
220
221 def __init__(
222 self,
223 *,
224 decoder_dmodel: int | None = None,
225 n_mel_bins: int | None = None,
226 mel_vocab_size: int | None = None,
227 dmel_min_value: float | None = None,
228 dmel_max_value: float | None = None,
229 use_audio_norm: bool | None = None,
230 audio_mode: Literal["dmel", "flow"] | None = None,
231 **kwargs: Any,
232 ) -> None:
233 values = {
234 "n_mel_bins": n_mel_bins,
235 "mel_vocab_size": mel_vocab_size,
236 "dmel_min_value": dmel_min_value,
237 "dmel_max_value": dmel_max_value,
238 "use_audio_norm": use_audio_norm,
239 "audio_mode": audio_mode,
240 }
241 if decoder_dmodel is not None and (
242 missing := [name for name, value in values.items() if value is None]
243 ):
244 raise ValueError(
245 "Enabled Inkling audio tower is missing config fields: "
246 + ", ".join(missing)
247 )
248 self.decoder_dmodel = decoder_dmodel
249 self.n_mel_bins = cast(int, n_mel_bins)
250 self.mel_vocab_size = cast(int, mel_vocab_size)
251 self.dmel_min_value = cast(float, dmel_min_value)
252 self.dmel_max_value = cast(float, dmel_max_value)
253 self.use_audio_norm = cast(bool, use_audio_norm)
254 self.audio_mode = cast(Literal["dmel", "flow"], audio_mode)
255 super().__init__(**kwargs)
256
257
258 class InklingVisionConfig(PreTrainedConfig):
259 model_type = "inkling_vision_model"
260
261 def __init__(
262 self,
263 *,
264 vision_encoder_type: Literal["linear", "hmlp"] | None = None,
265 decoder_dmodel: int | None = None,
266 patch_size: int | None = None,
267 temporal_patch_size: int | None = None,
268 n_channels: int | None = None,
269 n_layers: int | None = None,
270 use_vision_norm: bool | None = None,
271 **kwargs: Any,
272 ) -> None:
273 values = {
274 "vision_encoder_type": vision_encoder_type,
275 "patch_size": patch_size,
276 "temporal_patch_size": temporal_patch_size,
277 "n_channels": n_channels,
278 "n_layers": n_layers,
279 "use_vision_norm": use_vision_norm,
280 }
281 if decoder_dmodel is not None and (
282 missing := [name for name, value in values.items() if value is None]
283 ):
284 raise ValueError(
285 "Enabled Inkling vision tower is missing config fields: "
286 + ", ".join(missing)
287 )
288 self.vision_encoder_type = cast(Literal["linear", "hmlp"], vision_encoder_type)
289 self.decoder_dmodel = decoder_dmodel
290 self.patch_size = cast(int, patch_size)
291 self.temporal_patch_size = cast(int, temporal_patch_size)
292 self.n_channels = cast(int, n_channels)
293 self.n_layers = cast(int, n_layers)
294 self.use_vision_norm = cast(bool, use_vision_norm)
295 super().__init__(**kwargs)
296
297
298 class InklingMMConfig(PreTrainedConfig):
299 model_type = "inkling_mm_model"
300 keys_to_ignore_at_inference = ["past_key_values"]
301 sub_configs: ClassVar[dict[str, type[PreTrainedConfig]]] = {
302 "text_config": InklingModelConfig,
303 "audio_config": InklingAudioConfig,
304 "vision_config": InklingVisionConfig,
305 }
306
307 def __init__(
308 self,
309 *,
310 text_config: dict[str, Any] | InklingModelConfig | None = None,
311 audio_config: dict[str, Any] | InklingAudioConfig | None = None,
312 vision_config: dict[str, Any] | InklingVisionConfig | None = None,
313 tie_word_embeddings: bool = False,
314 **kwargs: Any,
315 ) -> None:
316 self.text_config = (
317 text_config
318 if isinstance(text_config, InklingModelConfig)
319 else InklingModelConfig(**(text_config or {}))
320 )
321 self.audio_config = (
322 audio_config
323 if isinstance(audio_config, InklingAudioConfig)
324 else InklingAudioConfig(**(audio_config or {}))
325 )
326 self.vision_config = (
327 vision_config
328 if isinstance(vision_config, InklingVisionConfig)
329 else InklingVisionConfig(**(vision_config or {}))
330 )
331 super().__init__(tie_word_embeddings=tie_word_embeddings, **kwargs)
332
333 def get_text_config(self, *args: Any, **kwargs: Any) -> InklingModelConfig:
334 return self.text_config
335
336 @property
337 def vocab_size(self) -> int:
338 return self.text_config.vocab_size
339
340 @property
341 def hidden_size(self) -> int:
342 return self.text_config.hidden_size
343
344 @property
345 def num_hidden_layers(self) -> int:
346 return self.text_config.num_hidden_layers
347
348 @property
349 def num_attention_heads(self) -> int:
350 return self.text_config.num_attention_heads
351
352 @property
353 def num_key_value_heads(self) -> int:
354 return self.text_config.num_key_value_heads
355
356 @property
357 def head_dim(self) -> int:
358 return self.text_config.head_dim
359
360 @property
361 def full_attention_layer_ids(self) -> list[int]:
362 return self.text_config.full_attention_layer_ids
363
364 @property
365 def linear_layer_ids(self) -> list[int]:
366 return self.text_config.linear_layer_ids
367
368 @property
369 def conv_layer_ids(self) -> list[int]:
370 return self.text_config.conv_layer_ids
371
372 @property
373 def mamba_chunk_size(self) -> int:
374 return self.text_config.mamba_chunk_size
375
376 @property
377 def mamba2_cache_params(self) -> TMLConvCacheParams | None:
378 return self.text_config.mamba2_cache_params
379
380
381 @dataclass(kw_only=True, frozen=True)
382 class TMLConvStateShape:
383 conv: list[tuple[int, int]]
384 temporal: tuple[int, int, int]
385
386
387 @dataclass(kw_only=True, frozen=True)
388 class TMLStateDType:
389 conv: torch.dtype = torch.bfloat16
390 temporal: torch.dtype = torch.bfloat16
391
392
393 @dataclass(kw_only=True, frozen=True)
394 class TMLConvCacheParams:
395 shape: TMLConvStateShape
396 layers: list[int]
397 dtype: TMLStateDType = field(default_factory=TMLStateDType)