はじめに
清華大学NLPグループとModelBestが2026年5月11日にオープンソース公開した「MiniCPM-V 4.6」は、総パラメータ数1.3BながらQwen3.5 2Bレベルの視覚言語性能を持ち、iOS・Android・HarmonyOSへのエッジデプロイに対応したマルチモーダルLLMです。本稿では、Hugging FaceおよびGitHubのリポジトリ情報をもとに、インストールから画像・動画推論、vLLMによる本番サーブまでを順を追って解説します。
参考記事
メイン記事:
- タイトル: MiniCPM-V 4.6 — Hugging Face Model Card
- 著者: OpenBMB(ModelBest / THUNLP)
- 発行元: Hugging Face
- 発行日: 2026年5月11日
- URL: https://huggingface.co/openbmb/MiniCPM-V-4.6
関連情報:
- タイトル: OpenBMB/MiniCPM-V — GitHub README
- 発行元: GitHub(OpenBMB)
- 発行日: 2026年5月11日
- URL: https://github.com/OpenBMB/MiniCPM-V
- タイトル: MiniCPM-V & o Cookbook
- 発行元: GitHub(OpenSQZ)
- 発行日: 2026年5月11日
- URL: https://github.com/OpenSQZ/MiniCPM-V-CookBook
関連記事



要点
- MiniCPM-V 4.6は総パラメータ数1.3B(SigLIP2-400M + Qwen3.5-0.8B)で、LLaVA-UHD v4技術により視覚エンコードの計算量(FLOPs)を50%以上削減している
- Artificial Analysis Intelligence Indexベンチマークでスコア13を記録し、同カテゴリの Qwen3.5-0.8Bをトークンコスト19分の1で上回る性能を示している
- iOS・Android・HarmonyOSへのエッジデプロイに対応しており、すべてのエッジ適応コードがオープンソースで公開されている
- Transformers(v5.7.0以上)・vLLM・SGLang・llama.cpp・Ollamaによる推論と、LLaMA-Factory・SWIFTによるファインチューニングをサポートしている
- GGUF・BNB・AWQ・GPTQのquantized variantsが提供されており、GPUメモリ3〜4GBでの動作が可能である
詳細解説
モデルの概要と設計思想
MiniCPM-V 4.6は清華大学NLPグループ(THUNLP)とModelBestが開発するMiniCPM-Vシリーズの最新モデルです。ビジョンエンコーダーにSigLIP2-400M、言語モデルにQwen3.5-0.8Bを採用し、合計1.3Bパラメータという軽量構成を実現しています。
このモデルの核心技術は、LLaVA-UHD v4(arXiv: 2605.08985)で提案された intra-ViT early compression(ViT内部の早期圧縮)です。この手法により、視覚エンコード処理の計算量(FLOPs)を従来比50%以上削減し、トークンスループットをQwen3.5-0.8B比で約1.5倍に改善しています。また、画像の精細度と処理速度を柔軟に切り替えられる mixed 4x/16x visual token compression(4倍・16倍の混合ビジュアルトークン圧縮)を導入しており、タスクに応じた精度と速度のトレードオフが可能です。
シングル画像・マルチ画像・動画の理解能力をMiniCPM-Vファミリーから継承しつつ、エッジ向けの効率性を大幅に向上させた点が今回の最大の特徴だと思います。
ベンチマーク性能
OpenBMBの発表によれば、MiniCPM-V 4.6はArtificial Analysis Intelligence Indexでスコア13を記録しました。比較対象のQwen3.5-0.8B(スコア10)をトークンコスト19分の1で上回り、思考モード版のQwen3.5-0.8B-Thinking(スコア11)と比べてもトークンコスト43分の1という効率を示しています。さらに3Bパラメータの大きいMinistral 3(スコア11)も上回っています。
視覚言語タスクについては、OpenCompass・RefCOCO・HallusionBench・MUIRBench・OCRBenchといった複数のベンチマークで、Qwen3.5 2B レベルの性能に到達しています。1.3Bという規模で2B相当の性能を出せる点は、エッジデプロイ用途では実用的な意味を持つと考えられます。
前提条件・環境構成
本稿で紹介するTransformersを使った推論には、以下の環境が必要です。
- Python 3.10以上(バージョン確認: python –version)
- CUDA対応のNVIDIA GPU(推論のみなら4GB VRAM程度で動作可能。量子化版は3GBでも可)
- pip(Pythonのパッケージ管理ツール)
仮想環境(venv・condaなど)を使うと、他のプロジェクトとのパッケージ依存関係の衝突を防げます。特に複数のPyTorchプロジェクトを管理している場合は、venv等での隔離が推奨です。
インストール・セットアップ
1. 基本インストール(推奨)
以下のコマンドで、Transformersと動画処理に必要なパッケージをインストールします。
# TransformersとGPUサポート、動画デコードライブラリをまとめてインストール
pip install "transformers[torch]>=5.7.0" torchvision torchcodec注意: torchcodec(動画デコードに使用)はCUDAバージョンに依存します。CUDA 12.x環境では次のエラーが発生することがあります: RuntimeError: Could not load libtorchcodec。その場合は以下の回避策をお試しください。
回避策①: torchcodecをPyAVに置き換える(CUDA非依存で安定)
# torchcodecの代わりにav(PyAV)を使用する(画像・動画どちらも対応)
pip install "transformers[torch]>=5.7.0" torchvision av回避策②: CUDAバージョンを固定する(例: CUDA 12.8の場合)
# CUDA 12.8に合わせてtorchのインストールURLを指定する
pip install "transformers>=5.7.0" torchvision torchcodec --index-url https://download.pytorch.org/whl/cu128モデルのロード
インストールが完了したら、以下のコードでモデルをロードします。device_map=”auto” は利用可能なGPUへ自動的にモデルを配置するオプションです。torch_dtype=”auto” はGPUの種類に応じてデータ型を自動選択します。
from transformers import AutoModelForImageTextToText, AutoProcessor
# モデルIDの指定(Hugging FaceのリポジトリID)
model_id = "openbmb/MiniCPM-V-4.6"
# プロセッサ(画像前処理・トークナイザを統合)のロード
processor = AutoProcessor.from_pretrained(model_id)
# モデルのロード(torch_dtype="auto"でGPUに適した型を自動選択)
model = AutoModelForImageTextToText.from_pretrained(
model_id, torch_dtype="auto", device_map="auto"
)
# 注: マルチ画像・動画推論時はFlash Attention 2の使用を推奨(要flash-attnパッケージ)
# model = AutoModelForImageTextToText.from_pretrained(
# model_id,
# torch_dtype=torch.bfloat16,
# attn_implementation="flash_attention_2", # Flash Attention 2を有効化
# device_map="auto",
# )実装例:画像推論
以下が画像に対して質問するコードの最小構成です。参考記事のサンプルコードをもとにしています。
messages = [
{
"role": "user",
"content": [
# 画像URLまたはローカルパスを指定
{"type": "image", "url": "https://huggingface.co/datasets/openbmb/DemoCase/resolve/main/refract.png"},
# テキストの質問
{"type": "text", "text": "What causes this phenomenon?"},
],
}
]
# downsample_mode: "16x"は高効率、"4x"は高精細(細かい文字や図の読み取りに推奨)
downsample_mode = "16x"
# チャットテンプレートを適用してモデル入力形式に変換
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, # 高解像度画像のスライス最大数(画像は36推奨)
).to(model.device)
# テキスト生成
generated_ids = model.generate(
**inputs,
downsample_mode=downsample_mode, # apply_chat_templateと同じ値を必ず指定
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])注意: downsample_mode は apply_chat_template と generate の両方に同じ値を渡す必要があります。片方だけ指定するとプレースホルダー数が合わず、エラーが発生します。うまくいかない場合はこの点をまず確認してください。
実装例:動画推論
動画への対応は、contentの “type” を “video” に変えるだけで、画像推論とほぼ同じ書き方で実現できます。
messages = [
{
"role": "user",
"content": [
# 動画URLまたはローカルパスを指定
{"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"
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, # 1秒あたりのサンプリング数(長動画は3または5を推奨)
max_slice_nums=1, # 動画の場合は1を指定(画像と異なる点)
use_image_id=False, # 動画の場合はFalse(画像の場合はTrueがデフォルト)
).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])パラメータ・設定オプション
apply_chat_template に渡せる主要パラメータを以下に整理します(参考記事の表をもとにしています)。
| パラメータ | デフォルト | 対象 | 説明 |
| downsample_mode | “16x” | 画像・動画 | “16x” は効率重視、”4x” は精細度重視。generate() にも同値を渡す必要あり |
| max_slice_nums | 9 | 画像・動画 | 高解像度画像の分割スライス最大数。画像は36、動画は1を推奨 |
| max_num_frames | 128 | 動画のみ | 動画からサンプルするフレームの最大数 |
| stack_frames | 1 | 動画のみ | 1秒あたりのサンプル数。短動画は1、長動画は3〜5を推奨 |
| use_image_id | True | 画像・動画 | 各画像/フレームのプレースホルダー前にIDタグを付与。画像は True、動画は False |
サーバー起動・API提供
transformers serveによる簡易サーバー
Hugging Face Transformersには軽量なOpenAI互換サーバーが組み込まれており、テストや中程度の負荷での利用に適しています。
# serving用パッケージのインストール
pip install "transformers[serving]>=5.7.0"
# サーバーを起動(--continuous-batchingで連続バッチ処理を有効化)
transformers serve openbmb/MiniCPM-V-4.6 --port 8000 --host 0.0.0.0 --continuous-batching起動後、以下のようにcurlで画像付きの推論リクエストを送信できます。
# OpenAI互換エンドポイントへリクエスト送信
curl -s http://localhost:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "openbmb/MiniCPM-V-4.6",
"messages": [{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": "https://huggingface.co/datasets/openbmb/DemoCase/resolve/main/refract.png"}},
{"type": "text", "text": "What causes this phenomenon?"}
]
}]
}'vLLMによる高スループット推論
本番環境での大量リクエスト処理には、vLLM(高スループット推論フレームワーク)が適しています。
# vLLMサーバーを起動
# --enable-auto-tool-choiceと--tool-call-parserはツール呼び出し機能を有効にするオプション
# ツール呼び出しが不要な場合は --enable-auto-tool-choice と --tool-call-parser を省略可能
vllm serve openbmb/MiniCPM-V-4.6 \
--port 8000 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--default-chat-template-kwargs '{"enable_thinking": false}'SGLang(高スループット、別の選択肢)
# SGLangサーバーを起動(python -mで直接起動できる)
python -m sglang.launch_server --model openbmb/MiniCPM-V-4.6 --port 30000llama.cpp(CPU推論・量子化モデル利用)
# Q4_K_MはGGUF量子化形式の一種で、品質と速度のバランスが良いとされる
# GGUFモデルは https://huggingface.co/openbmb/MiniCPM-V-4.6-gguf からダウンロード
llama-server -m MiniCPM-V-4.6-Q4_K_M.gguf --port 8080Ollama(最も手軽な方法)
# Ollama(ローカルLLM実行ツール)を使って1コマンドで起動
# 事前にhttps://ollama.com からOllamaをインストールしておく必要があります
ollama run minicpm-v-4.6セッション中は画像パスやURLをそのまま貼り付けることでモデルと対話できます。
ファインチューニング
独自データでモデルをカスタマイズしたい場合は、以下のコマンドから始められます。詳細な手順はCookbook(https://github.com/OpenSQZ/MiniCPM-V-CookBook)を参照してください。
# LLaMA-Factory(軽量LoRA/QLoRAファインチューニングツール)でのSFT実行
# yamlファイルにデータセットパスやハイパーパラメータを設定する
llamafactory-cli train examples/train_lora/minicpmv4_6_lora_sft.yaml
# ms-swift(SWIFT: 効率的なパラメータチューニングフレームワーク)でのSFT実行
swift sft --model_type minicpm-v-4_6 --dataset <your-dataset>モバイルデプロイについて
iOS・Android・HarmonyOSへのデプロイ手順はすべてオープンソースで公開されており、GitHubのエッジデプロイリポジトリ(https://github.com/OpenBMB/MiniCPM-V-Apps)にプラットフォーム別のビルドガイドが用意されています。ビルド済みアプリのダウンロードページも公開されており、まず動作を試してから開発に進む流れが現実的だと思います。
ライセンス
モデルの重みとコードはApache-2.0ライセンスのもとでオープンソース公開されています。商用利用を含む柔軟な活用が可能です。
まとめ
MiniCPM-V 4.6は1.3Bという小型のパラメータ数でありながら、Qwen3.5 2Bレベルのマルチモーダル性能とモバイルデプロイ対応を両立した、エッジ向けモデルとして実用性が高いと思います。Transformers v5.7.0への対応により、本稿で紹介したコードからすぐに試せる点も魅力です。オンデバイスAI向けフレームワークについてより詳しく知りたい方は、GoogleのLiteRTフレームワーク解説でも整理していますので、あわせてご覧いただければと思います。
