「sarashina2-vision」を試す
モデル
8Bの方を試してみる。
Colaboratory L4で。
パッケージインストール。
!pip install -U transformers==4.47.0 torch torchvision pillow protobuf sentencepiece accelerate
モデルとプロセッサのロード
import requests
from PIL import Image
from transformers import AutoModelForCausalLM, AutoProcessor
# モデルパス
model_path = "sbintuitions/sarashina2-vision-8b"
# モデルとプロセッサをロード
processor = AutoProcessor.from_pretrained(
model_path,
trust_remote_code=True
)
model = AutoModelForCausalLM.from_pretrained(
model_path,
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
この時点でnvidia-smiでは15.6GB
Mon Mar 17 13:20:51 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 55C P0 29W / 72W | 15569MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+
以下の個人の画像を読み込ませてみる。
message = [
{
"role": "user",
"content": "この写真に写っているもので、最も有名と考えられる建築物は何でどこに写っていますか?"
}
]
text_prompt = processor.apply_chat_template(
message,
add_generation_prompt=True
)
print('=== プロンプト ===\n')
print(text_prompt)
print('\n===\n')
sample_image_url = "https://storage.googleapis.com/zenn-user-upload/82968d23b6c5-20250228.jpg"
image = Image.open(requests.get(sample_image_url, stream=True).raw).convert("RGB")
inputs = processor(
text=[text_prompt],
images=[image],
padding=True,
return_tensors="pt",
)
inputs = inputs.to("cuda")
stopping_criteria = processor.get_stopping_criteria(["\n###"])
# 推論: 出力を生成
output_ids = model.generate(
**inputs,
max_new_tokens=1024,
temperature=0.0,
do_sample=False,
stopping_criteria=stopping_criteria,
)
generated_ids = [
output_ids[len(input_ids) :] for input_ids, output_ids in zip(inputs.input_ids, output_ids)
]
output_text = processor.batch_decode(
generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=True
)
print('=== 出力 ===\n')
print(output_text[0])
print('\n===\n')
=== プロンプト ===
<s><|prefix|><|file|><|suffix|>A chat between a curious human and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the human's questions.
### Human: この写真に写っているもので、最も有名と考えられる建築物は何でどこに写っていますか?
### Assistant:
===
=== 出力 ===
この写真に写っているもので、最も有名と考えられる建築物は神戸ポートタワーです。神戸ポートタワーは、兵庫県神戸市中央区の神戸港にある展望塔で、赤い塔が特徴的です。この写真では、神戸ポートタワーが海の向こうに写っており、その赤い塔がはっきりと見えています。
===
この写真に写っているもので、最も有名と考えられる建築物は神戸ポートタワーです。神戸ポートタワーは、兵庫県神戸市中央区の神戸港にある展望塔で、赤い塔が特徴的です。この写真では、神戸ポートタワーが海の向こうに写っており、その赤い塔がはっきりと見えています。
推論後は18.1GBぐらい。
Mon Mar 17 13:23:51 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 63C P0 31W / 72W | 18089MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+
別の画像でも試してみる。
書籍の表紙
(snip)
message = [
{
"role": "user",
"content": "この写真の書籍の表紙にはなんと書いてありますか?詳細に説明してください。"
}
]
(snip)
この写真の書籍の表紙には、緑色の背景に白い文字で「ドキュメント・コミュニケーションの全体像」と書かれています。また、その下には「コミュニケーションはすべてが『解・動・早』で進めよ」というキャッチコピーが書かれています。このキャッチコピーは、コミュニケーションにおいて、理解、行動、速さの3つの要素が重要であることを示唆しています。
ダミーの請求書
(snip)
message = [
{
"role": "user",
"content": "この請求書の内容を正確に説明してください。"
}
]
(snip)
この請求書は、書道用品の販売業者から別の業者へ送られたもので、主に書道用紙や墨などの商品が含まれています。請求書には、以下の項目が記載されています。
- 請求書番号: INV-2024-0820
- 発行日: 2024年8月20日
- 発行者: 模範商事株式会社
- 宛先: 範例工業株式会社
- 数量:
- 特撰和紙 (A4サイズ): 1000枚
- 高級墨 (松煙): 20本
- 筆セット (各種): 50セット
- 単価:
- 特撰和紙 (A4サイズ): 50円/枚
- 高級墨 (松煙): 2,000円/本
- 筆セット (各種): 1,000円/セット
- 金額: 合計140,000円 (消費税10%を含む)
- 合計金額: 154,000円
- 支払期限: 請求書発行より30日以内
- 振込手数料: 貴社負担
- 問い合わせ: 営業部 見本 太郎
この請求書は、書道用品の販売業者が別の業者へ商品の販売と請求を行うもので、数量、単価、金額、支払期限、振込手数料、問い合わせ担当者などの情報が含まれています。
少しひねってみた。神戸の風景画像で。
(snip)
message = [
{
"role": "user",
"content": "後ろの山はなんという山ですか?"
}
]
(snip)
画像からは、後ろの山が具体的にどの山なのかを特定することはできません。しかし、山は海の近くにあり、海の向こうにあることがわかります。
(snip)
message = [
{
"role": "user",
"content": "手前の赤い建物はなんという名前ですか?そして、後ろの山の名前は?"
}
]
(snip)
赤い建物は神戸ポートタワーで、後ろの山は六甲山です。
(snip)
message = [
{
"role": "user",
"content": "この写真を撮影したカメラマンはどの方角に向いていますか?東西南北で。"
}
]
(snip)
カメラマンは西の方角に向いています。
(snip)
message = [
{
"role": "user",
"content": "赤い建物の高さは何メートル?"
}
]
(snip)
赤い建物の正確な高さは画像から判断できませんが、画像に写っている他の建物やランドマークと比較すると、比較的高い建物であることがわかります。例えば、画像に写っている白い建物の一つは、赤い建物の約半分の高さであるように見えます。したがって、赤い建物のの高さは、少なくとも100メートル以上である可能性があります。
(snip)
message = [
{
"role": "user",
"content": "赤い建物はなんという名前の建物ですか?そして、高さは何メートル?"
}
]
(snip)
赤い建物は神戸ポートタワーです。高さは108メートルです。
うまく知識が結びつくような聞き方にするとたどりつける感じかな。
14B、ColaboratoryだとA100が必要かなぁ。自分の手元の24GBでもたりなさそう。
日本語の文字の認識は高い感がある。あと、日本の知識を持ってるというのが強みだよね。うまくクエリを誘導してあげると画像の背景にある知識みたいなのが引き出せてQAがリッチになるかもしれない。