Japanese Stable VLMをローカル環境で使ってみる

 

1. はじめに

Stability AIが2023年11月に発表した、画像に日本語でキャプショニングしてくれるJapanese Stable VLMをローカル環境で試してみました。

VRAM16GBでも一応動きました! ja.stability.ai

 

2. PCのスペック

CPU:i5-13500

GPU:RTX4070TI SUPER (VRAM 16GB)

RAM:32GB

OS:ubuntu 22.04 LTS

 

3. 環境構築

3.1 ライブラリのインストール

transformers, accelerate, sentencepiece, protobuf, pillow, huggingface_hubをインストールしました。

 pip install transformers accelerate sentencepiece protobuf pillow huggingface_hub 

 

int8でモデルを読み込むために必要なbitstandbytesをインストールしました。

 pip install -i https://pypi.org/simple/ bitsandbytes 

 

3.2 作業フォルダの作成

図1のフォルダ構成としました。

python フォルダには、4章で作成するpythonコードを入れます。

pictures フォルダには、推論に用いる画像を入れます。

model フォルダには、3.3節でダウンロードするモデルを入れます。

図1 フォルダ構成

 

3.3 モデルのダウンロード

huggingfaceからモデルをダウンロードし、3.2節で作成したmodelフォルダに保存します。

今回はfp16のモデルをint8で読み込むので、model.fp16-0000x-of-00004.safetensorsをダウンロードします。model-0000x-of-00007.safetensorsはダウンロードしません。

他のサイズが小さいファイルは、どれが必要なのか考えるのが面倒だったので全てダウンロードしました。

huggingface.co

 

4. Pythonコード

公式の使用例とnpakaさんの記事を参考にpythonコードを作成し、3.2節で作成したpythonフォルダに、StableVLM_test.pyとして保存しました。

note.com

 

from transformers import AutoTokenizer, AutoModelForVision2Seq, AutoImageProcessor
from PIL import Image

# モデルとトークナイザーとプロセッサーの準備
model = AutoModelForVision2Seq.from_pretrained("/home/username/StableVLM/model",
 trust_remote_code=True, load_in_8bit=True, variant="fp16", max_memory='15GB', low_cpu_mem_usage=True)
tokenizer = AutoTokenizer.from_pretrained("/home/username/StableVLM/model")
processor = AutoImageProcessor.from_pretrained("/home/username/StableVLM/model")

# 入力画像の準備
image_path = "/home/username/StableVLM/pictures/" + input("画像.拡張子:")
image = Image.open(image_path).convert("RGB")

# プロンプトの準備
instructions = input("指示:")
inputs = input("入力:")

prompt = """
以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。要求を適切に満たす応答を書きなさい。

### 指示: 
"""

prompt = prompt + instructions + "\n\n### 入力:\n" + inputs + "\n\n### 応答:\n"

#確認用にプロンプトをprint
print("\n-----プロンプトは下記です-----" + prompt + "-----プロンプト終わり-----\n") 

# 入力の準備
inputs = processor(images=image, return_tensors="pt")
text_encoding = tokenizer(prompt, add_special_tokens=False, return_tensors="pt")
inputs.update(text_encoding)

# 推論の実行
outputs = model.generate(
    **inputs.to(device=model.device),
    do_sample=False,
    num_beams=5,
    max_new_tokens=128,
    min_length=1,
    repetition_penalty=1.5,
)
generated_text = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0].strip()
print(generated_text)

 

6, 7行目において、fp16のモデルを8bitで読み込むこと、メモリ使用量の最大値は15GBとすることを指定しています。

6, 8, 9, 12においてパスを指定しているので、環境に合わせて適宜書き換えてください。

 

5. 動作確認

5.1 使い方

Terminalを開き、4章で書いたコードを実行します。

 python ~/StableVLM/python/StableVLM_test.py 

 

推論に用いたい画像のファイル名を指定し、エンターキーを押します。

次に、プロンプトの指示を記入し、エンターキーを押します。

最後に、プロンプトの入力を記入し、エンターキーを押します。

プロンプトの応答は、指定しないことにしています。

5.2 使用例

5.2.1 使用例その1

図2に、実行時のTerminal画面例を示します。
画像のファイル名はtrack.jpg, プロンプトの指示は「画像を詳細に述べてください。」, プロンプトの入力はなしとしました。

図3にtrack.jpgを示します。

推論結果は「道路脇に緑色のトラックが停まっている」です。トラックは中央分離帯寄りの写真におり、実際は走行中と思われますが、大体あっているのでヨシ👈

 

図2 実行時のTerminal画面例

 

図3 track.jpg

 

VRAMの使用量は最大15GB程度で、推論にかかった時間は数秒でした。

なお、本記事中で与えた画像は、全てデジカメで撮影したものを1920x1280pxにリサイズした画像です。元の5472x3648pxのまま与えると、書いていないことを答える傾向にある気がしたため、リサイズしました。

 

5.2.2 使用例その2

画像の内容について質問することも可能です。

プロンプトの指示「与えられた画像を下に、質問に答えてください。」

プロンプトの入力「船の色は何色ですか。」

与えた画像は、図4に示すレインボーブリッジ遊歩道から撮影した東海汽船ジェットフォイルです。

推論結果「白とピンクです。」

正解ヨシ👈

図4 レインボーブリッジ遊歩道から撮影した東海汽船ジェットフォイル

 

5.2.3 使用例その3

プロンプトの指示「与えられた画像を下に、質問に答えてください。」

プロンプトの入力「何匹の鳥が写っていますか。」

与えた画像は、図5に示す洗足池で撮影したカルガモです。合計8匹ですね。

推論結果「5匹です。」

残念ながら不正解です。

 

図5 洗足池で撮影したカルガモ

 

6. おわりに

今回は、Japanese Stable VLMをVRAM16GBのローカル環境で試してみました。

触ってみた結果としては、一応それっぽい結果が出ないこともないという感じでした。

今後は、移動ロボットで撮影した画像を推論させ、遊びたいです(テキトー)