@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / ab3a1fd2e6
Fork 0

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,