Model reference · open weights
MiniCPM-V-4.6-Thinking is an open-weight language model from openbmb. MiniCPM-V-4.6-Thinking-GPTQ (GPTQ) weighs 1.9 GB; the smallest configuration that runs it is RTX 3060 12 GB.
Summary of the openbmb/MiniCPM-V-4.6-Thinking model card, 2026-10-01. The estimate below is for another build of the family.
What it is
| Released by | openbmb |
|---|---|
| Released | 2026-05-08 |
| Parameters | 1.3B |
| VRAM | 1.9 GB for the weights |
What it runs on
| Card | Requests at once | Context max | Memory | |
|---|---|---|---|---|
| 8K each | 32K each | |||
| RTX 3060 12 GB | 55 | 17 | all 256K | 11.6 GB |
| RTX 4060 Ti 16 GB | 82 | 26 | all 256K | 15.4 GB |
| RTX 3090 24 GB | 139 | 44 | all 256K | 23.4 GB |
| RTX 4090 24 GB | 139 | 44 | all 256K | 23.4 GB |
| RTX 5090 32 GB | 194 | 61 | all 256K | 31.0 GB |
| L40S 48 GB | 286 | 90 | all 256K | 44.0 GB |
| A100 80 GB | 531 | 168 | all 256K | 78.2 GB |
| H100 80 GB | 495 | 156 | all 256K | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | 607 | 192 | all 256K | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | 704 | 222 | all 256K | 107 GB |
| H200 141 GB | 923 | 292 | all 256K | 138 GB |
| B200 180 GB | 1000+ | 378 | all 256K | 176 GB |
| Requests at once | 8K tokens each | 32K tokens each |
|---|---|---|
| 1 | 4.0 GB | 4.3 GB |
| 5 | 4.6 GB | 6.1 GB |
| 8 | 5.0 GB | 7.4 GB |
| 16 | 6.1 GB | 11.0 GB |
| 32 | 8.4 GB | 18.0 GB |
| 64 | 12.8 GB | 32.2 GB |
One card, with vLLM's small-card settings.
Builds
| Build | Params | Precision | Weights | Smallest setup |
|---|---|---|---|---|
| MiniCPM-V-4.6-Thinking ↗ | 1.3B | BF16 | 2.6 GB | RTX 3060 12 GB |
| MiniCPM-V-4.6-Thinking-GPTQ (above) ↗ | 1.3B | GPTQ | 1.9 GB | RTX 3060 12 GB |
| MiniCPM-V-4.6-Thinking-AWQ ↗ | 1.3B | AWQ | 1.9 GB | RTX 3060 12 GB |
| MiniCPM-V-4.6-Thinking-gguf ↗ 11 builds: Q4_0 501 MB … F16 1.5 GB |
— | GGUF | 529 MB | RTX 3060 12 GB |
From the model card
A Pocket-Sized MLLM for Ultra-Efficient Image and Video Understanding on Your Phone
GitHub | MiniCPM Wiki(Chinese) | CookBook | Demo | Feishu (Lark)
MiniCPM-V 4.6 Thinking is the long chain-of-thought reasoning variant of MiniCPM-V 4.6. It generates an explicit reasoning trace before producing the final answer, substantially boosting performance on complex multimodal reasoning, math, and OCR-heavy tasks, while keeping the same edge-friendly architecture (SigLIP2-400M vision encoder + Qwen3.5-0.8B LLM) and the mixed 4x/16x visual token compression of MiniCPM-V 4.6.
Overall Performance (Thinking)
High-Concurrency Throughput
Single Request TTFT (ms)
MiniCPM-V 4.6 can be deployed across three mainstream end-side platforms — iOS, Android and HarmonyOS. The clips below are raw screen recordings on phone devices without edition.
pip install "transformers[torch]>=5.7.0" torchvision torchcodec
Note on CUDA compatibility:
torchcodec(used for video decoding) may have compatibility issues with certain CUDA versions. For example,torch>=2.11bundles CUDA 13.1 by default, while environments with CUDA 12.x may encounter errors such asRuntimeError: Could not load libtorchcodec. Two workarounds:
- Replace
torchcodecwithPyAV— supports both image and video inference without CUDA version constraints:pip install "transformers[torch]>=5.7.0" torchvision av- Pin the CUDA version when installing torch to match your environment (e.g. CUDA 12.8):
pip install "transformers>=5.7.0" torchvision torchcodec --index-url https://download.pytorch.org/whl/cu128
from transformers import AutoModelForImageTextToText, AutoProcessor
model_id = "openbmb/MiniCPM-V-4.6-Thinking"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(
model_id, torch_dtype="auto", device_map="auto"
)
# Flash Attention 2 is recommended for better acceleration and memory saving,
# especially in multi-image and video scenarios.
# model = AutoModelForImageTextToText.from_pretrained(
# model_id,
# torch_dtype=torch.bfloat16,
# attn_implementation="flash_attention_2",
# device_map="auto",
# )
messages = [
{
"role": "user",
"content": [
{"type": "image", "url": "https://huggingface.co/datasets/openbmb/DemoCase/resolve/main/refract.png"},
{"type": "text", "text": "What causes this phenomenon?"},
],
}
]
downsample_mode = "16x" # Using `downsample_mode="4x"` for Finer Detail
inputs = processor.apply_chat_template(
messages, tokenize=True, add_generation_prompt=True,
return_dict=True, return_tensors="pt",
downsample_mode=downsample_mode,
max_slice_nums=36,
).to(model.device)
generated_ids = model.generate(**inputs, downsample_mode=downsample_mode, max_new_tokens=512)
generated_ids_trimmed = [
out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text[0])
messages = [
{
"role": "user",
"content": [
{"type": "video", "url": "https://huggingface.co/datasets/openbmb/DemoCase/resolve/main/football.mp4"},
{"type": "text", "text": "Describe this video in detail. Follow the timeline and focus on on-screen text, interface changes, main actions, and scene changes."},
],
}
]
downsample_mode = "16x" # Using `downsample_mode="4x"` for Finer Detail
inputs = processor.apply_chat_template(
messages, tokenize=True, add_generation_prompt=True,
return_dict=True, return_tensors="pt",
downsample_mode=downsample_mode,
max_num_frames=128,
stack_frames=1,
max_slice_nums=1,
use_image_id=False,
).to(model.device)
generated_ids = model.generate(**inputs, downsample_mode=downsample_mode, max_new_tokens=2048)
generated_ids_trimmed = [
out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text[0])
You can customize image/video processing by passing additional parameters to apply_chat_template:
| Parameter | Default | Applies to | Description |
|---|---|---|---|
downsample_mode | "16x" | Image & Video | Visual token downsampling. "16x" merges tokens for efficiency; "4x" keeps 4× more tokens for finer detail. Must also be passed to generate(). |
max_slice_nums | 9 | Image & Video | Maximum number of slices when splitting a high-resolution image. Higher values preserve more detail for large images. Recommended: 36 for image, 1 for video. |
max_num_frames | 128 | Video only | The max_num_frames parameter dynamically controls the temporal context length and prevents VRAM overflow: Short Videos (duration ≤ max_num_frames sec): The processor defaults to 1 FPS, capturing second-by-second details without hitting |
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.