Closed4

合成データセットを活用した大規模日本語VLM「Asagi」を試す

kun432kun432

https://uehara-mech.github.io/asagi-vlm

Asagi: 合成データセットを活用した大規模日本語VLM

Asagiは、最大で14Bのパラメータを持つ、日本語に特化したオープンなVision&Languageモデル(VLM)です。

日本語VLMを開発するにあたっての最大の課題は、モデルを学習するための大規模な日本語の画像・テキストペアデータセットが不足しているということでした。
そこで、本研究では、Webからクロールした画像データなどを活用し、英語のVLMや日本語大規模言語モデル(LLM)を用いて、日本語のデータセットを新規に合成してモデルの学習に利用しました。
本研究のデータ合成戦略の特色は、出力物の利用に制限のあるLLM(GPT-4oなど)を合成プロセスにおいて使用していないという点です。
結果として、今回構築したAsagiモデルは、高い性能を達成しつつ、従来の日本語VLMよりもオープンな形で提供することが可能となりました。

モデルは2B・4B・8B・14Bの4種類。

https://huggingface.co/MIL-UT/Asagi-2B

https://huggingface.co/MIL-UT/Asagi-4B

https://huggingface.co/MIL-UT/Asagi-8B

https://huggingface.co/MIL-UT/Asagi-14B

kun432kun432

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>
この画像を見て、次の質問に詳細かつ具体的に答えてください。画像内の書籍について、タイトルや帯などに書かれていることを詳しく説明してください。

### 応答: 
"""

結果

書籍のタイトルは「健康と福祉」と大きく書かれており、その下に「健康と福祉」という副題が続いています。さらにその下に「健康と福祉」という副題が続き、さらにその下に「健康と福祉」という副題が続いています。帯には「健康と福祉」という副題が書かれています。

残念ながら画像内の文字は読めなかった模様。

kun432kun432

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>
この画像を見て、次の質問に詳細かつ具体的に答えてください。画像内の書籍について、タイトルや帯などに書かれていることを詳しく説明してください。

### 応答: 
"""

結果

この書籍のタイトルは「ビジネス・マネジメントの基礎」で、副題として「経営・経営・経営」と書かれています。また、帯には「ビジネス・マネジメントの基礎」と「経営・経営・経営」という文字が確認できます。

やはり画像内の文字は苦手な様子。雰囲気は近づいてるんだけども。

kun432kun432

自分はOCRとまではいかないにせよ、画像内の文字的なものを認識して欲しい気持ちがあって、その観点だと、phi4のマルチモーダルはそこそこいけてたし、あとOvis2がとても良かった印象がある。そららと比較するとどうしたもんかなーと思ったのだけど、学習データはクリーンだし、ベンチマークも悪くないので、ここからファインチューニングして使うのが良いのかなーという気がした(ファインチューニングの知見はあまりないのだが)

このスクラップは2025/02/28にクローズされました