GitHub Repo | Technical Report
π Join us on Discord and WeChat
MiniCPM4 series are highly efficient large language models (LLMs) designed explicitly for end-side devices, which achieves this efficiency through systematic innovation in four key dimensions: model architecture, training data, training algorithms, and inference systems.
MiniCPM 4 is an extremely efficient edge-side large model that has undergone efficient optimization across four dimensions: model architecture, learning algorithms, training data, and inference systems, achieving ultimate efficiency improvements.
ποΈ Efficient Model Architecture:
π§ Efficient Learning Algorithms:
π High-Quality Training Data:
β‘ Efficient Inference System:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
path = "openbmb/MiniCPM4-0.5B-QAT-Int4-unquantized"
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(path, torch_dtype=torch.bfloat16, device_map=device, trust_remote_code=True)
messages = [
{"role": "user", "content": "ζ¨θ5δΈͺεδΊ¬ηζ―ηΉγ"},
]
model_inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True).to(device)
model_outputs = model.generate(
model_inputs,
max_new_tokens=1024,
top_p=0.7,
temperature=0.7
)
output_token_ids = [
model_outputs[i][len(model_inputs[i]):] for i in range(len(model_inputs))
]
responses = tokenizer.batch_decode(output_token_ids, skip_special_tokens=True)[0]
print(responses)
You can inference MiniCPM4-0.5B-QAT-Int4-unquantized with vLLM:
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
model_name = "openbmb/MiniCPM4-0.5B-QAT-Int4-unquantized"
prompt = [{"role": "user", "content": "ζ¨θ5δΈͺεδΊ¬ηζ―ηΉγ"}]
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
input_text = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
llm = LLM(
model=model_name,
trust_remote_code=True,
max_num_batched_tokens=32768,
dtype="bfloat16",
gpu_memory_utilization=0.8,
)
sampling_params = SamplingParams(top_p=0.7, temperature=0.7, max_tokens=1024, repetition_penalty=1.02)
outputs = llm.generate(prompts=input_text, sampling_params=sampling_params)
print(outputs[0].outputs[0].text)
| Model | Qwen3 | Llama3.2 | Gemma3 | MiniCPM4 | MiniCPM4 | MiniCPM4 |
|---|---|---|---|---|---|---|
| #Paramete | 0.6B | 1B | 1B | 0.5B | 0.5B | 0.5B |
| #Precision | BF16 | BF16 | BF16 | BF16 | Int4(Fake) | Int4(GPTQ) |
| MMLU | 42.95 | 46.89 | 41.64 | 55.55 | 55.46 | 53.93 |
| CMMLU | 42.05 | 23.73 | 25.09 | 65.22 | 63.91 | 63.73 |
| Ceval | 45.53 | 36.74 | 31.83 | 66.11 | 64.85 | 65.22 |
| BBH | 28.32 | 25.42 | 33.21 | 49.87 | 48.81 | 49.09 |
| GSM8K | 61.71 | 39.76 | 61.26 | 52.08 | 45.41 | 45.49 |
| MBPP | 47.86 | 47.47 | 59.92 | 59.14 | 55.64 | 55.25 |
| AVERAGE | 44.73 | 36.66 | 42.15 | 58.00 | 55.68 | 55.45 |
@article{minicpm4,
title={{MiniCPM4}: Ultra-Efficient LLMs on End Devices},
author={MiniCPM Team},
year={2025}
}
3 commits
GitHub Repo | Technical Report
π Join us on Discord and WeChat
MiniCPM4 series are highly efficient large language models (LLMs) designed explicitly for end-side devices, which achieves this efficiency through systematic innovation in four key dimensions: model architecture, training data, training algorithms, and inference systems.
MiniCPM 4 is an extremely efficient edge-side large model that has undergone efficient optimization across four dimensions: model architecture, learning algorithms, training data, and inference systems, achieving ultimate efficiency improvements.
ποΈ Efficient Model Architecture:
π§ Efficient Learning Algorithms:
π High-Quality Training Data:
β‘ Efficient Inference System:
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
path = "openbmb/MiniCPM4-0.5B-QAT-Int4-unquantized"
device = "cuda"
tokenizer = AutoTokenizer.from_pretrained(path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(path, torch_dtype=torch.bfloat16, device_map=device, trust_remote_code=True)
messages = [
{"role": "user", "content": "ζ¨θ5δΈͺεδΊ¬ηζ―ηΉγ"},
]
model_inputs = tokenizer.apply_chat_template(messages, return_tensors="pt", add_generation_prompt=True).to(device)
model_outputs = model.generate(
model_inputs,
max_new_tokens=1024,
top_p=0.7,
temperature=0.7
)
output_token_ids = [
model_outputs[i][len(model_inputs[i]):] for i in range(len(model_inputs))
]
responses = tokenizer.batch_decode(output_token_ids, skip_special_tokens=True)[0]
print(responses)
You can inference MiniCPM4-0.5B-QAT-Int4-unquantized with vLLM:
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams
model_name = "openbmb/MiniCPM4-0.5B-QAT-Int4-unquantized"
prompt = [{"role": "user", "content": "ζ¨θ5δΈͺεδΊ¬ηζ―ηΉγ"}]
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
input_text = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
llm = LLM(
model=model_name,
trust_remote_code=True,
max_num_batched_tokens=32768,
dtype="bfloat16",
gpu_memory_utilization=0.8,
)
sampling_params = SamplingParams(top_p=0.7, temperature=0.7, max_tokens=1024, repetition_penalty=1.02)
outputs = llm.generate(prompts=input_text, sampling_params=sampling_params)
print(outputs[0].outputs[0].text)
| Model | Qwen3 | Llama3.2 | Gemma3 | MiniCPM4 | MiniCPM4 | MiniCPM4 |
|---|---|---|---|---|---|---|
| #Paramete | 0.6B | 1B | 1B | 0.5B | 0.5B | 0.5B |
| #Precision | BF16 | BF16 | BF16 | BF16 | Int4(Fake) | Int4(GPTQ) |
| MMLU | 42.95 | 46.89 | 41.64 | 55.55 | 55.46 | 53.93 |
| CMMLU | 42.05 | 23.73 | 25.09 | 65.22 | 63.91 | 63.73 |
| Ceval | 45.53 | 36.74 | 31.83 | 66.11 | 64.85 | 65.22 |
| BBH | 28.32 | 25.42 | 33.21 | 49.87 | 48.81 | 49.09 |
| GSM8K | 61.71 | 39.76 | 61.26 | 52.08 | 45.41 | 45.49 |
| MBPP | 47.86 | 47.47 | 59.92 | 59.14 | 55.64 | 55.25 |
| AVERAGE | 44.73 | 36.66 | 42.15 | 58.00 | 55.68 | 55.45 |
@article{minicpm4,
title={{MiniCPM4}: Ultra-Efficient LLMs on End Devices},
author={MiniCPM Team},
year={2025}
}
3 commits