A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 8, 07:30 UTC
[Bugfix] Add quant_config in ViT of Kimi-K2.5 (#34501)
Signed-off-by: LoganJane <LoganJane73@hotmail.com> Signed-off-by: Isotr0py <mozf@mail2.sysu.edu.cn> Co-authored-by: Isotr0py <mozf@mail2.sysu.edu.cn>
LoganJane committed
Feb 14, 2026 at 00:05 UTC
4a9952ec1b15453053f4ec443d2d81505d344075
2 files changed
+26
vllm/model_executor/models/kimi_k25.py
+11
@@ -23,6 +23,10 @@ from transformers.processing_utils import ProcessorMixin
23
from vllm.config import VllmConfig
24
from vllm.config.multimodal import BaseDummyOptions
25
from vllm.logger import init_logger
26
+from vllm.model_executor.layers.quantization import QuantizationConfig
27
+from vllm.model_executor.layers.quantization.compressed_tensors.compressed_tensors import (
28
+ CompressedTensorsConfig,
29
+)
30
from vllm.model_executor.models.interfaces import (
31
SupportsMultiModal,
32
SupportsPP,
@@ -361,6 +365,7 @@ class KimiK25ForConditionalGeneration(
365
with self._mark_tower_model(vllm_config, "vision_chunk"):
366
self.vision_tower = MoonViT3dPretrainedModel(
367
config.vision_config,
368
+ quant_config=self._maybe_ignore_quant_config(quant_config),
369
prefix=maybe_prefix(prefix, "vision_tower"),
370
)
371
self.vision_tower = self.vision_tower.to(
@@ -370,6 +375,7 @@ class KimiK25ForConditionalGeneration(
375
self.mm_projector = KimiK25MultiModalProjector(
376
config=config.vision_config,
377
use_data_parallel=self.use_data_parallel,
378
+ quant_config=self._maybe_ignore_quant_config(quant_config),
379
prefix=maybe_prefix(prefix, "mm_projector"),
380
)
381
self.mm_projector = self.mm_projector.to(
@@ -389,6 +395,11 @@ class KimiK25ForConditionalGeneration(
395
)
396
self.media_placeholder: int = self.config.media_placeholder_token_id
397
398
+ def _maybe_ignore_quant_config(self, quant_config: QuantizationConfig):
399
+ if isinstance(quant_config, CompressedTensorsConfig):
400
+ return None
401
+ return quant_config
402
+
403
def _parse_and_validate_media_input(
404
self, **kwargs: object
405
) -> KimiK25MediaPixelInputs | None:
vllm/model_executor/models/kimi_k25_vit.py
+15
@@ -28,6 +28,7 @@ from vllm.model_executor.layers.linear import (
28
ReplicatedLinear,
29
RowParallelLinear,
30
)
31
+from vllm.model_executor.layers.quantization import QuantizationConfig
32
from vllm.model_executor.models.utils import maybe_prefix
33
from vllm.model_executor.models.vision import (
34
is_vit_use_data_parallel,
@@ -304,6 +305,7 @@ class MLP2(nn.Module):
305
dims: list[int],
306
activation,
307
bias: bool = True,
308
+ quant_config: QuantizationConfig | None = None,
309
prefix: str = "",
310
use_data_parallel: bool = False,
311
):
@@ -314,6 +316,7 @@ class MLP2(nn.Module):
316
dims[0],
317
dims[1],
318
bias=bias,
319
+ quant_config=quant_config,
320
prefix=maybe_prefix(prefix, "fc0"),
321
disable_tp=self.use_data_parallel,
322
)
@@ -321,6 +324,7 @@ class MLP2(nn.Module):
324
dims[1],
325
dims[2],
326
bias=bias,
327
+ quant_config=quant_config,
328
prefix=maybe_prefix(prefix, "fc1"),
329
disable_tp=self.use_data_parallel,
330
)
@@ -341,6 +345,7 @@ class MoonViTEncoderLayer(nn.Module):
345
num_heads: int,
346
hidden_dim: int,
347
mlp_dim: int,
348
+ quant_config: QuantizationConfig | None = None,
349
prefix: str = "",
350
*,
351
activation=F.gelu,
@@ -362,6 +367,7 @@ class MoonViTEncoderLayer(nn.Module):
367
self.mlp = MLP2(
368
[hidden_dim, mlp_dim, hidden_dim],
369
activation,
370
+ quant_config=quant_config,
371
prefix=f"{prefix}.mlp",
372
use_data_parallel=self.use_data_parallel,
373
)
@@ -371,6 +377,7 @@ class MoonViTEncoderLayer(nn.Module):
377
total_num_heads=num_heads,
378
total_num_kv_heads=num_heads,
379
bias=attn_bias,
380
+ quant_config=quant_config,
381
prefix=f"{prefix}.wqkv",
382
disable_tp=self.use_data_parallel,
383
)
@@ -378,6 +385,7 @@ class MoonViTEncoderLayer(nn.Module):
385
hidden_dim,
386
hidden_dim,
387
bias=attn_bias,
388
+ quant_config=quant_config,
389
prefix=f"{prefix}.wo",
390
disable_tp=self.use_data_parallel,
391
)
@@ -461,6 +469,7 @@ class MoonViT3dEncoder(nn.Module):
469
num_layers: int,
470
block_cfg: dict,
471
video_attn_type: str = "spatial_temporal",
472
+ quant_config: QuantizationConfig | None = None,
473
prefix: str = "",
474
) -> None:
475
super().__init__()
@@ -476,6 +485,7 @@ class MoonViT3dEncoder(nn.Module):
485
[
486
MoonViTEncoderLayer(
487
**block_cfg,
488
+ quant_config=quant_config,
489
prefix=f"{prefix}.blocks.{layer_idx}",
490
)
491
for layer_idx in range(num_layers)
@@ -544,6 +554,7 @@ class MoonViT3dPretrainedModel(nn.Module):
554
def __init__(
555
self,
556
config: KimiK25VisionConfig,
557
+ quant_config: QuantizationConfig | None = None,
558
prefix: str = "",
559
):
560
super().__init__()
@@ -573,6 +584,7 @@ class MoonViT3dPretrainedModel(nn.Module):
584
"attn_bias": True,
585
},
586
video_attn_type=config.video_attn_type,
587
+ quant_config=quant_config,
588
prefix=maybe_prefix(prefix, "encoder"),
589
)
590
@@ -646,6 +658,7 @@ class KimiK25MultiModalProjector(nn.Module):
658
self,
659
config: KimiK25VisionConfig,
660
use_data_parallel: bool = False,
661
+ quant_config: QuantizationConfig | None = None,
662
prefix: str = "",
663
):
664
super().__init__()
@@ -660,12 +673,14 @@ class KimiK25MultiModalProjector(nn.Module):
673
self.hidden_size,
674
self.hidden_size,
675
bias=True,
676
+ quant_config=quant_config,
677
prefix=f"{prefix}.linear_1",
678
)
679
self.linear_2 = ReplicatedLinear(
680
self.hidden_size,
681
config.mm_hidden_size,
682
bias=True,
683
+ quant_config=quant_config,
684
prefix=f"{prefix}.linear_2",
685
)
686
self.act = GELUActivation()