はじめに
以前BLIP, BLIP2を使った経験があります。touch-sp.hatenablog.com
touch-sp.hatenablog.com
「Japanese InstructBLIP Alpha」は名前から分かる通り日本語が使えます。
質問にも答えてくれました。
用意した画像
以前と同様、こちらの画像を使わせて頂きました。結果
指定した画像に対して質問を投げかけると答えを返してくれます。質問文をなにも投げかけないと、単に画像を説明してくれます。星を見るために屋根の上に座っている2人の子供
「何人写っていますか」と質問した時の答えがこちらです。
2人
「子供の性別はわかりますか」と質問した時の答えがこちらです。
男の子と女の子
Pythonスクリプト
6行目のuser_queryのところに質問文を打ち込みます。空文字にしておくと単に画像を説明してくれます。import torch from transformers import LlamaTokenizer, AutoModelForVision2Seq, BlipImageProcessor from diffusers.utils import load_image import requests user_query = "子供の性別はわかりますか" model = AutoModelForVision2Seq.from_pretrained( # from https://huggingface.co/stabilityai/japanese-instructblip-alpha "japanese-instructblip-alpha", load_in_8bit=True, variant="fp16", device_map="auto", trust_remote_code=True ) processor = BlipImageProcessor.from_pretrained("japanese-instructblip-alpha") tokenizer = LlamaTokenizer.from_pretrained( "novelai/nerdstash-tokenizer-v1", additional_special_tokens=['▁▁'] ) url = "https://github.com/SHI-Labs/Versatile-Diffusion/blob/master/assets/demo/reg_example/boy_and_girl.jpg?raw=true" image = load_image(url) prompt_head = ( "以下は、タスクを説明する指示と、文脈のある入力の組み合わせです。" "要求を適切に満たす応答を書きなさい。" "\n\n### 指示: \n与えられた画像について、詳細に述べてください。" ) prompt_tail = "\n\n### 応答: " user_input = "" if user_query=="" else f"\n\n### 入力: \n{user_query}" prompt = prompt_head + user_input + prompt_tail inputs = processor(images=image, return_tensors="pt") text_encoding = tokenizer(prompt, add_special_tokens=False, return_tensors="pt") text_encoding["qformer_input_ids"] = text_encoding["input_ids"].clone() text_encoding["qformer_attention_mask"] = text_encoding["attention_mask"].clone() inputs.update(text_encoding) outputs = model.generate( **inputs.to(model.device, dtype=model.dtype), num_beams=5, max_new_tokens=32, min_length=1, ) generated_text = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0].strip() print(generated_text)
PC環境
モデルを8bitで読み込むためにbitsandbytesというライブラリを使います。そのためWSL2を使いました。
Windowsでもなんとか使えるようですがやったことがありません。
8bitで読み込まないと自分のローカル環境では動きませんでした。
使用しているPCはこちらです。
Ubuntu 22.04 on WSL2 CUDA 11.8 Python 3.10
Python環境構築
CUDA 11.8を使った場合です。Diffusersの「load_image」を使うためだけにDiffusersをインストールしています。
pip install torch==2.1.2+cu118 --index-url https://download.pytorch.org/whl/cu118 pip install diffusers[torch] pip install transformers einops sentencepiece bitsandbytes