MiniCPM-V 4.6
MiniCPM-V Multimodal Series
MiniCPM-V 4.6 is OpenBMB's most edge-deployment-friendly multimodal model to date. Built on SigLIP2-400M and the Qwen3.5-0.8B LLM with 1.3B total parameters, it inherits the single-image, multi-image and video understanding of the MiniCPM-V family while focusing on computation efficiency: based on the intra-ViT early compression technique from LLaVA-UHD v4, it cuts visual encoding FLOPs by more than 50% and reaches ~1.5x the token throughput of Qwen3.5-0.8B. It is also the first in the series to support mixed 4×/16× visual token compression, letting you trade accuracy against speed per task.
On capability, 4.6 scores 13 on the Artificial Analysis Intelligence Index, beating Qwen3.5-0.8B's 10 with 19x fewer tokens and surpassing the larger Ministral 3 3B. It reaches Qwen3.5 2B-level results on benchmarks including OpenCompass, RefCOCO, HallusionBench, MUIRBench and OCRBench. The model runs on all three mainstream mobile platforms — iOS, Android and HarmonyOS — with every edge adaptation path open-sourced, and has been merged into Ollama's official model library.
What's new in 4.6
- Two checkpoints, one architecture. Unlike 4.5 (one model, two modes via
enable_thinking), 4.6 ships two independent checkpoints — pick whichever matches your use case.openbmb/MiniCPM-V-4.6— Instructopenbmb/MiniCPM-V-4.6-Thinking— Thinking
- Qwen3.5 hybrid backbone. Mixed linear / full-attention layers, with up to 256K context window.
- LLaVA-UHD v4 vision tower. Replaces the Perceiver resampler with slice-based encoding plus intra-ViT early compression (mixed 4×/16× token compression) — simpler GGUF conversion, fewer surgery scripts. See LLaVA-UHD v4 paper.
- Standalone transformers architecture. Registered as
MiniCPMV4_6ForConditionalGenerationintransformers >= 5.7.0. StandardAutoProcessor+AutoModelForImageTextToTextflow works out of the box.
Quick start
Inference (HF Transformers)
import torch
from PIL import Image
from transformers import AutoProcessor, AutoModelForImageTextToText
model_path = "openbmb/MiniCPM-V-4.6" # or MiniCPM-V-4.6-Thinking
processor = AutoProcessor.from_pretrained(model_path)
model = AutoModelForImageTextToText.from_pretrained(
model_path, torch_dtype=torch.bfloat16, attn_implementation="sdpa",
).eval().cuda()
image = Image.open("example.jpg").convert("RGB")
messages = [{"role": "user", "content": [
{"type": "image", "image": image},
{"type": "text", "text": "Describe the image."},
]}]
inputs = processor.apply_chat_template(
messages, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt",
).to(model.device)
out = model.generate(**inputs, max_new_tokens=256)
print(processor.decode(out[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
Serve with vLLM
# v4.6 is merged into upstream vLLM main (PR #41254, merged on 2026-05-12); install from upstream directly.
git clone https://github.com/vllm-project/vllm.git
cd vllm
MAX_JOBS=6 VLLM_USE_PRECOMPILED=1 pip install --editable . -v
vllm serve openbmb/MiniCPM-V-4.6 --trust-remote-code --max-model-len 8192
See the vLLM guide for full details.
Run with llama.cpp
# release b9049 or newer ships v4.6 support
git clone https://github.com/ggml-org/llama.cpp.git && cd llama.cpp
cmake -B build && cmake --build build --config Release
# convert with the standard script (no surgery script needed for v4.6!)
python ./convert_hf_to_gguf.py /path/to/MiniCPM-V-4.6 \
--outfile /path/to/MiniCPM-V-4.6-F16.gguf --outtype f16
python ./convert_hf_to_gguf.py /path/to/MiniCPM-V-4.6 \
--mmproj --outfile /path/to/mmproj-MiniCPM-V-4.6-F16.gguf
./build/bin/llama-mtmd-cli \
-m /path/to/MiniCPM-V-4.6-F16.gguf \
--mmproj /path/to/mmproj-MiniCPM-V-4.6-F16.gguf \
-c 8192 --reasoning off --image example.jpg -p "Describe the image."
# Note: pass --reasoning off for the Instruct checkpoint; recent llama.cpp auto-enables thinking from the template.
See the llama.cpp guide for full details.
Important differences from v4.5
| Topic | v4.5 | v4.6 |
|---|---|---|
| Thinking mode | One model, switch via enable_thinking | Two separate checkpoints (Instruct, Thinking) |
| LM backbone | Qwen3 | Qwen3.5 hybrid (linear + full attention) |
| Max context | 32K | 256K |
| Vision tower | Perceiver resampler | LLaVA-UHD v4 (slice-based + intra-ViT compression) |
| GGUF conversion | minicpmv-surgery.py + image encoder script | Standard convert_hf_to_gguf.py |
| Stop tokens (vLLM) | [1, 151645] | [248044, 248046] |
| Audio support | — (vision only) | — (vision only) |
If you're migrating from v4.5, the most common runtime gotchas are:
- Update
stop_token_idsto[248044, 248046](the vocab is different — Qwen3.5 instead of Qwen3). - Drop the
enable_thinkingrequest flag and instead deploy the right checkpoint from the start. - The legacy
minicpmv-surgery.pyflow is no longer needed for GGUF — useconvert_hf_to_gguf.pydirectly.
Related Resources
| Topic | Link |
|---|---|
| Inference | MiniCPM-V 4.6 inference guide |
| Fine-tuning | MiniCPM-V 4.6 fine-tuning guide |
| Code repository | OpenBMB/MiniCPM-V |
| On-device apps and downloads | MiniCPM-V-Apps downloads |
| API access | API guide |