Zenn
Closed6

「Ovis2」を試す

kun432kun432

以前試したOvis1.6

https://zenn.dev/kun432/scraps/4332a771ad6642

精度が向上したOvis2が出ていた

https://huggingface.co/collections/AIDC-AI/ovis2-67ab36c7e497429034874464

Ovis2-1B

はじめに

私たちは、最新のマルチモーダル大規模言語モデル(MLLMs)の進化版である Ovis2 のリリースを発表できることを嬉しく思います。Ovis2 は、視覚的およびテキスト的な埋め込みを構造的に整合させることを目的とした Ovis シリーズの革新的なアーキテクチャ設計を継承しています。Ovis1.6 の後継として、Ovis2 はデータセットのキュレーションとトレーニング手法の両面で大幅な改善を取り入れています。

主要機能:

  • Small Model Performance
    小規模モデルがより高い能力密度を達成できるように最適化されたトレーニング戦略により、クロスティアでの優位性を実証しています。
  • Enhanced Reasoning Capabilities
    指示調整と嗜好学習の組み合わせにより、Chain-of-Thought (CoT) 推論能力が大幅に強化されています。
  • Video and Multi-Image Processing
    動画および複数画像のデータがトレーニングに組み込まれ、フレームや画像全体にわたる複雑な視覚情報の処理能力が向上しています。
  • Multilingual Support and OCR
    英語および中国語を超えた多言語OCRを強化し、表やグラフなどの複雑な視覚要素からの構造化データ抽出が改善されています。


referred from https://huggingface.co/AIDC-AI/Ovis2-1B

モデル一覧

Ovis MLLMs ViT LLM Model Weights Demo
Ovis2-1B aimv2-large-patch14-448 Qwen2.5-0.5B-Instruct Huggingface Space
Ovis2-2B aimv2-large-patch14-448 Qwen2.5-1.5B-Instruct Huggingface Space
Ovis2-4B aimv2-huge-patch14-448 Qwen2.5-3B-Instruct Huggingface Space
Ovis2-8B aimv2-huge-patch14-448 Qwen2.5-7B-Instruct Huggingface Space
Ovis2-16B aimv2-huge-patch14-448 Qwen2.5-14B-Instruct Huggingface Space
Ovis2-34B aimv2-1B-patch14-448 Qwen2.5-32B-Instruct Huggingface -

性能

私たちは VLMEvalKit を使用し、OpenCompass の multimodal および reasoning リーダーボードで採用されている評価手法を用いて Ovis2 を評価しています。

image/png

画像ベンチマーク

ベンチマーク Qwen2.5-VL-3B SAIL-VL-2B InternVL2.5-2B-MPO Ovis1.6-3B InternVL2.5-1B-MPO Ovis2-1B Ovis2-2B
MMBench-V1.1<sub>test</sub> 77.1 73.6 70.7 74.1 65.8 68.4 76.9
MMStar 56.5 56.5 54.9 52.0 49.5 52.1 56.7
MMMU<sub>val</sub> 51.4 44.1 44.6 46.7 40.3 36.1 45.6
MathVista<sub>testmini</sub> 60.1 62.8 53.4 58.9 47.7 59.4 64.1
HallusionBench 48.7 45.9 40.7 43.8 34.8 45.2 50.2
AI2D 81.4 77.4 75.1 77.8 68.5 76.4 82.7
OCRBench 83.1 83.1 83.8 80.1 84.3 89.0 87.3
MMVet 63.2 44.2 64.2 57.6 47.2 50.0 58.3
MMBench<sub>test</sub> 78.6 77 72.8 76.6 67.9 70.2 78.9
MMT-Bench<sub>val</sub> 60.8 57.1 54.4 59.2 50.8 55.5 61.7
RealWorldQA 66.5 62 61.3 66.7 57 63.9 66.0
BLINK 48.4 46.4 43.8 43.8 41 44.0 47.9
QBench 74.4 72.8 69.8 75.8 63.3 71.3 76.2
ABench 75.5 74.5 71.1 75.2 67.5 71.3 76.6
MTVQA 24.9 20.2 22.6 21.1 21.7 23.7 25.6

動画ベンチマーク

ベンチマーク Qwen2.5-VL-3B InternVL2.5-2B InternVL2.5-1B Ovis2-1B Ovis2-2B
VideoMME(wo/w-subs) 61.5/67.6 51.9 / 54.1 50.3 / 52.3 48.6/49.5 57.2/60.8
MVBench 67.0 68.8 64.3 60.32 64.9
MLVU(M-Avg/G-Avg) 68.2/- 61.4/- 57.3/- 58.5/3.66 68.6/3.86
MMBench-Video 1.63 1.44 1.36 1.26 1.57
TempCompass 64.4 - - 51.43 62.64

Ovis1.6との違いは

  • ViTが、GoogleのSiglip-400MからAppleのaimv2-large-patch14-448に変更されている
  • LLMが、Gemma2/Llama3ベースから、Qwen2.5ベースに変更されている

あたり。

kun432kun432

HuggingFace Spaceで1Bと16Bのデモを試せる。16Bで試してみた。

Ovis1.6-Gemma2-9Bでは読み取れなかったのがきちんと読み取れている。

某画像のクエリ結果

この画像は、アニメ「ぼっち・ざ・ろっく!」の一場面です。ピンク色の髪と青い目が特徴的な少女が、アスファルトの地面にしゃがみ込んでいます。彼女は白いリュックサックを背負っており、両手で「私は約束通り歌詞をあげられませんでした」と書かれた紙を掲げています。

彼女の表情は少し困ったような、申し訳ないような印象を与えます。背景には、青い髪と黄色い髪のキャラクターがそれぞれ左側と右側に位置しており、彼女を見守っている様子が伺えます。

このシーンは、少女が約束を果たせなかったことを説明している場面であり、彼女の表情や行動から、責任感や誠実さが感じられます。

画像の認識が前より良くなっているのはViTが以下に変わっていることが要因かもしれない。

https://huggingface.co/apple/aimv2-large-patch14-448

だけど、それだけじゃなくて明らかにモデルが知識を持っていると思われる回答。やっぱりQwen2.5が大きいのかもしれない。

16Bのデモだと、以前のデモよりもパラメータ数が大きいので、ちょっと比較としてはいまいち。一応1Bのデモも確認してみた。

おお、1Bでもきちんと読めてる。

某画像でも試してみた。

この画像は、アニメ「あいの物語」の一場面で、ピンク色の髪を持つ少女が「約束通りに歌詞をかき上げられませんでした」と書かれた白い紙を持っています。彼女は少し驚いた表情で、何かを訴えているように見えます。

背景には、青髪と黄色のリボンをつけたキャラクターの頭が見え、二人のキャラクターが対峙している様子が伺えます。地面は灰色で、石畳のような質感です。

このシーンは、少女が歌詞をかき上げられなかったという事実を告げるものであり、物語の重要な出来事を示唆しています。

1Bだと知識は足りないのかもしれないが、画像内の説明はきちんとできている。

公式が謳っている通り、かなり精度高そうに思える。

kun432kun432

Ovis1.6のときは9Bを試したので、同じぐらいのパラメータサイズということで、今回は8Bを試す。あと、最も軽量な1BについてもVRAM使用量などを押さえておきたい。

Colaboratory L4で試す。

TransformersやPyTorchなどをインストール。モデルカードの手順だとtorchvisionが多分足りないので少し修正した。ランタイムの再起動が必要になる。

!pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu124
!pip install transformers==4.46.2 numpy==1.25.0 pillow==10.3.0

Flash Attentionをインストール

pip install flash-attn==2.7.0.post2 --no-build-isolation

モデルとトークナイザーをロード

import torch
from PIL import Image
from transformers import AutoModelForCausalLM

# モデルのロード
model = AutoModelForCausalLM.from_pretrained(
    "AIDC-AI/Ovis2-8B",
    torch_dtype=torch.bfloat16,
    multimodal_max_length=32768,
    trust_remote_code=True
).cuda()

# テキストとビジュアルのトークナイザーをロード
text_tokenizer = model.get_text_tokenizer()
visual_tokenizer = model.get_visual_tokenizer()

モデルロード時点でのnvidia-smiの結果。17.5GBぐらい。

出力
Wed Feb 26 11:38:50 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA L4                      Off |   00000000:00:03.0 Off |                    0 |
| N/A   44C    P0             28W /   72W |   17481MiB /  23034MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

上のデモでも使用した書籍の画像を使う。

# 画像
image_path = 'sample.png'
images = [Image.open(image_path)]
max_partition = 9
text = '画像の内容を説明して。'
query = f'<image>\n{text}'

# 会話のフォーマット
prompt, input_ids, pixel_values = model.preprocess_inputs(query, images, max_partition=max_partition)
attention_mask = torch.ne(input_ids, text_tokenizer.pad_token_id)
input_ids = input_ids.unsqueeze(0).to(device=model.device)
attention_mask = attention_mask.unsqueeze(0).to(device=model.device)
if pixel_values is not None:
    pixel_values = pixel_values.to(dtype=visual_tokenizer.dtype, device=visual_tokenizer.device)
pixel_values = [pixel_values]

# 出力を生成
with torch.inference_mode():
    gen_kwargs = dict(
        max_new_tokens=1024,
        do_sample=False,
        top_p=None,
        top_k=None,
        temperature=None,
        repetition_penalty=None,
        eos_token_id=model.generation_config.eos_token_id,
        pad_token_id=text_tokenizer.pad_token_id,
        use_cache=True
    )
    output_ids = model.generate(input_ids, pixel_values=pixel_values, attention_mask=attention_mask, **gen_kwargs)[0]
    output = text_tokenizer.decode(output_ids, skip_special_tokens=True)
    print(f'出力:\n{output}')

結果

出力
出力:
この画像は、書籍の表紙を示しています。書籍のタイトルは「ドキュメント・コミュニケーションの全体観」で、著者は中川邦夫です。上巻の内容は「原則と手順」を扱っています。

表紙の上部には、提案書、報告書、会議資料の「質」と「制作スピード」を上げるメカニズムについて説明しています。中央には、四つの要素が円形に配置された図が描かれています。これらの要素は「原則(Principle)」、「技法(Art)」、「手順(Process)」、「試合運び(Tactics)」です。左側には「コジカルシンキング」、「文章を書く技術」、「図表を描く技術」、「問題解決力」という要素が並んでいます。

表紙の下部には、「コミュニケーションはすべて『解・動・早』で進めよ」というキャッチコピーが書かれています。さらに、「解っていただく・動いていただく・できるだけ早く」というフレーズが添えられています。

全体的に、書籍はドキュメント作成とコミュニケーションの効率化に関する内容を扱っていることがわかります。

ほぼ完璧。

文字数の多いものとして、以前にサンプルで作成した架空の請求書画像を使ってみた。

結果

出力
出力:
この画像は、請求書の写真です。請求書の上部には「御請求書」と大きく書かれ、請求書番号「INV-2024-0820」が記載されています。右上には「模範商事株式会社」と社名と住所、電話番号、FAX番号が記載されています。請求書の本文には、項目、数量、単価、金額の表が記載されており、以下の内容が記載されています。

- 特選和紙(A4サイズ):数量1000、単価¥50、金額¥50,000
- 高級墨(松煙):数量20、単価¥2,000、金額¥40,000
- 筆セット(各種):数量50、単価¥1,000、金額¥50,000

小計は¥140,000、消費税(10%)は¥14,000で、合計金額は¥154,000となっています。備考欄には、支払い期限、振込手数料の負担、問い合わせ先の担当者名が記載されています。

こちらも完璧。

次は、Ovis2のモデルカードにあるパフォーマンス比較のグラフを使ってみる。


referred from https://huggingface.co/AIDC-AI/Ovis2-8B

結果

出力
この線グラフは、パラメータ数(B)とOpenCompass平均スコアの関係を示しています。
x軸はパラメータ数(B)で、y軸はOpenCompass平均スコアです。
グラフには、Ovis2、InternVL2.5-MPO、Qwen2.5-VL、Llava-OneVision、Molmo、Llama-3.2-Vision-Instruct、VILA1.5、Cambran、Yi-VLの9つのモデルが含まれています。
各モデルは、異なるパラメータ数で評価され、それぞれのパラメータ数に対応する平均スコアが示されています。
グラフから、パラメータ数が増加すると、OpenCompass平均スコアも増加することがわかります。
ただし、パラメータ数が増加するにつれて、スコアの増加率は低下します。
Ovis2は、他のモデルと比較して、パラメータ数が増加するにつれて最も高いスコアを維持しています。

少しクエリを変えてみた。

text = 'Ovis2の各パラメータサイズごとのスコアをまとめて。'

結果

出力
出力:
Ovis2の各パラメータサイズごとのスコアは以下の通りです。

- 1B: 58.2
- 2B: 62.1
- 4B: 66.5
- 8B: 69.7
- 16B: 73.4
- 26B: 75.6
- 34B: 76.3

流石にこれは難しかったか。とはいえ大まかな位置はある程度理解してそう。

kun432kun432

サンプルコードでは

  • Chain-of-Thoughtなプロンプトを使った推論
  • 一度に複数のイメージを使用する推論
  • 動画に対する推論
  • テキストのみの推論
  • バッチ推論

なども記載されている。

kun432kun432

ちなみに1Bでモデルロードした場合のVRAM使用量

出力
Wed Feb 26 12:13:44 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.54.15              Driver Version: 550.54.15      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA L4                      Off |   00000000:00:03.0 Off |                    0 |
| N/A   43C    P0             24W /   72W |    2445MiB /  23034MiB |     37%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
kun432kun432

まとめ

Ovis1.6では画像内の文字を多少は認識しているという感じだったのが、Ovis2になってかなりしっかり認識できているし、Qwen2.5になったせいか日本語の知識がかなり良くなっているように思える。また、小さめのパラメータサイズでバリエーションも多く、利用可能なリソースにあわせて最適なものを選びやすいのも良い。至極真っ当に進化している感がある。

Qwen2.5ベースはやはり日本語で使用する上では使いやすいとあらためて感じたし、個人的にはビジュアルのベースとなっているAIMv2が気になった。単体でも試してみたい。

このスクラップは1ヶ月前にクローズされました
ログインするとコメントできます