「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位だった。中国語もあるんだけど、そちらには載っていなかった。
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日以内
神戸の風景画像でも試してみた
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: 神戸
まあそういう用途向けではなさそうだけどね。
うーん、VRAMがある程度ないとちょっとしんどいかな。
そういえば日本語OCRのベンチマークってあるのかな?