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はダウンロードしません。
他のサイズが小さいファイルは、どれが必要なのか考えるのが面倒だったので全てダウンロードしました。
4. Pythonコード
公式の使用例とnpakaさんの記事を参考にpythonコードを作成し、3.2節で作成したpythonフォルダに、StableVLM_test.pyとして保存しました。
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のローカル環境で試してみました。
触ってみた結果としては、一応それっぽい結果が出ないこともないという感じでした。
今後は、移動ロボットで撮影した画像を推論させ、遊びたいです(テキトー)