Onely7/llava-1.5-llm-jp-3.1-1.8b-instruct4
llava-1.5-llm-jp-3.1-1.8b-instruct4

llava-1.5-llm-jp-3.1-1.8b-instruct4 は、画像と日本語の指示を受け取り、日本語で応答する視覚言語モデルです。LLaVA 1.5 の構成をベースに、日本語の大規模言語モデル(LLM)と画像を処理する視覚エンコーダを 2 層 MLP アダプタで接続し、2 段階で学習しています。
このモデルは、書籍『マルチモーダルモデル入門(技術評論社)』で使用するために作成したもので、研究・検証用途を想定しています。
モデルの構成
llava-1.5-llm-jp-3.1-1.8b-instruct4(約2.18B)
- 視覚エンコーダ: openai/clip-vit-large-patch14-336(約303M)
- アダプタ: 2 層 MLP(約6M)
- LLM: llm-jp/llm-jp-3.1-1.8b-instruct4(約1.87B)
学習開始時には、上記の学習済み LLM、視覚エンコーダ、および初期化済みアダプタを組み合わせたチェックポイントを使用しました。
使い方
このチェックポイントは Hugging Face Transformers 形式です。再現性のため、エクスポート時と同じ transformers==5.9.0 を推奨します。
以下では、CUDA 対応 GPU が利用でき、BF16(torch.bfloat16)で計算できる環境を想定しています。
pip install torch "transformers==5.9.0" accelerate pillow requests次の例では、COCO 2017 の検証セットに含まれる猫の画像に対して、「猫は何匹いますか?」と日本語で質問します。
import requests
import torch
from PIL import Image
from transformers import AutoProcessor, LlavaForConditionalGeneration
model_id = "Onely7/llava-1.5-llm-jp-3.1-1.8b-instruct4"
# モデルを読み込む
model = LlavaForConditionalGeneration.from_pretrained(
model_id,
torch_dtype=torch.bfloat16,
low_cpu_mem_usage=True
).to("cuda")
model.eval()
# プロセッサーを読み込む
# プロセッサーは、テキストを処理するトークナイザと、
# 画像を処理する画像前処理器をまとめたものです。
processor = AutoProcessor.from_pretrained(
model_id,
backend="torchvision"
)
# 会話形式の入力を定義する
# role が "user" の発話に、画像と質問文を配置します。
conversation = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "猫は何匹いますか?"}
]
}
]
# 会話形式の入力にチャットテンプレートを適用し、
# モデルが期待する形式のプロンプトを作成する
prompt = processor.apply_chat_template(
conversation,
add_generation_prompt=True
)
# チャットテンプレート適用後のプロンプトを確認する
print("=== チャットテンプレート適用後のプロンプト ===")
print(prompt)
print()
# === チャットテンプレート適用後のプロンプト ===
# USER: <image>
# 猫は何匹いますか? ASSISTANT:
# 入力画像を読み込む
image_file = "http://images.cocodataset.org/val2017/000000039769.jpg"
raw_image = Image.open(requests.get(image_file, stream=True).raw).convert("RGB")
# 画像とテキストをモデルに入力できるテンソルへ変換する
inputs = processor(
images=raw_image,
text=prompt,
return_tensors="pt"
).to("cuda")
# モデルに渡される入力テンソルの種類と形状を確認する
print("=== モデルに渡される入力テンソル ===")
for key, value in inputs.items():
print(f"{key}: {value.shape}")
print()
# === モデルに渡される入力テンソル ===
# input_ids: torch.Size([1, 592])
# attention_mask: torch.Size([1, 592])
# pixel_values: torch.Size([1, 3, 336, 336])
# 推論時には勾配計算を行わず、出力トークン ID を生成する
with torch.inference_mode():
generated_ids = model.generate(
**inputs,
max_new_tokens=128,
do_sample=False
)
# 生成結果には入力プロンプト部分も含まれるため、
# 新しく生成された応答部分だけを取り出す
generated_answer_ids = generated_ids[:, inputs.input_ids.shape[1] :]
# トークン ID をテキストに変換する
generated_texts = processor.batch_decode(
generated_answer_ids,
skip_special_tokens=True
)
print("=== 生成された応答 ===")
print(generated_texts[0])
# === 生成された応答 ===
# 画像には2匹の猫がいます。2 段階の学習
学習は Stage 1 と Stage 2 の 2 段階で行いました。両者では、使用するデータと学習対象とするパラメータが異なります。
Stage 1 では、公開データ 558,128 件のうち、キャプションが空だった 79 件を学習前の検査で除外しました。Stage 2 のデータは、liuhaotian/LLaVA-Instruct-150K を openai/gpt-oss-120b で日本語へ翻訳したものです。
Stage 1 は、視覚エンコーダから得られた視覚特徴を LLM に渡せる表現へそろえる段階です。Stage 2 は、画像に基づいて質問応答、詳細説明、視覚的推論などの多様な指示へ応答できるように、視覚指示チューニングを行う段階です。
損失の対象になるトークン
学習では、入力系列のすべての位置で損失を計算するわけではありません。[対象外] の領域も文脈としてモデルへ入力しますが、その位置の予測誤差は損失へ加えません。
以下の <image> × 576 は、画像に対応する 576 個の <image> プレースホルダの位置を模式的に表しています。モデル内部では、これらの位置に、視覚エンコーダとアダプタから得られた視覚トークン埋め込みが対応づけられます。\n は改行を表します。
Stage 1 の例
Stage 1 では、データに含まれる質問文は使わず、画像とキャプションをもとに入力系列を構成します。
[対象外] <s>
[対象外] <image> × 576
[対象] セレクト高級家具3インチゲルメモリーフォームマットレストッパー\n<s> は系列の開始を表します。視覚トークン埋め込みはキャプションを生成するための条件として使い、その位置自体は正解として予測させません。
Stage 2 の例
Stage 2 では、画像と質問を読んで応答を生成するように学習します。複数回のやり取りがある場合は、それぞれの assistant の応答と、応答の終わりを示す </s> を損失の対象にします。
[対象外] <s> USER: <image> × 576
[対象外] 画像のバスの色は何ですか? ASSISTANT:
[対象] 画像のバスは白と赤です。</s>
[対象外] USER: バスの後部に見える特徴は何ですか? ASSISTANT:
[対象] バスの背面には広告が掲示されています。</s>質問や役割名は文脈として入力しますが損失の対象にはせず、その後に続くアシスタントの応答を予測するよう学習します。
学習設定
以下は、モデル学習時の主要な学習設定です。
ライセンスと利用条件
本モデルについて、著作権その他の権利を当方が許諾できる範囲には、Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International(CC BY-NC-SA 4.0) を適用します。
ただし、本モデルは第三者が提供するモデル重みおよび学習データを利用して構築されています。これらの構成要素には、それぞれの配布元が定めるライセンスおよび利用条件が引き続き適用されます。本モデルの CC BY-NC-SA 4.0 は、それらの条件を置き換えるものではありません。
特に、Stage 2 の学習データの基になった liuhaotian/LLaVA-Instruct-150K については、データセットカードに Creative Commons Attribution 4.0 International(CC BY 4.0)および OpenAI の利用条件に従う旨が記載されています。利用・再配布にあたっては、OpenAI Terms of Use を含む、元データセットに適用される条件も確認してください。
