Closed5

「nvidia/Llama-3.1-Nemotron-Nano-VL-8B-V1」を試す

kun432kun432

https://huggingface.co/nvidia/Llama-3.1-Nemotron-Nano-VL-8B-V1

概要

Llama-Nemotron-Nano-VL-8B-V1 は、物理的または仮想世界からの画像や動画を検索し要約する機能を提供する、最先端のドキュメントインテリジェンスビジョン言語モデル(VLMs)です。Llama-Nemotron-Nano-VL-8B-V1 は、データセンター、クラウド、エッジ(Jetson Orin やノートPCを含む)に展開可能で、AWQ 4ビット量子化を通じて TinyChat フレームワークで利用可能です。私たちは以下の点を発見しました:(1) 画像とテキストのペアだけでは不十分で、交差した画像とテキストが不可欠です;(2) 交差した画像とテキストの事前トレーニング中にLLMを凍結解除することで、文脈依存学習が可能になります;(3) テキストのみの指示データを再ブレンドすることは、VLMとテキストのみの性能を向上させるために不可欠です。

このモデルは、トレーニングのすべての3段階で商用画像と動画でトレーニングされており、単一の画像と動画の推論をサポートしています。

ライセンス/利用規約

適用される規約:

このモデルのご利用は、NVIDIA オープンライセンス契約によって規定されています。追加情報:Llama 3.1 コミュニティモデルライセンス、Llama を使用して構築されています。

追加情報:

Llama 3.1 コミュニティモデルライセンス、Llama を使用して構築されています。

ドキュメント向けなのかな?モデルカードのベンチマークにもOCRなベンチマーク使ってるみたいだし。

調べてみたらOCRBench v2というベンチマークのリーダーボードでは2025/06/04時点で英語だと1位だった。中国語もあるんだけど、そちらには載っていなかった。

https://huggingface.co/spaces/ling99/OCRBench-v2-leaderboard

kun432kun432

Colaboratory L4で。T4だとVRAMが足りなかった。

まず、open_clip_torchパッケージをインストール。モデルカードには必要なライブラリのバージョンなどが一切記載されていないが、普通に試すとモデルロード時にエラーになったので。

!pip install open_clip_torch

モデルのロード

from PIL import Image
from transformers import AutoImageProcessor, AutoModel, AutoTokenizer

path = "nvidia/Llama-Nemotron-Nano-VL-8B-V1"
model = AutoModel.from_pretrained(
    path,
    trust_remote_code=True,
    device_map="cuda"
).eval()
tokenizer = AutoTokenizer.from_pretrained(path)
image_processor = AutoImageProcessor.from_pretrained(
    path,
    trust_remote_code=True,
    device="cuda"
)

VRAM消費は16.8GB程度

Wed Jun  4 10:16:10 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   47C    P0             28W /   72W |   16827MiB /  23034MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

では推論。サンプルコードでは複数の画像を説明させるというものになっているが、とりあえず1つだけで。

書籍の表紙

image = Image.open("book.png")
image_features = image_processor([image])

generation_config = dict(max_new_tokens=1024, do_sample=False, eos_token_id=tokenizer.eos_token_id)

question = 'この画像の書籍の表紙について詳しく説明して。'
response = model.chat(
    tokenizer=tokenizer, question=question, generation_config=generation_config,
    **image_features)

print(f'User: {question}\nAssistant: {response}')

User: この画像の書籍の表紙について詳しく説明して。
Assistant: この画像の書籍は、ドキュメント・コミュニケーションの全体観というテーマで、より深く理解するために、より多くの情報が必要です。

なんとなく読めてはいるようなのだけど、

User: この画像の書籍の帯にはなんと書かれている?
Assistant: 解・動・早

User: この画像の書籍の作者は誰?
Assistant: 中川邦夫

なんかこう詳しく説明してくれる感があんまりない。淡白な回答をする印象。

User: すべての文字を読み取って。
Assistant: ドキュメント
コミュニケーションの
全 体 観
理 実 書、 解 色 書、 会 議 資 料 の
"質"と"形"作 スピード"を 上 げる メカニズム
上巻 原則と手順 中川邦夫
ロジカルシンキング
文書を書く技術
設計を描く技術
思想を表す力
戦略プリンシプル
戦法
Art
戦術
Tactics
手順
Process
コミュニケーションはすべて
解 動 早 です 連 まよ
解 です た だ く 動 です た だ く て き る だ け ひ ひ ひ ひ ひ ひ ひ ...

何度か画像を変えて推論を試していたらCUDA out of memoryになった。

Wed Jun  4 10:31:09 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   71C    P0             33W /   72W |   21385MiB /  23034MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

ランタイム再起動して再度モデルロード。次に(ダミーの)請求書の画像で試してみる。

image = Image.open("invoice.png")
image_features = image_processor([image])

generation_config = dict(max_new_tokens=1024, do_sample=False, eos_token_id=tokenizer.eos_token_id)

question = 'この画像について詳しく説明して'
response = model.chat(
    tokenizer=tokenizer, question=question, generation_config=generation_config,
    **image_features)

print(f'User: {question}\nAssistant: {response}')

User: この画像について詳しく説明して
Assistant: この画像は、模範商事株式会社の請求書です。

やっぱり淡白になる。

User: この画像の請求書に書かれている内容をすべてリストアップして
Assistant: 1. 1000個のA4サイズの紙
2. 20枚の松煙
3. 50枚の各種筆セット

合計金額は¥154,000です。

User: この画像の請求書の支払い期限はいつまで?
Assistant: 30日以内

kun432kun432

神戸の風景画像でも試してみた

image = Image.open("kobe.jpg")
image_features = image_processor([image])

generation_config = dict(max_new_tokens=1024, do_sample=False, eos_token_id=tokenizer.eos_token_id)

question = 'この画像に写っている最も有名な建物はなんという建物?'
response = model.chat(
    tokenizer=tokenizer, question=question, generation_config=generation_config,
    **image_features)

print(f'User: {question}\nAssistant: {response}')

User: この画像の場所について詳しく説明して。
Assistant: 日本語: 横浜港のシティタワーとマリンタワー。

User: この画像の場所はどこ?
Assistant: 神戸

まあそういう用途向けではなさそうだけどね。

kun432kun432

うーん、VRAMがある程度ないとちょっとしんどいかな。

kun432kun432

そういえば日本語OCRのベンチマークってあるのかな?

このスクラップは3ヶ月前にクローズされました