A high-throughput and memory-efficient inference and serving engine for LLMs
minicpmv4_6: fix ImageSize (W,H) order for placeholder token calculation (#45244)
Signed-off-by: tc-mb <tianchi_cai@icloud.com>
tc-mb committed
Jun 11, 2026 at 21:43 UTC
ab3a1fd2e6593f19580215094c2de3f46368e304
2 files changed
+8
-81
vllm/model_executor/models/minicpmv.py
-76
@@ -598,50 +598,6 @@ class MiniCPMVProcessingInfo(BaseProcessingInfo):
598
if version == (2, 0) or version == (2, 5):
599
return image_processor.get_slice_image_placeholder(image_size)
600
601
- if version == (4, 6):
602
- if max_slice_nums is None:
603
- max_slice_nums = image_processor.max_slice_nums
604
- grids = image_processor.get_sliced_grid(
605
- image_size,
606
- max_slice_nums=max_slice_nums,
607
- )
608
- patch_size = image_processor.patch_size
609
- scale_resolution = image_processor.scale_resolution
610
-
611
- allow_upscale = grids is None
612
- best_size = image_processor.find_best_resize(
613
- image_size,
614
- scale_resolution,
615
- patch_size,
616
- allow_upscale=allow_upscale,
617
- )
618
- h_patches = best_size[1] // patch_size
619
- w_patches = best_size[0] // patch_size
620
- source_image_visual_tokens = (h_patches // 4) * (w_patches // 4)
621
-
622
- if grids is not None:
623
- refine_size = image_processor.get_refine_size(
624
- image_size,
625
- grids,
626
- scale_resolution,
627
- patch_size,
628
- allow_upscale=True,
629
- )
630
- pw = refine_size[0] // grids[0]
631
- ph = refine_size[1] // grids[1]
632
- patch_visual_tokens = (ph // patch_size // 4) * (pw // patch_size // 4)
633
- else:
634
- patch_visual_tokens = source_image_visual_tokens
635
-
636
- return image_processor.get_slice_image_placeholder(
637
- grids if grids is not None else [0, 0],
638
- image_idx=image_idx,
639
- max_slice_nums=max_slice_nums,
640
- use_image_id=use_image_id,
641
- source_image_visual_tokens=source_image_visual_tokens,
642
- patch_visual_tokens=patch_visual_tokens,
643
- )
644
-
601
return image_processor.get_slice_image_placeholder(
602
image_size,
603
image_idx=image_idx,
@@ -675,44 +631,12 @@ class MiniCPMVProcessingInfo(BaseProcessingInfo):
631
max_slice_nums: int | None = None,
632
) -> int:
633
image_processor = self.get_image_processor()
678
- version = self.get_model_version()
634
635
grid = self.get_sliced_grid(
636
image_size,
637
max_slice_nums=max_slice_nums,
638
)
639
685
- if version == (4, 6):
686
- patch_size = image_processor.patch_size
687
- scale_resolution = image_processor.scale_resolution
688
-
689
- allow_upscale = grid is None
690
- best_size = image_processor.find_best_resize(
691
- image_size,
692
- scale_resolution,
693
- patch_size,
694
- allow_upscale=allow_upscale,
695
- )
696
- h_p = best_size[1] // patch_size
697
- w_p = best_size[0] // patch_size
698
- source_tokens = (h_p // 4) * (w_p // 4)
699
-
700
- if grid is None:
701
- return source_tokens
702
-
703
- refine_size = image_processor.get_refine_size(
704
- image_size,
705
- grid,
706
- scale_resolution,
707
- patch_size,
708
- allow_upscale=True,
709
- )
710
- pw = refine_size[0] // grid[0]
711
- ph = refine_size[1] // grid[1]
712
- patch_tokens = (ph // patch_size // 4) * (pw // patch_size // 4)
713
- ncols, nrows = grid
714
- return source_tokens + ncols * nrows * patch_tokens
715
-
640
if grid is None:
641
ncols = nrows = 0
642
else:
vllm/model_executor/models/minicpmv4_6.py
+8
-5
@@ -509,22 +509,25 @@ class MiniCPMV4_6ProcessingInfo(MiniCPMVProcessingInfo):
509
downsample_mode = self._get_downsample_mode(downsample_mode)
510
token_divisor = 4 if downsample_mode == "4x" else 16
511
512
+ # vLLM ImageSize is (width, height); transformers expects (height, width)
513
+ hf_image_size = (image_size.height, image_size.width)
514
+
515
# transformers v5.7+ requires `scale_resolution` arg
516
try:
517
grids = image_processor.get_sliced_grid(
515
- image_size,
518
+ hf_image_size,
519
max_slice_nums,
520
scale_res,
521
)
522
except TypeError:
523
grids = image_processor.get_sliced_grid(
521
- image_size,
524
+ hf_image_size,
525
max_slice_nums,
526
)
527
528
if grids is None:
529
best_size = image_processor.find_best_resize(
527
- image_size,
530
+ hf_image_size,
531
scale_res,
532
patch_size,
533
allow_upscale=True,
@@ -535,7 +538,7 @@ class MiniCPMV4_6ProcessingInfo(MiniCPMVProcessingInfo):
538
return [0, 0], source_tokens, 0
539
540
best_resize = image_processor.find_best_resize(
538
- image_size,
541
+ hf_image_size,
542
scale_res,
543
patch_size,
544
)
@@ -543,7 +546,7 @@ class MiniCPMV4_6ProcessingInfo(MiniCPMVProcessingInfo):
546
best_resize[0] * best_resize[1] // (patch_size * patch_size * token_divisor)
547
)
548
refine_size = image_processor.get_refine_size(
546
- image_size,
549
+ hf_image_size,
550
grids,
551
scale_res,
552
patch_size,