[開発者向け]MiniCPM-V 4.6 完全実装ガイド——1.3Bパラメータでスマートフォン搭載可能なマルチモーダルAIをTransformersで動かす

目次

はじめに

 清華大学NLPグループとModelBestが2026年5月11日にオープンソース公開した「MiniCPM-V 4.6」は、総パラメータ数1.3BながらQwen3.5 2Bレベルの視覚言語性能を持ち、iOS・Android・HarmonyOSへのエッジデプロイに対応したマルチモーダルLLMです。本稿では、Hugging FaceおよびGitHubのリポジトリ情報をもとに、インストールから画像・動画推論、vLLMによる本番サーブまでを順を追って解説します。

参考記事

メイン記事:

関連情報:

関連記事

あわせて読みたい
[技術紹介]Googleの新星「Gemma 3n」を解説!スマホで動く本格オンデバイスマルチモーダルAIの仕組み... はじめに  本稿では、Googleが発表した新しいAIモデル「Gemma 3n」について、Google for Developers Blogの「Introducing Gemma 3n: The developer guide」という記事...
あわせて読みたい
[開発者向け]LiteRT: オンデバイスAIの統合フレームワークが正式リリース──GPU性能1.4倍、NPU対応で次... はじめに  Googleが2026年1月28日、オンデバイスAI推論フレームワーク「LiteRT」の本格的な機能拡張を発表しました。TensorFlow Lite(TFLite)の後継として2024年に導入...
あわせて読みたい
[開発者向け]Gemma 4がNVIDIAプラットフォームで動く——エッジからデータセンターまで対応したマルチモ... はじめに  NVIDIAデベロッパーブログは2026年4月2日、Googleが新たに公開したGemma 4シリーズについての解説記事を公開しました。Gemma 4は4つのモデルで構成され、デ...

要点

  • 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を使った推論には、以下の環境が必要です。

  1. Python 3.10以上(バージョン確認: python –version)
  2. CUDA対応のNVIDIA GPU(推論のみなら4GB VRAM程度で動作可能。量子化版は3GBでも可)
  3. 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_nums9画像・動画高解像度画像の分割スライス最大数。画像は36、動画は1を推奨
max_num_frames128動画のみ動画からサンプルするフレームの最大数
stack_frames1動画のみ1秒あたりのサンプル数。短動画は1、長動画は3〜5を推奨
use_image_idTrue画像・動画各画像/フレームのプレースホルダー前に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 30000

llama.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 8080

Ollama(最も手軽な方法)

# 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フレームワーク解説でも整理していますので、あわせてご覧いただければと思います。

この記事が気に入ったら
フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次