OpenBMB

    OpenBMB/MiniCPM-o

    A Gemini 2.5 Flash Level MLLM for Vision, Speech, and Full-Duplex Multimodal Live Streaming on Your Phone

    backend
    minicpm
    minicpm-v
    multi-modal
    Python
    Apache-2.0
    23.8K stars
    1.8K forks
    23.8K watching
    Updated 2/27/2026
    View on GitHub
    Backblaze Advertisement

    Loading star history...

    Health Score

    75

    Weekly Growth

    +0

    +0.0% this week

    Contributors

    1

    Total contributors

    Open Issues

    84

    Generated Insights

    About MiniCPM-o

    A GPT-4o Level MLLM for Single Image, Multi Image and Video Understanding on Your Phone

    中文 | English

    WeChat WeChat  |   Discord Discord  

    MiniCPM-V 4.5 🤗 🤖 | MiniCPM-o 2.6 🤗 🤖 | 🍳 Cookbook | 📄 Technical Report (Coming Soon)

    MiniCPM-V is a series of efficient end-side multimodal LLMs (MLLMs), which accept images, videos and text as inputs and deliver high-quality text outputs. MiniCPM-o additionally takes audio as inputs and provide high-quality speech outputs in an end-to-end fashion. Since February 2024, we have released 7 versions of the model, aiming to achieve strong performance and efficient deployment. The most notable models in the series currently include:

    • MiniCPM-V 4.5: 🔥🔥🔥 The latest and most capable model in the MiniCPM-V series. With a total of 8B parameters, this model outperforms GPT-4o-latest, Gemini-2.0 Pro, and Qwen2.5-VL 72B in vision-language capabilities, making it the most performant on-device multimodal model in the open-source community. This version brings new features including efficient high refresh rate and long video understanding (up to 96x compression rate for video tokens), controllable hybrid fast/deep thinking, strong handwritten OCR and complex table/document parsing. It also advances MiniCPM-V's popular features such as trustworthy behavior, multilingual support and end-side deployability.

    • MiniCPM-o 2.6: ⭐️⭐️⭐️ The most capable model in the MiniCPM-o series. With a total of 8B parameters, this end-to-end model achieves comparable performance to GPT-4o-202405 in vision, speech, and multimodal live streaming, making it one of the most versatile and performant models in the open-source community. For the new voice mode, MiniCPM-o 2.6 supports bilingual real-time speech conversation with configurable voices, and also allows for fun capabilities such as emotion/speed/style control, end-to-end voice cloning, role play, etc. Due to its superior token density, MiniCPM-o 2.6 can for the first time support multimodal live streaming on end-side devices such as iPad.

    News

    📌 Pinned

    • [2025.08.26] 🔥🔥🔥 We open-source MiniCPM-V 4.5, which outperforms GPT-4o-latest, Gemini-2.0 Pro, and Qwen2.5-VL 72B. It advances popular capabilities of MiniCPM-V, and brings useful new features. Try it now!

    • [2025.08.01] ⭐️⭐️⭐️ We open-sourced the MiniCPM-V & o Cookbook! It provides comprehensive guides for diverse user scenarios, paired with our new Docs Site for smoother onboarding.

    • [2025.06.20] ⭐️⭐️⭐️ Our official Ollama repository is released. Try our latest models with one click

    • [2025.03.01] 🚀🚀🚀 RLAIF-V, the alignment technique of MiniCPM-o, is accepted by CVPR 2025 Highlights!The code, dataset, paper are open-sourced!

    • [2025.01.24] 📢📢📢 MiniCPM-o 2.6 technical report is released! See here.

    • [2025.01.19] 📢 ATTENTION! We are currently working on merging MiniCPM-o 2.6 into the official repositories of llama.cpp, Ollama, and vllm. Until the merge is complete, please USE OUR LOCAL FORKS of llama.cpp, Ollama, and vllm. Using the official repositories before the merge may lead to unexpected issues.

    • [2025.01.19] ⭐️⭐️⭐️ MiniCPM-o tops GitHub Trending and reaches top-2 on Hugging Face Trending!

    • [2025.01.17] We have updated the usage of MiniCPM-o 2.6 int4 quantization version and resolved the model initialization error. Click here and try it now!

    • [2025.01.13] 🔥🔥🔥 We open-source MiniCPM-o 2.6, which matches GPT-4o-202405 on vision, speech and multimodal live streaming. It advances popular capabilities of MiniCPM-V 2.6, and supports various new fun features. Try it now!

    • [2024.08.17] 🚀🚀🚀 MiniCPM-V 2.6 is now fully supported by official llama.cpp! GGUF models of various sizes are available here.

    • [2024.08.06] 🔥🔥🔥 We open-source MiniCPM-V 2.6, which outperforms GPT-4V on single image, multi-image and video understanding. It advances popular features of MiniCPM-Llama3-V 2.5, and can support real-time video understanding on iPad. Try it now!

    • [2024.08.03] MiniCPM-Llama3-V 2.5 technical report is released! See here.

    • [2024.05.23] 🔥🔥🔥 MiniCPM-V tops GitHub Trending and Hugging Face Trending! Our demo, recommended by Hugging Face Gradio’s official account, is available here. Come and try it out!


    Click to view more news.
    • [2025.08.02] 🚀🚀🚀 We open-source MiniCPM-V 4.0, which outperforms GPT-4.1-mini-20250414 in image understanding. It advances popular features of MiniCPM-V 2.6, and largely improves the efficiency. We also open-source the iOS App on iPhone and iPad. Try it now!

    • [2025.01.23] 💡💡💡 MiniCPM-o 2.6 is now supported by Align-Anything, a framework by PKU-Alignment Team for aligning any-to-any modality large models with human intentions. It supports DPO and SFT fine-tuning on both vision and audio. Try it now!

    • [2024.08.15] We now also support multi-image SFT. For more details, please refer to the document.

    • [2024.08.14] MiniCPM-V 2.6 now also supports fine-tuning with the SWIFT framework!

    • [2024.08.10] 🚀🚀🚀 MiniCPM-Llama3-V 2.5 is now fully supported by official llama.cpp! GGUF models of various sizes are available here.

    • [2024.07.19] MiniCPM-Llama3-V 2.5 supports vLLM now! See here.

    • [2024.06.03] Now, you can run MiniCPM-Llama3-V 2.5 on multiple low VRAM GPUs(12 GB or 16 GB) by distributing the model's layers across multiple GPUs. For more details, Check this link.

    • [2024.05.28] 🚀🚀🚀 MiniCPM-Llama3-V 2.5 now fully supports its feature in llama.cpp and Ollama! Please pull the latest code of our provided forks (llama.cpp, Ollama). GGUF models in various sizes are available here. MiniCPM-Llama3-V 2.5 series is not supported by the official repositories yet, and we are working hard to merge PRs. Please stay tuned!

    • [2024.05.28] 💫 We now support LoRA fine-tuning for MiniCPM-Llama3-V 2.5, using only 2 V100 GPUs! See more statistics here.

    • [2024.05.25] MiniCPM-Llama3-V 2.5 now supports streaming outputs and customized system prompts. Try it here!

    • [2024.05.24] We release the MiniCPM-Llama3-V 2.5 gguf, which supports llama.cpp inference and provides a 6~8 token/s smooth decoding on mobile phones. Try it now!

    • [2024.05.23] 🔍 We've released a comprehensive comparison between Phi-3-vision-128k-instruct and MiniCPM-Llama3-V 2.5, including benchmarks evaluations, multilingual capabilities, and inference efficiency 🌟📊🌍🚀. Click here to view more details.

    • [2024.05.20] We open-soure MiniCPM-Llama3-V 2.5, it has improved OCR capability and supports 30+ languages, representing the first end-side MLLM achieving GPT-4V level performance! We provide efficient inference and simple fine-tuning. Try it now!

    • [2024.04.23] MiniCPM-V-2.0 supports vLLM now! Click here to view more details.

    • [2024.04.18] We create a HuggingFace Space to host the demo of MiniCPM-V 2.0 at here!

    • [2024.04.17] MiniCPM-V-2.0 supports deploying WebUI Demo now!

    • [2024.04.15] MiniCPM-V-2.0 now also supports fine-tuning with the SWIFT framework!

    • [2024.04.12] We open-source MiniCPM-V 2.0, which achieves comparable performance with Gemini Pro in understanding scene text and outperforms strong Qwen-VL-Chat 9.6B and Yi-VL 34B on OpenCompass, a comprehensive evaluation over 11 popular benchmarks. Click here to view the MiniCPM-V 2.0 technical blog.

    • [2024.03.14] MiniCPM-V now supports fine-tuning with the SWIFT framework. Thanks to Jintao for the contribution!

    • [2024.03.01] MiniCPM-V now can be deployed on Mac!

    • [2024.02.01] We open-source MiniCPM-V and OmniLMM-12B, which support efficient end-side deployment and powerful multimodal capabilities correspondingly.

    Contents

    MiniCPM-V 4.5

    MiniCPM-V 4.5 is the latest and most capable model in the MiniCPM-V series. The model is built on Qwen3-8B and SigLIP2-400M with a total of 8B parameters. It exhibits a significant performance improvement over previous MiniCPM-V and MiniCPM-o models, and introduces new useful features. Notable features of MiniCPM-V 4.5 include:

    • 🔥 State-of-the-art Vision-Language Capability. MiniCPM-V 4.5 achieves an average score of 77.0 on OpenCompass, a comprehensive evaluation of 8 popular benchmarks. With only 8B parameters, it surpasses widely used proprietary models like GPT-4o-latest, Gemini-2.0 Pro, and strong open-source models like Qwen2.5-VL 72B for vision-language capabilities, making it the most performant MLLM under 30B parameters.

    • 🎬 Efficient High Refresh Rate and Long Video Understanding. Powered by a new unified 3D-Resampler over images and videos, MiniCPM-V 4.5 can now achieve 96x compression rate for video tokens, where 6 448x448 video frames can be jointly compressed into 64 video tokens (normally 1,536 tokens for most MLLMs). This means that the model can percieve significantly more video frames without increasing the LLM inference cost. This brings state-of-the-art high refresh rate (up to 10FPS) video understanding and long video understanding capabilities on Video-MME, LVBench, MLVU, MotionBench, FavorBench, etc., efficiently.

    • ⚙️ Controllable Hybrid Fast/Deep Thinking. MiniCPM-V 4.5 supports both fast thinking for efficient frequent usage with competitive performance, and deep thinking for more complex problem solving. To cover efficiency and performance trade-offs in different user scenarios, this fast/deep thinking mode can be switched in a highly controlled fashion.

    • 💪 Strong OCR, Document Parsing and Others. Based on LLaVA-UHD architecture, MiniCPM-V 4.5 can process high-resolution images with any aspect ratio and up to 1.8 million pixels (e.g., 1344x1344), using 4x less visual tokens than most MLLMs. The model achieves leading performance on OCRBench, surpassing proprietary models such as GPT-4o-latest and Gemini 2.5. It also achieves state-of-the-art performance for PDF document parsing capability on OmniDocBench among general MLLMs. Based on the the latest RLAIF-V and VisCPM techniques, it features trustworthy behaviors, outperforming GPT-4o-latest on MMHal-Bench, and supports multilingual capabilities in more than 30 languages.

    • 💫 Easy Usage. MiniCPM-V 4.5 can be easily used in various ways: (1) llama.cpp and ollama support for efficient CPU inference on local devices, (2) int4, GGUF and AWQ format quantized models in 16 sizes, (3) SGLang and vLLM support for high-throughput and memory-efficient inference, (4) fine-tuning on new domains and tasks with Transformers and LLaMA-Factory, (5) quick local WebUI demo, (6) optimized local iOS app on iPhone and iPad, and (7) online web demo on server. See our Cookbook for full usages!

    Key Techniques

    • Architechture: Unified 3D-Resampler for High-density Video Compression. MiniCPM-V 4.5 introduces a 3D-Resampler that overcomes the performance-efficiency trade-off in video understanding. By grouping and jointly compressing up to 6 consecutive video frames into just 64 tokens (the same token count used for a single image in MiniCPM-V series), MiniCPM-V 4.5 achieves a 96× compression rate for video tokens. This allows the model to process more video frames without additional LLM computational cost, enabling high refresh rate video and long video understanding. The architecture supports unified encoding for images, multi-image inputs, and videos, ensuring seamless capability and knowledge transfer.

    • Pre-training: Unified Learning for OCR and Knowledge from Documents. Existing MLLMs learn OCR capability and knowledge from documents in isolated training approaches. We observe the essential difference between these two training approaches is the visibility of the text in images. By dynamically corrupting text regions in documents with varying noise levels and asking the model to reconstruct the text, the model learns to adaptively and properly switch between accurate text recognition (when text is visible) and multimodal context-based knowledge reasoning (when text is heavily obscured). This eliminates reliance on error-prone document parsers in knowledge learning from documents, and prevents hallucinations from over-augmented OCR data, resulting in top-tier OCR and multimodal knowledge performance with minimal engineering overhead.

    • Post-training: Hybrid Fast/Deep Thinking with Multimodal RL. MiniCPM-V 4.5 offers a balanced reasoning experience through two switchable modes: fast thinking for efficient daily use and deep thinking for complex tasks. Using a new hybrid reinforcement learning method, the model jointly optimizes both modes, significantly enhancing fast-mode performance without compromising deep-mode capability. Incorporated with RLPR and RLAIF-V, it generalizes robust reasoning skills from broad multimodal data while effectively reducing hallucinations.

    Evaluation

    Examples

    en_case1 en_case2 en_case3
    Click to view more cases.
    zh_extra

    We deploy MiniCPM-V 4.5 on iPad M4 with iOS demo. The demo video is the raw screen recording without edition.

        

        

    MiniCPM-o 2.6

    MiniCPM-o 2.6 is the latest and most capable model in the MiniCPM-o series. The model is built in an end-to-end fashion based on SigLip-400M, Whisper-medium-300M, ChatTTS-200M, and Qwen2.5-7B with a total of 8B parameters. It exhibits a significant performance improvement over MiniCPM-V 2.6, and introduces new features for real-time speech conversation and multimodal live streaming. Notable features of MiniCPM-o 2.6 include:

    • 🔥 Leading Visual Capability. MiniCPM-o 2.6 achieves an average score of 70.2 on OpenCompass, a comprehensive evaluation of 8 popular benchmarks. With only 8B parameters, it surpasses widely used proprietary models like GPT-4o-202405, Gemini 1.5 Pro, and Claude 3.5 Sonnet for single image understanding. It also outperforms GPT-4V and Claude 3.5 Sonnet in multi-image and video understanding, and shows promising in-context learning capability.

    • 🎙 State-of-the-art Speech Capability. MiniCPM-o 2.6 supports bilingual real-time speech conversation with configurable voices in English and Chinese. It outperforms GPT-4o-realtime on audio understanding tasks such as ASR and STT translation, and shows state-of-the-art performance on speech conversation in both semantic and acoustic evaluations in the open-source community. It also allows for fun features such as emotion/speed/style control, end-to-end voice cloning, role play, etc.

    • 🎬 Strong Multimodal Live Streaming Capability. As a new feature, MiniCPM-o 2.6 can accept continuous video and audio streams independent of user queries, and support real-time speech interaction. It outperforms GPT-4o-202408 and Claude 3.5 Sonnet and shows state-of-art performance in the open-source community on StreamingBench, a comprehensive benchmark for real-time video understanding, omni-source (video & audio) understanding, and multimodal contextual understanding.

    • 💪 Strong OCR Capability and Others. Advancing popular visual capabilities from MiniCPM-V series, MiniCPM-o 2.6 can process images with any aspect ratio and up to 1.8 million pixels (e.g., 1344x1344). It achieves state-of-the-art performance on OCRBench for models under 25B, surpassing proprietary models such as GPT-4o-202405. Based on the the latest RLAIF-V and VisCPM techniques, it features trustworthy behaviors, outperforming GPT-4o and Claude 3.5 Sonnet on MMHal-Bench, and supports multilingual capabilities on more than 30 languages.

    • 🚀 Superior Efficiency. In addition to its friendly size, MiniCPM-o 2.6 also shows state-of-the-art token density (i.e., the number of pixels encoded into each visual token). It produces only 640 tokens when processing a 1.8M pixel image, which is 75% fewer than most models. This directly improves the inference speed, first-token latency, memory usage, and power consumption. As a result, MiniCPM-o 2.6 can efficiently support multimodal live streaming on end-side devices such as iPads.

    • 💫 Easy Usage. MiniCPM-o 2.6 can be easily used in various ways: (1) llama.cpp support for efficient CPU inference on local devices, (2) int4 and GGUF format quantized models in 16 sizes, (3) vLLM support for high-throughput and memory-efficient inference, (4) fine-tuning on new domains and tasks with LLaMA-Factory, (5) quick local WebUI demo, and (6) online web demo on server.

    Model Architecture.

    • End-to-end Omni-modal Architecture. Different modality encoders/decoders are connected and trained in an end-to-end fashion to fully exploit rich multimodal knowledge. The model is trained in a fully end-to-end manner with only CE loss.
    • Omni-modal Live Streaming Mechanism. (1) We change the offline modality encoder/decoders into online ones for streaming inputs/outputs. (2) We devise a time-division multiplexing (TDM) mechanism for omni-modality streaming processing in the LLM backbone. It divides parallel omni-modality streams into sequential info within small periodic time slices.
    • Configurable Speech Modeling Design. We devise a multimodal system prompt, including traditional text system prompt, and a new audio system prompt to determine the assistant voice. This enables flexible voice configurations in inference time, and also facilitates end-to-end voice cloning and description-based voice creation.

    Evaluation

    Click to view visual understanding results.

    Image Understanding

    ModelSizeToken Density+OpenCompassOCRBenchMathVista miniChartQAMMVetMMStarMMEMMB1.1 testAI2DMMMU valHallusionBenchTextVQA valDocVQA testMathVerse miniMathVisionMMHal Score
    Proprietary
    GPT-4o-20240513-108869.973661.385.769.163.92328.782.284.669.255.0-92.850.230.43.6
    Claude3.5-Sonnet-75067.978861.690.866.062.21920.078.580.265.949.9-95.2--3.4
    Gemini 1.5 Pro--64.475457.781.364.059.12110.673.979.160.645.673.586.5-19.2-
    GPT-4o-mini-20240718-108864.178552.4-66.954.82003.476.077.860.046.1----3.3
    Open Source
    Cambrian-34B34B182058.359150.375.653.254.22049.977.879.550.441.676.775.5---
    GLM-4V-9B13B78459.177651.1-58.054.82018.867.971.246.945.0-----
    Pixtral-12B12B25661.068556.981.858.554.5-72.779.051.147.075.790.7---
    VITA-1.58B78463.374166.2-52.760.22328.176.879.252.644.6-----
    DeepSeek-VL2-27B (4B)27B67266.480963.986.060.061.92253.081.283.854.045.384.293.3--3.0
    Qwen2-VL-7B8B78467.186658.283.062.060.72326.081.883.054.150.684.394.531.916.33.2
    LLaVA-OneVision-72B72B18268.174167.583.760.665.82261.085.085.656.849.080.591.339.1-3.5
    InternVL2.5-8B8B70668.382264.484.862.862.82344.083.684.556.050.179.193.039.519.73.4
    MiniCPM-V 2.68B282265.2852*60.679.460.057.52348.4*78.082.149.8*48.1*80.190.825.718.33.6
    MiniCPM-o 2.68B282270.2897*71.9*86.9*67.564.02372.0*80.585.850.4*51.982.093.541.4*23.1*3.8
    * We evaluate this benchmark using chain-of-thought prompting. Specifically, for MME, we used this technique only for the Cognition set.

    + Token Density: number of pixels encoded into each visual token at maximum resolution, i.e., # pixels at maximum resolution / # visual tokens.

    Note: For proprietary models, we calculate token density based on the image encoding charging strategy defined in the official API documentation, which provides an upper-bound estimation.

    Multi-image and Video Understanding

    ModelSizeBLINK valMantis EvalMIRBVideo-MME (wo / w subs)
    Proprietary
    GPT-4o-20240513-68.0--71.9/77.2
    GPT4V-54.662.753.159.9/63.3
    Open-source
    VITA-1.58B45.0--56.1/58.7
    LLaVA-NeXT-Interleave 14B14B52.666.430.2-
    LLaVA-OneVision-72B72B55.477.6-66.2/69.5
    MANTIS 8B8B49.159.534.8-
    Qwen2-VL-7B8B53.269.6*67.6*63.3/69.0
    InternVL2.5-8B8B54.867.752.564.2/66.9
    MiniCPM-V 2.68B53.069.153.860.9/63.6
    MiniCPM-o 2.68B56.771.958.663.9/67.9
    * We evaluate officially released checkpoints by ourselves.
    Click to view audio understanding and speech conversation results.

    Audio Understanding

    TaskSizeASR (zh)ASR (en)ASTEmotion
    MetricCER↓WER↓BLEU↑ACC↑
    DatasetAISHELL-1Fleurs zhWenetSpeech test-netLibriSpeech test-cleanGigaSpeechTED-LIUMCoVoST en2zhCoVoST zh2enMELD emotion
    Proprietary
    GPT-4o-Realtime-7.3*5.4*28.9*2.6*12.9*4.8*37.1*15.7*33.2*
    Gemini 1.5 Pro-4.5*5.9*14.3*2.9*10.6*3.0*47.3*22.6*48.4*
    Open-Source
    Qwen2-Audio-7B8B-7.5-1.6--45.224.455.3
    Qwen2-Audio-7B-Instruct8B2.6*6.9*10.3*3.1*9.7*5.9*39.5*22.9*17.4*
    VITA-1.58B2.16-8.43.4-----
    GLM-4-Voice-Base9B2.5--2.8----
    MiniCPM-o 2.68B1.64.46.91.78.73.048.227.252.4
    * We evaluate officially released checkpoints by ourselves.

    Speech Generation

    TaskSizeSpeechQA
    MetricACC↑G-Eval (10 point)↑Semantic ELO score↑Acoustic ELO score↑Overall ELO score↑UTMOS↑ASR-WER↓
    DatasetSpeech Llama Q.Speech Web Q.Speech Trivia QASpeech AlpacaEvalAudioArena
    Proprietary
    GPT-4o-Realtime71.751.669.77.41157120312004.22.3
    Open-Source
    GLM-4-Voice9B50.032.036.45.1999114710354.111.7
    Llama-Omni8B45.322.910.73.99608788973.224.3
    VITA-1.58B46.728.123.32.0-----
    Moshi7B43.723.816.72.48718088752.88.2
    Mini-Omni1B22.012.86.92.59268038653.410.0
    MiniCPM-o 2.68B61.040.040.25.11088116311314.29.8
    All results are from AudioEvals, and the evaluation methods along with further details can be found in AudioEvals.

    End-to-end Voice Cloning

    TaskVoice cloning
    MetricSIMO↑SIMO↑
    DatasetSeed-TTS test-zhSeed-TTS test-en
    F5-TTS7667
    CosyVoice7564
    FireRedTTS6346
    MiniCPM-o 2.65747
    Click to view multimodal live streaming results.

    Multimodal Live Streaming: results on StreamingBench

    ModelSizeReal-Time Video UnderstandingOmni-Source UnderstandingContextual UnderstandingOverall
    Proprietary
    Gemini 1.5 Pro-77.467.851.170.3
    GPT-4o-202408-74.551.048.064.1
    Claude-3.5-Sonnet-74.041.437.859.7
    Open-source
    VILA-1.58B61.537.526.749.5
    LongVA7B63.135.930.250.7
    LLaVA-Next-Video-34B34B69.841.734.356.7
    Qwen2-VL-7B8B71.240.733.157.0
    InternVL2-8B8B70.142.734.157.0
    VITA-1.58B70.940.835.857.4
    LLaVA-OneVision-7B8B74.340.831.058.4
    InternLM-XC2.5-OL-7B8B75.446.233.660.8
    MiniCPM-V 2.68B72.440.233.457.7
    MiniCPM-o 2.68B79.953.438.566.0

    Examples

    We deploy MiniCPM-o 2.6 on end devices. The demo video is the raw-speed recording on an iPad Pro and a Web demo.


    math diagram bike

    Legacy Models

    ModelIntroduction and Guidance
    MiniCPM-V 4.0Document
    MiniCPM-V 2.6Document
    MiniCPM-Llama3-V 2.5Document
    MiniCPM-V 2.0Document
    MiniCPM-V 1.0Document
    OmniLMM-12BDocument

    MiniCPM-V & o Cookbook

    Discover comprehensive, ready-to-deploy solutions for the MiniCPM-V and MiniCPM-o model series in our structured cookbook, which empowers developers to rapidly implement multimodal AI applications with integrated vision, speech, and live-streaming capabilities. Key features include:

    Easy Usage Documentation

    Our comprehensive documentation website presents every recipe in a clear, well-organized manner. All features are displayed at a glance, making it easy for you to quickly find exactly what you need.

    Broad User Spectrum

    We support a wide range of users, from individuals to enterprises and researchers.

    • Individuals: Enjoy effortless inference using Ollama and Llama.cpp with minimal setup.
    • Enterprises: Achieve high-throughput, scalable performance with vLLM and SGLang.
    • Researchers: Leverage advanced frameworks including Transformers, LLaMA-Factory, SWIFT, and Align-anything to enable flexible model development and cutting-edge experimentation.

    Versatile Deployment Scenarios

    Our ecosystem delivers optimal solution for a variety of hardware environments and deployment demands.

    • Web demo: Launch interactive multimodal AI web demo with FastAPI.
    • Quantized deployment: Maximize efficiency and minimize resource consumption using GGUF and BNB.
    • End devices: Bring powerful AI experiences to iPhone and iPad, supporting offline and privacy-sensitive applications.

    Chat with Our Demo on Gradio 🤗

    We provide online and local demos powered by Hugging Face Gradio , the most popular model deployment framework nowadays. It supports streaming outputs, progress bars, queuing, alerts, and other useful features.

    Online Demo

    Click here to try out the online demo of MiniCPM-o 2.6 | MiniCPM-V 2.6 | MiniCPM-Llama3-V 2.5 | MiniCPM-V 2.0.

    Local WebUI Demo

    You can easily build your own local WebUI demo using the following commands.

    Please ensure that transformers==4.44.2 is installed, as other versions may have compatibility issues.

    If you are using an older version of PyTorch, you might encounter this issue "weight_norm_fwd_first_dim_kernel" not implemented for 'BFloat16', Please add self.minicpmo_model.tts.float() during the model initialization.

    For real-time voice/video call demo:

    1. launch model server:
    pip install -r requirements_o2.6.txt
    
    python web_demos/minicpm-o_2.6/model_server.py
    
    1. launch web server:
    # Make sure Node and PNPM is installed.
    sudo apt-get update
    sudo apt-get install nodejs npm
    npm install -g pnpm
    
    
    cd web_demos/minicpm-o_2.6/web_server
    # create ssl cert for https, https is required to request camera and microphone permissions.
    bash ./make_ssl_cert.sh  # output key.pem and cert.pem
    
    pnpm install  # install requirements
    pnpm run dev  # start server
    

    Open https://localhost:8088/ in browser and enjoy the real-time voice/video call.

    For chatbot demo:

    pip install -r requirements_o2.6.txt
    
    python web_demos/minicpm-o_2.6/chatbot_web_demo_o2.6.py
    

    Open http://localhost:8000/ in browser and enjoy the vision mode chatbot.

    Inference

    Model Zoo

    ModelDeviceMemory         DescriptionDownload
    MiniCPM-V 4.5GPU18 GBThe latest version, strong end-side multimodal performance for single image, multi-image and video understanding.🤗   
    MiniCPM-V 4.5 ggufCPU8 GBThe gguf version, lower memory usage and faster inference.🤗   
    MiniCPM-V 4.5 int4GPU9 GBThe int4 quantized version, lower GPU memory usage.🤗   
    MiniCPM-V 4.5 AWQGPU9 GBThe int4 quantized version, lower GPU memory usage.🤗   
    MiniCPM-o 2.6GPU18 GBThe latest version, achieving GPT-4o level performance for vision, speech and multimodal live streaming on end-side devices.🤗   
    MiniCPM-o 2.6 ggufCPU8 GBThe gguf version, lower memory usage and faster inference.🤗   
    MiniCPM-o 2.6 int4GPU9 GBThe int4 quantized version, lower GPU memory usage.🤗   

    Multi-turn Conversation

    If you wish to enable long-thinking mode, provide the argument enable_thinking=True to the chat function.

    pip install -r requirements_o2.6.txt
    

    Please refer to the following codes to run.

    import torch
    from PIL import Image
    from transformers import AutoModel, AutoTokenizer
    
    torch.manual_seed(100)
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True, # or openbmb/MiniCPM-o-2_6
        attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eager
    model = model.eval().cuda()
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True) # or openbmb/MiniCPM-o-2_6
    
    image = Image.open('./assets/minicpmo2_6/show_demo.jpg').convert('RGB')
    
    enable_thinking=False # If `enable_thinking=True`, the long-thinking mode is enabled.
    
    # First round chat 
    question = "What is the landform in the picture?"
    msgs = [{'role': 'user', 'content': [image, question]}]
    
    answer = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        enable_thinking=enable_thinking
    )
    print(answer)
    
    # Second round chat, pass history context of multi-turn conversation
    msgs.append({"role": "assistant", "content": [answer]})
    msgs.append({"role": "user", "content": ["What should I pay attention to when traveling here?"]})
    
    answer = model.chat(
        msgs=msgs,
        tokenizer=tokenizer
    )
    print(answer)
    

    You will get the following output:

    # round1
    The landform in the picture is karst topography. Karst landscapes are characterized by distinctive, jagged limestone hills or mountains with steep, irregular peaks and deep valleys—exactly what you see here These unique formations result from the dissolution of soluble rocks like limestone over millions of years through water erosion.
    
    This scene closely resembles the famous karst landscape of Guilin and Yangshuo in China’s Guangxi Province. The area features dramatic, pointed limestone peaks rising dramatically above serene rivers and lush green forests, creating a breathtaking and iconic natural beauty that attracts millions of visitors each year for its picturesque views.
    
    # round2
    When traveling to a karst landscape like this, here are some important tips:
    
    1. Wear comfortable shoes: The terrain can be uneven and hilly.
    2. Bring water and snacks for energy during hikes or boat rides.
    3. Protect yourself from the sun with sunscreen, hats, and sunglasses—especially since you’ll likely spend time outdoors exploring scenic spots.
    4. Respect local customs and nature regulations by not littering or disturbing wildlife.
    
    By following these guidelines, you'll have a safe and enjoyable trip while appreciating the stunning natural beauty of places such as Guilin’s karst mountains.
    

    Chat with Multiple Images

    Click to view Python code running MiniCPM-V-4_5 with multiple images input.
    import torch
    from PIL import Image
    from transformers import AutoModel, AutoTokenizer
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True,  # or openbmb/MiniCPM-o-2_6
        attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eager
    model = model.eval().cuda()
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True)  # or openbmb/MiniCPM-o-2_6
    
    image1 = Image.open('image1.jpg').convert('RGB')
    image2 = Image.open('image2.jpg').convert('RGB')
    question = 'Compare image 1 and image 2, tell me about the differences between image 1 and image 2.'
    
    msgs = [{'role': 'user', 'content': [image1, image2, question]}]
    
    answer = model.chat(
        msgs=msgs,
        tokenizer=tokenizer
    )
    print(answer)
    

    In-context Few-shot Learning

    Click to view Python code running MiniCPM-V-4_5 with few-shot input.
    import torch
    from PIL import Image
    from transformers import AutoModel, AutoTokenizer
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True,  # or openbmb/MiniCPM-o-2_6
        attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eager
    model = model.eval().cuda()
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True)  # or openbmb/MiniCPM-o-2_6
    
    question = "production date" 
    image1 = Image.open('example1.jpg').convert('RGB')
    answer1 = "2023.08.04"
    image2 = Image.open('example2.jpg').convert('RGB')
    answer2 = "2007.04.24"
    image_test = Image.open('test.jpg').convert('RGB')
    
    msgs = [
        {'role': 'user', 'content': [image1, question]}, {'role': 'assistant', 'content': [answer1]},
        {'role': 'user', 'content': [image2, question]}, {'role': 'assistant', 'content': [answer2]},
        {'role': 'user', 'content': [image_test, question]}
    ]
    
    answer = model.chat(
        msgs=msgs,
        tokenizer=tokenizer
    )
    print(answer)
    

    Chat with Video

    Click to view Python code running MiniCPM-V-4_5 by with video input and 3D-Resampler.
    ## The 3d-resampler compresses multiple frames into 64 tokens by introducing temporal_ids. 
    # To achieve this, you need to organize your video data into two corresponding sequences: 
    #   frames: List[Image]
    #   temporal_ids: List[List[Int]].
    
    import torch
    from PIL import Image
    from transformers import AutoModel, AutoTokenizer
    from decord import VideoReader, cpu    # pip install decord
    from scipy.spatial import cKDTree
    import numpy as np
    import math
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True,  # or openbmb/MiniCPM-o-2_6
        attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eager
    model = model.eval().cuda()
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-V-4_5', trust_remote_code=True)  # or openbmb/MiniCPM-o-2_6
    
    MAX_NUM_FRAMES=180 # Indicates the maximum number of frames received after the videos are packed. The actual maximum number of valid frames is MAX_NUM_FRAMES * MAX_NUM_PACKING.
    MAX_NUM_PACKING=3  # indicates the maximum packing number of video frames. valid range: 1-6
    TIME_SCALE = 0.1 
    
    def map_to_nearest_scale(values, scale):
        tree = cKDTree(np.asarray(scale)[:, None])
        _, indices = tree.query(np.asarray(values)[:, None])
        return np.asarray(scale)[indices]
    
    
    def group_array(arr, size):
        return [arr[i:i+size] for i in range(0, len(arr), size)]
    
    def encode_video(video_path, choose_fps=3, force_packing=None):
        def uniform_sample(l, n):
            gap = len(l) / n
            idxs = [int(i * gap + gap / 2) for i in range(n)]
            return [l[i] for i in idxs]
        vr = VideoReader(video_path, ctx=cpu(0))
        fps = vr.get_avg_fps()
        video_duration = len(vr) / fps
            
        if choose_fps * int(video_duration) <= MAX_NUM_FRAMES:
            packing_nums = 1
            choose_frames = round(min(choose_fps, round(fps)) * min(MAX_NUM_FRAMES, video_duration))
            
        else:
            packing_nums = math.ceil(video_duration * choose_fps / MAX_NUM_FRAMES)
            if packing_nums <= MAX_NUM_PACKING:
                choose_frames = round(video_duration * choose_fps)
            else:
                choose_frames = round(MAX_NUM_FRAMES * MAX_NUM_PACKING)
                packing_nums = MAX_NUM_PACKING
    
        frame_idx = [i for i in range(0, len(vr))]      
        frame_idx =  np.array(uniform_sample(frame_idx, choose_frames))
    
        if force_packing:
            packing_nums = min(force_packing, MAX_NUM_PACKING)
        
        print(video_path, ' duration:', video_duration)
        print(f'get video frames={len(frame_idx)}, packing_nums={packing_nums}')
        
        frames = vr.get_batch(frame_idx).asnumpy()
    
        frame_idx_ts = frame_idx / fps
        scale = np.arange(0, video_duration, TIME_SCALE)
    
        frame_ts_id = map_to_nearest_scale(frame_idx_ts, scale) / TIME_SCALE
        frame_ts_id = frame_ts_id.astype(np.int32)
    
        assert len(frames) == len(frame_ts_id)
    
        frames = [Image.fromarray(v.astype('uint8')).convert('RGB') for v in frames]
        frame_ts_id_group = group_array(frame_ts_id, packing_nums)
        
        return frames, frame_ts_id_group
    
    
    video_path="video_test.mp4"
    fps = 5 # fps for video
    force_packing = None # You can set force_packing to ensure that 3D packing is forcibly enabled; otherwise, encode_video will dynamically set the packing quantity based on the duration.
    frames, frame_ts_id_group = encode_video(video_path, fps, force_packing=force_packing)
    
    question = "Describe the video"
    msgs = [
        {'role': 'user', 'content': frames + [question]}, 
    ]
    
    
    answer = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        use_image_id=False,
        max_slice_nums=1,
        temporal_ids=frame_ts_id_group
    )
    print(answer)
    

    Speech and Audio Mode

    Model initialization

    import torch
    import librosa
    from transformers import AutoModel, AutoTokenizer
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True,
        attn_implementation='sdpa', torch_dtype=torch.bfloat16) # sdpa or flash_attention_2, no eager
    model = model.eval().cuda()
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True)
    
    model.init_tts()
    model.tts.float()
    

    Mimick

    Mimick task reflects a model's end-to-end speech modeling capability. The model takes audio input, and outputs an ASR transcription and subsequently reconstructs the original audio with high similarity. The higher the similarity between the reconstructed audio and the original audio, the stronger the model's foundational capability in end-to-end speech modeling.

    mimick_prompt = "Please repeat each user's speech, including voice style and speech content."
    audio_input, _ = librosa.load('./assets/input_examples/Trump_WEF_2018_10s.mp3', sr=16000, mono=True) # load the audio to be mimicked
    
    # `./assets/input_examples/fast-pace.wav`, 
    # `./assets/input_examples/chi-english-1.wav` 
    # `./assets/input_examples/exciting-emotion.wav` 
    # for different aspects of speech-centric features.
    
    msgs = [{'role': 'user', 'content': [mimick_prompt, audio_input]}]
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        temperature=0.3,
        generate_audio=True,
        output_audio_path='output_mimick.wav', # save the tts result to output_audio_path
    )
    

    General Speech Conversation with Configurable Voices

    A general usage scenario of MiniCPM-o-2.6 is role-playing a specific character based on the audio prompt. It will mimic the voice of the character to some extent and act like the character in text, including language style. In this mode, MiniCPM-o-2.6 sounds more natural and human-like. Self-defined audio prompts can be used to customize the voice of the character in an end-to-end manner.

    ref_audio, _ = librosa.load('./assets/input_examples/icl_20.wav', sr=16000, mono=True) # load the reference audio
    sys_prompt = model.get_sys_prompt(ref_audio=ref_audio, mode='audio_roleplay', language='en')
    
    # round one
    user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]}
    msgs = [sys_prompt, user_question]
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_roleplay_round_1.wav',
    )
    
    # round two
    history = msgs.append({'role': 'assistant', 'content': res})
    user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]}
    msgs = history.append(user_question)
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_roleplay_round_2.wav',
    )
    print(res)
    

    Speech Conversation as an AI Assistant

    An enhanced feature of MiniCPM-o-2.6 is to act as an AI assistant, but only with limited choice of voices. In this mode, MiniCPM-o-2.6 is less human-like and more like a voice assistant. In this mode, the model is more instruction-following. For demo, you are suggested to use assistant_female_voice, assistant_male_voice, and assistant_default_female_voice. Other voices may work but not as stable as the default voices.

    Please note that, assistant_female_voice and assistant_male_voice are more stable but sounds like robots, while assistant_default_female_voice is more human-alike but not stable, its voice often changes in multiple turns. We suggest you to try stable voices assistant_female_voice and assistant_male_voice.

    ref_audio, _ = librosa.load('./assets/input_examples/assistant_female_voice.wav', sr=16000, mono=True) # or use `./assets/input_examples/assistant_male_voice.wav`
    sys_prompt = model.get_sys_prompt(ref_audio=ref_audio, mode='audio_assistant', language='en') 
    user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]} # load the user's audio question
    
    # round one
    msgs = [sys_prompt, user_question]
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_assistant_round_1.wav',
    )
    
    # round two
    history = msgs.append({'role': 'assistant', 'content': res})
    user_question = {'role': 'user', 'content': [librosa.load('xxx.wav', sr=16000, mono=True)[0]]}
    msgs = history.append(user_question)
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_assistant_round_2.wav',
    )
    print(res)
    

    Instruction-to-Speech

    MiniCPM-o-2.6 can also do Instruction-to-Speech, aka Voice Creation. You can describe a voice in detail, and the model will generate a voice that matches the description. For more Instruction-to-Speech sample instructions, you can refer to https://voxinstruct.github.io/VoxInstruct/.

    instruction = 'Speak like a male charming superstar, radiating confidence and style in every word.'
    
    msgs = [{'role': 'user', 'content': [instruction]}]
    
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_voice_creation.wav',
    )
    

    Voice Cloning

    MiniCPM-o-2.6 can also do zero-shot text-to-speech, aka Voice Cloning. With this mode, model will act like a TTS model.

    ref_audio, _ = librosa.load('./assets/input_examples/icl_20.wav', sr=16000, mono=True) # load the reference audio
    sys_prompt = model.get_sys_prompt(ref_audio=ref_audio, mode='voice_cloning', language='en')
    text_prompt = f"Please read the text below."
    user_question = {'role': 'user', 'content': [text_prompt, "content that you want to read"]}
    
    msgs = [sys_prompt, user_question]
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_voice_cloning.wav',
    )
    
    

    Addressing Various Audio Understanding Tasks

    MiniCPM-o-2.6 can also be used to address various audio understanding tasks, such as ASR, speaker analysis, general audio captioning, and sound scene tagging.

    For audio-to-text tasks, you can use the following prompts:

    • ASR with ZH(same as AST en2zh): 请仔细听这段音频片段,并将其内容逐字记录。
    • ASR with EN(same as AST zh2en): Please listen to the audio snippet carefully and transcribe the content.
    • Speaker Analysis: Based on the speaker's content, speculate on their gender, condition, age range, and health status.
    • General Audio Caption: Summarize the main content of the audio.
    • General Sound Scene Tagging: Utilize one keyword to convey the audio's content or the associated scene.
    task_prompt = "Please listen to the audio snippet carefully and transcribe the content." + "\n" # can change to other prompts.
    audio_input, _ = librosa.load('./assets/input_examples/audio_understanding.mp3', sr=16000, mono=True) # load the audio to be captioned
    
    msgs = [{'role': 'user', 'content': [task_prompt, audio_input]}]
    
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        max_new_tokens=128,
        use_tts_template=True,
        generate_audio=True,
        temperature=0.3,
        output_audio_path='result_audio_understanding.wav',
    )
    print(res)
    

    Multimodal Live Streaming

    Click to view Python code running MiniCPM-o 2.6 with chat inference.
    import math
    import numpy as np
    from PIL import Image
    from moviepy.editor import VideoFileClip
    import tempfile
    import librosa
    import soundfile as sf
    import torch
    from transformers import AutoModel, AutoTokenizer
    
    def get_video_chunk_content(video_path, flatten=True):
        video = VideoFileClip(video_path)
        print('video_duration:', video.duration)
        
        with tempfile.NamedTemporaryFile(suffix=".wav", delete=True) as temp_audio_file:
            temp_audio_file_path = temp_audio_file.name
            video.audio.write_audiofile(temp_audio_file_path, codec="pcm_s16le", fps=16000)
            audio_np, sr = librosa.load(temp_audio_file_path, sr=16000, mono=True)
        num_units = math.ceil(video.duration)
        
        # 1 frame + 1s audio chunk
        contents= []
        for i in range(num_units):
            frame = video.get_frame(i+1)
            image = Image.fromarray((frame).astype(np.uint8))
            audio = audio_np[sr*i:sr*(i+1)]
            if flatten:
                contents.extend(["<unit>", image, audio])
            else:
                contents.append(["<unit>", image, audio])
        
        return contents
    
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True,
        attn_implementation='sdpa', torch_dtype=torch.bfloat16)
    model = model.eval().cuda()
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-o-2_6', trust_remote_code=True)
    
    model.init_tts()
    
    # If you are using an older version of PyTorch, you might encounter this issue "weight_norm_fwd_first_dim_kernel" not implemented for 'BFloat16', Please convert the TTS to float32 type.
    # model.tts.float()
    
    # https://huggingface.co/openbmb/MiniCPM-o-2_6/blob/main/assets/Skiing.mp4
    video_path="assets/Skiing.mp4"
    sys_msg = model.get_sys_prompt(mode='omni', language='en')
    # if use voice clone prompt, please set ref_audio
    # ref_audio_path = '/path/to/ref_audio'
    # ref_audio, _ = librosa.load(ref_audio_path, sr=16000, mono=True)
    # sys_msg = model.get_sys_prompt(ref_audio=ref_audio, mode='omni', language='en')
    
    contents = get_video_chunk_content(video_path)
    msg = {"role":"user", "content": contents}
    msgs = [sys_msg, msg]
    
    # please set generate_audio=True and output_audio_path to save the tts result
    generate_audio = True
    output_audio_path = 'output.wav'
    
    res = model.chat(
        msgs=msgs,
        tokenizer=tokenizer,
        sampling=True,
        temperature=0.5,
        max_new_tokens=4096,
        omni_input=True, # please set omni_input=True when omni inference
        use_tts_template=True,
        generate_audio=generate_audio,
        output_audio_path=output_audio_path,
        max_slice_nums=1,
        use_image_id=False,
        return_dict=True
    )
    print(res)
    
    Click to view Python code running MiniCPM-o 2.6 with streaming inference.

    Note: The streaming inference has a slight performance degradation because the audio encoding is not global.

    # a new conversation need reset session first, it will reset the kv-cache
    model.reset_session()
    
    contents = get_video_chunk_content(video_path, flatten=False)
    session_id = '123'
    generate_audio = True
    
    # 1. prefill system prompt
    res = model.streaming_prefill(
        session_id=session_id,
        msgs=[sys_msg], 
        tokenizer=tokenizer
    )
    
    # 2. prefill video/audio chunks
    for content in contents:
        msgs = [{"role":"user", "content": content}]
        res = model.streaming_prefill(
            session_id=session_id,
            msgs=msgs, 
            tokenizer=tokenizer
        )
    
    # 3. generate
    res = model.streaming_generate(
        session_id=session_id,
        tokenizer=tokenizer,
        temperature=0.5,
        generate_audio=generate_audio
    )
    
    audios = []
    text = ""
    
    if generate_audio:
        for r in res:
            audio_wav = r.audio_wav
            sampling_rate = r.sampling_rate
            txt = r.text
    
            audios.append(audio_wav)
            text += txt
            
        res = np.concatenate(audios)
        sf.write("output.wav", res, samplerate=sampling_rate)
        print("text:", text)
        print("audio saved to output.wav")
    else:
        for r in res:
            text += r['text']
        print("text:", text)
    

    Inference on Multiple GPUs

    You can run MiniCPM-Llama3-V 2.5 on multiple low VRAM GPUs (12 GB or 16 GB) by distributing the model's layers across multiple GPUs. Please refer to this tutorial for detailed instructions on how to load the model and inference using multiple low VRAM GPUs.

    Inference on Mac

    Click to view an example, to run MiniCPM-Llama3-V 2.5 on 💻 Mac with MPS (Apple silicon or AMD GPUs).
    # test.py  Need more than 16GB memory.
    import torch
    from PIL import Image
    from transformers import AutoModel, AutoTokenizer
    
    model = AutoModel.from_pretrained('openbmb/MiniCPM-Llama3-V-2_5', trust_remote_code=True, low_cpu_mem_usage=True)
    model = model.to(device='mps')
    
    tokenizer = AutoTokenizer.from_pretrained('openbmb/MiniCPM-Llama3-V-2_5', trust_remote_code=True)
    model.eval()
    
    image = Image.open('./assets/hk_OCR.jpg').convert('RGB')
    question = 'Where is this photo taken?'
    msgs = [{'role': 'user', 'content': question}]
    
    answer, context, _ = model.chat(
        image=image,
        msgs=msgs,
        context=None,
        tokenizer=tokenizer,
        sampling=True
    )
    print(answer)
    

    Run with command:

    PYTORCH_ENABLE_MPS_FALLBACK=1 python test.py
    

    Efficient Inference with llama.cpp, Ollama, vLLM

    See our fork of llama.cpp for more detail. This implementation supports smooth inference of 16~18 token/s on iPad (test environment:iPad Pro + M4).

    See our fork of Ollama for more detail. This implementation supports smooth inference of 16~18 token/s on iPad (test environment:iPad Pro + M4).

    vLLM now officially supports MiniCPM-V 2.6, MiniCPM-Llama3-V 2.5 and MiniCPM-V 2.0. And you can use our fork to run MiniCPM-o 2.6 for now. Click to see.
    1. Install vLLM(>=0.7.1):
    pip install vllm
    
    1. Run Example:

    Fine-tuning

    Simple Fine-tuning

    We support simple fine-tuning with Hugging Face for MiniCPM-o 2.6, MiniCPM-V 2.6, MiniCPM-Llama3-V 2.5 and MiniCPM-V 2.0.

    Reference Document

    With Align-Anything

    We support fine-tuning MiniCPM-o 2.6 by PKU-Alignment Team (both vision and audio, SFT and DPO) with the Align-Anything framework. Align-Anything is a scalable framework that aims to align any-modality large models with human intentions, open-sourcing the datasets, models and benchmarks. Benefiting from its concise and modular design, it supports 30+ open-source benchmarks, 40+ models and algorithms including SFT, SimPO, RLHF, etc. It also provides 30+ directly runnable scripts, making it suitable for beginners to quickly get started.

    Best Practices: MiniCPM-o 2.6.

    With LLaMA-Factory

    We support fine-tuning MiniCPM-o 2.6 and MiniCPM-V 2.6 with the LLaMA-Factory framework. LLaMA-Factory provides a solution for flexibly customizing the fine-tuning (Lora/Full/Qlora) of 200+ LLMs without the need for coding through the built-in web UI LLaMABoard. It supports various training methods like sft/ppo/dpo/kto and advanced algorithms like Galore/BAdam/LLaMA-Pro/Pissa/LongLoRA.

    Best Practices: MiniCPM-o 2.6 | MiniCPM-V 2.6.

    With the SWIFT Framework

    We now support MiniCPM-V series fine-tuning with the SWIFT framework. SWIFT supports training, inference, evaluation and deployment of nearly 200 LLMs and MLLMs . It supports the lightweight training solutions provided by PEFT and a complete Adapters Library including techniques such as NEFTune, LoRA+ and LLaMA-PRO.

    Best Practices:MiniCPM-V 1.0, MiniCPM-V 2.0, MiniCPM-V 2.6.

    Awesome work using MiniCPM-V & MiniCPM-o

    • text-extract-api: Document extraction API using OCRs and Ollama supported models GitHub Repo stars
    • comfyui_LLM_party: Build LLM workflows and integrate into existing image workflows GitHub Repo stars
    • Ollama-OCR: OCR package uses vlms through Ollama to extract text from images and PDF GitHub Repo stars
    • comfyui-mixlab-nodes: ComfyUI node suite supports Workflow-to-APP、GPT&3D and more GitHub Repo stars
    • OpenAvatarChat: Interactive digital human conversation implementation on single PC GitHub Repo stars
    • pensieve: A privacy-focused passive recording project by recording screen content GitHub Repo stars
    • paperless-gpt: Use LLMs to handle paperless-ngx, AI-powered titles, tags and OCR GitHub Repo stars
    • Neuro: A recreation of Neuro-Sama, but running on local models on consumer hardware GitHub Repo stars

    FAQs

    Click here to view the FAQs

    Limitations

    As an experimental trial, we find MiniCPM-o 2.6 has notable limitations worth further investigation and improvement.

    • Unstable speech output. The speech generation can be flawed with noisy backgrounds and unmeaningful sounds.
    • Repeated response. The model tends to repeat its response when encountering similar consecutive user queries.
    • High-latency on Web Demo. Users may experience unusual high-latency when using web demo hosted on overseas servers. We recommend deploying the demo locally or with good network connections.

    Model License

    • This repository is released under the Apache-2.0 License.

    • The usage of MiniCPM-o/V model weights must strictly follow MiniCPM Model License.md.

    • The models and weights of MiniCPM are completely free for academic research. after filling out a "questionnaire" for registration, are also available for free commercial use.

    Statement

    As MLLMs, MiniCPM-o/V models generate content by learning a large number of multimodal corpora, but they cannot comprehend, express personal opinions, or make value judgements. Anything generated by MiniCPM-o/V models does not represent the views and positions of the model developers

    We will not be liable for any problems arising from the use of MiniCPM-o/V models, including but not limited to data security issues, risk of public opinion, or any risks and problems arising from the misdirection, misuse, dissemination, or misuse of the model.

    Institutions

    This project is developed by the following institutions:

    🌟 Star History

    Star History Chart

    Key Techniques and Other Multimodal Projects

    👏 Welcome to explore key techniques of MiniCPM-o/V and other multimodal projects of our team:

    VisCPM | RLPR | RLHF-V | LLaVA-UHD | RLAIF-V

    Citation

    If you find our model/code/paper helpful, please consider citing our papers 📝 and staring us ⭐️!

    @article{yao2024minicpm,
      title={MiniCPM-V: A GPT-4V Level MLLM on Your Phone},
      author={Yao, Yuan and Yu, Tianyu and Zhang, Ao and Wang, Chongyi and Cui, Junbo and Zhu, Hongji and Cai, Tianchi and Li, Haoyu and Zhao, Weilin and He, Zhihui and others},
      journal={arXiv preprint arXiv:2408.01800},
      year={2024}
    }
    

    Discover Repositories

    Search across tracked repositories by name or description