合成データセットを活用した大規模日本語VLM「Asagi」を試す
Asagi: 合成データセットを活用した大規模日本語VLM
Asagiは、最大で14Bのパラメータを持つ、日本語に特化したオープンなVision&Languageモデル(VLM)です。
日本語VLMを開発するにあたっての最大の課題は、モデルを学習するための大規模な日本語の画像・テキストペアデータセットが不足しているということでした。
そこで、本研究では、Webからクロールした画像データなどを活用し、英語のVLMや日本語大規模言語モデル(LLM)を用いて、日本語のデータセットを新規に合成してモデルの学習に利用しました。
本研究のデータ合成戦略の特色は、出力物の利用に制限のあるLLM(GPT-4oなど)を合成プロセスにおいて使用していないという点です。
結果として、今回構築したAsagiモデルは、高い性能を達成しつつ、従来の日本語VLMよりもオープンな形で提供することが可能となりました。
モデルは2B・4B・8B・14Bの4種類。
2B
Colaboratory L4で。
パッケージインストール
!uv pip install --system "transformers==4.45.1" "accelerate==0.34.2" "torch==2.4.0" "torchvision==0.19.0"
ライブラリのインポートとモデルのロード。モデルについてはあらかじめHuggingFaceのサイトで利用条件に同意しておく必要がある。
import requests
import torch
import transformers
from PIL import Image
from transformers import AutoModel, AutoProcessor, GenerationConfig
transformers.set_seed(42)
model_path = "MIL-UT/Asagi-2B"
processor = AutoProcessor.from_pretrained(model_path)
model = AutoModel.from_pretrained(
model_path, trust_remote_code=True,
torch_dtype=torch.bfloat16,
device_map="auto"
)
generation_config = GenerationConfig(
do_sample=True,
num_beams=5,
max_new_tokens=256,
temperature=0.7,
repetition_penalty=1.5
)
モデルロード時点でのnvidia-smiの結果。VRAMは4.7GBぐらい。
Fri Feb 28 09:59:37 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 37C P0 27W / 72W | 4703MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
以下の画像を使用する(自分で撮影したもの)
prompt = """\
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。
### 指示:
<image>
この画像を見て、次の質問に詳細かつ具体的に答えてください。この写真はどこで撮影されたものか教えてください。画像の内容について詳しく説明してください。
### 応答:
"""
# サンプル画像
image = Image.open("kobe.jpg")
inputs = processor(
text=prompt, images=image, return_tensors="pt"
)
inputs_text = processor.tokenizer(prompt, return_tensors="pt")
inputs['input_ids'] = inputs_text['input_ids']
inputs['attention_mask'] = inputs_text['attention_mask']
for k, v in inputs.items():
if v.dtype == torch.float32:
inputs[k] = v.to(model.dtype)
inputs = {k: inputs[k].to(model.device) for k in inputs if k != "token_type_ids"}
generate_ids = model.generate(
**inputs,
generation_config=generation_config
)
generated_text = processor.batch_decode(
generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
)[0]
# プロンプトを出力しない
if "<image>" in prompt:
prompt = prompt.replace("<image>", " ")
generated_text = generated_text.replace(prompt, "")
print(f"生成されたテキスト:\n\n{generated_text}")
結果
この写真は、神戸ポートタワーを背景に撮影されたものです。神戸ポートタワーは、兵庫県神戸市中央区に位置する有名なランドマークで、世界的に有名なランドマークの一つです。写真には、神戸ポートタワーが写っており、その背後には近代的な高層ビル群が広がっています。これらのビルは、神戸の都市景観を象徴する存在であり、多くの観光客や地元の人々に親しまれています。
推論後のnvidia-smi。8.6GBぐらいになった。
Fri Feb 28 10:15:59 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 49C P0 28W / 72W | 8559MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
次に以下の画像でも試してみる。
プロンプトは少し変えた。
prompt = """\
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。
### 指示:
<image>
この画像を見て、次の質問に詳細かつ具体的に答えてください。画像内の書籍について、タイトルや帯などに書かれていることを詳しく説明してください。
### 応答:
"""
結果
書籍のタイトルは「健康と福祉」と大きく書かれており、その下に「健康と福祉」という副題が続いています。さらにその下に「健康と福祉」という副題が続き、さらにその下に「健康と福祉」という副題が続いています。帯には「健康と福祉」という副題が書かれています。
残念ながら画像内の文字は読めなかった模様。
8B
同様に、8Bでも試してみる。画像とプロンプトは2Bと同じものを使用する。
モデルロード後のnvidia-smi。15GBぐらい。
Fri Feb 28 10:32:13 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 41C P0 27W / 72W | 15041MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
prompt = """\
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。
### 指示:
<image>
この画像を見て、次の質問に詳細かつ具体的に答えてください。この写真はどこで撮影されたものか教えてください。画像の内容について詳しく説明してください。
### 応答:
"""
結果
写真には、神戸港の風景が写っています。手前には青い海が広がり、その奥には近代的なビル群が立ち並んでいます。特に目を引くのは、赤と白の縞模様が特徴的な「神戸ポートタワー」です。このタワーは、神戸港のシンボルとして、多くの観光客に親しまれています。
神戸港は、兵庫県神戸市に位置し、日本有数の国際貿易港として知られています。港湾管理者は神戸市で、港湾法上の重要港湾にも指定されています。また、港則法上の特定港にも指定されており、日本の港湾の中でも重要な役割を果たしています。
推論後のnvidia-smi。21GBぐらい。L4で量子化なしだとこれが限界かも。
Fri Feb 28 10:34:18 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 54C P0 28W / 72W | 20921MiB / 23034MiB | 0% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
prompt = """\
以下は、タスクを説明する指示です。要求を適切に満たす応答を書きなさい。
### 指示:
<image>
この画像を見て、次の質問に詳細かつ具体的に答えてください。画像内の書籍について、タイトルや帯などに書かれていることを詳しく説明してください。
### 応答:
"""
結果
この書籍のタイトルは「ビジネス・マネジメントの基礎」で、副題として「経営・経営・経営」と書かれています。また、帯には「ビジネス・マネジメントの基礎」と「経営・経営・経営」という文字が確認できます。
やはり画像内の文字は苦手な様子。雰囲気は近づいてるんだけども。
自分はOCRとまではいかないにせよ、画像内の文字的なものを認識して欲しい気持ちがあって、その観点だと、phi4のマルチモーダルはそこそこいけてたし、あとOvis2がとても良かった印象がある。そららと比較するとどうしたもんかなーと思ったのだけど、学習データはクリーンだし、ベンチマークも悪くないので、ここからファインチューニングして使うのが良いのかなーという気がした(ファインチューニングの知見はあまりないのだが)