rinna 4bのマルチモーダルモデルで画像の説明をしてもらう-Windowsで動かす方法解説-

rinna 4bのマルチモーダルモデルで画像の説明をしてもらう-Windowsで動かす方法解説- ソフトウェア

rinna社製のマルチモーダルモデルをWindowsのローカル環境で動かす方法を丁寧に解説します。

画像を入力すると、それを説明するテキストを生成してもらえます。
けっこう精度良いです。

今回は「bilingual-gpt-neox-4b-minigpt4」を動かしてみます。

チェック!!
さくいん! 本サイトのAI関連記事まとめ どれから見れば良いのか?!


数十記事ある本サイトのAI関連記事を体系的にまとめました。

目的別にどれから見れば良いのかわかります!!

AI記事索引ページはコチラ

0, bilingual-gpt-neox-4b-minigpt4の概要

今回動かそうとしている「bilingual-gpt-neox-4b-minigpt4」は、bilingual-gpt-neox-4bシリーズのひとつです。

「bilingual」とある通り、このシリーズは日本語と英語のバイリンガルのモデルです。

そのシリーズ内でも、今回は画像を入力すると画像の説明文章を生成してくれるモデルマルチモーダルモデルを扱っていきます。

なお、日本語対応版はこちらの記事をご覧ください。

1, 必要なものをインストール

事前に入れておくもの

  • Git
  • Python(当方3.10.7で動作確認済)

これをインストール&パスの通った状態にします。

MiniGPT-4のリポジトリなどをダウンロード

適当なフォルダを作成し、フォルダ内で右クリック→「ターミナルで開く」を選択。

ターミナルに以下をコピペしてエンター。

git clone https://github.com/Vision-CAIR/MiniGPT-4.git
cd MiniGPT-4
git checkout 22d8888

下のような警告は気にせず貼り付けてください。

仮想環境作成

Pyhtonの仮想環境を構築します。

以下のコマンドをコピペして実行しましょう。

python -m venv venv
venv\Scripts\activate.ps1

これで仮想環境が作成できました。

諸々をpipでインストール

まずPytorchをインストールします。

ただし、PyTorchについてはCUDAバージョンなどに左右されるため、エラーなど出たら公式を確認してください。

https://pytorch.org/get-started/locally/

ここでは一例として当方の環境(上記画像の通り)のコマンドを載せておきます。

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

次に、その他もろもろをインストールします。

rinnaの4bモデルはMiniGPT-4の実装に基づいているため、MiniGPT-4用の大量のモジュールをインストールする必要があります。

直前に作成した仮想環境内にインストールしているため、汚染や競合の懸念はゼロ☆
ご安心ください。

pip install accelerate==0.16.0
pip install aiohttp==3.8.4
pip install aiosignal==1.3.1
pip install async-timeout==4.0.2
pip install attrs==22.2.0
pip install bitsandbytes==0.37.0
pip install cchardet==2.1.7
pip install chardet==5.1.0
pip install contourpy==1.0.7
pip install cycler==0.11.0
pip install filelock==3.9.0
pip install fonttools==4.38.0
pip install frozenlist==1.3.3
pip install huggingface-hub==0.13.4
pip install importlib-resources==5.12.0
pip install kiwisolver==1.4.4
pip install matplotlib==3.7.0
pip install multidict==6.0.4
pip install openai==0.27.0
pip install packaging==23.0
pip install psutil==5.9.4
pip install pycocotools==2.0.6
pip install pyparsing==3.0.9
pip install python-dateutil==2.8.2
pip install pyyaml==6.0
pip install regex==2022.10.31
pip install tokenizers==0.13.2
pip install tqdm==4.64.1
pip install transformers==4.28.0
pip install timm==0.6.13
pip install spacy==3.5.1
pip install webdataset==0.2.48
pip install scikit-learn==1.2.2
pip install scipy==1.10.1
pip install yarl==1.8.2
pip install zipp==3.14.0
pip install omegaconf==2.3.0
pip install opencv-python==4.7.0.72
pip install iopath==0.1.10
pip install decord==0.6.0
pip install tenacity==8.2.2
pip install peft
pip install pycocoevalcap
pip install sentence-transformers
pip install umap-learn
pip install notebook
pip install gradio==3.24.1
pip install gradio-client==0.0.8
pip install wandb

スクリプトとモデルをダウンロード

まず、スクリプトを保存します。

こちらにアクセスし、全文をコピーし、「customized_mini_gpt4.py」という名前でvenvフォルダなどと同じ場所に保存します。
拡張子をpyにするようにしてください。

次に、モデルをこちら(ダウンロードリンク)からダウンロードします。

そして同様に配置しましょう。

これで全ての準備は完了です!!

ターミナルは今後も使うので開きっぱなしにしておきます。

2, rinna 4b マルチモーダルモデルを動かしてみる

公式のサンプルを動かす(画像URLから画像を取得)

おおむね公式のサンプル通りのコードです。

以下のコードをコピーして、適当にtest.pyとでも名付けてvenvフォルダなどと同じ場所に保存します。

import torch
import requests
from PIL import Image
from minigpt4.processors.blip_processors import Blip2ImageEvalProcessor
from customized_mini_gpt4 import CustomizedMiniGPT4

ckpt_path = "./checkpoint.pth"
model = CustomizedMiniGPT4(gpt_neox_model="rinna/bilingual-gpt-neox-4b")
tokenizer = model.gpt_neox_tokenizer

if torch.cuda.is_available():
    model = model.to("cuda")

if ckpt_path is not None:
    print("Load BLIP2-LLM Checkpoint: {}".format(ckpt_path))
    ckpt = torch.load(ckpt_path, map_location="cpu")
    model.load_state_dict(ckpt["model"], strict=False)

vis_processor = Blip2ImageEvalProcessor()
prompt = [
    {"speaker": "ユーザー", "text": "<Img><ImageHere></Img>これは何?"},
]
prompt = [f"{uttr['speaker']}: {uttr['text']}" for uttr in prompt]
prompt = "\n".join(prompt)
prompt = prompt + "\n" + "システム: "

image_url = "https://huggingface.co/rinna/bilingual-gpt-neox-4b-minigpt4/resolve/main/sample.jpg"
raw_image = Image.open(requests.get(image_url, stream=True).raw).convert("RGB")
image = vis_processor(raw_image).unsqueeze(0).to(model.device)
image_emb = model.encode_img(image)
embs = model.get_context_emb(prompt, [image_emb])

output_ids = model.gpt_neox_model.generate(
    inputs_embeds=embs,
    max_new_tokens=512,
    do_sample=True,
    temperature=1.0,
    top_p=0.85,
    pad_token_id=tokenizer.pad_token_id,
    bos_token_id=tokenizer.bos_token_id,
    eos_token_id=tokenizer.eos_token_id,
)
output = tokenizer.decode(output_ids.tolist()[0], skip_special_tokens=True)
print(output)

そして、ターミナルから起動します。

python test.py

初回実行時は、モデル(合計10GB程度)のダウンロードが行われるので、気長に待ちましょう。

テスト用の画像として下の画像を指定しました。

https://huggingface.co/rinna/bilingual-gpt-neox-4b-minigpt4/resolve/main/sample.jpg

出力は以下の通りでした。

机の上に猫が寝転んでいます

的確ですね☆

若干使いやすいように改造(URL何度も指定できるように)

import torch
import requests
from PIL import Image
from minigpt4.processors.blip_processors import Blip2ImageEvalProcessor
from customized_mini_gpt4 import CustomizedMiniGPT4

ckpt_path = "./checkpoint.pth"
model = CustomizedMiniGPT4(gpt_neox_model="rinna/bilingual-gpt-neox-4b")
tokenizer = model.gpt_neox_tokenizer

if torch.cuda.is_available():
    model = model.to("cuda")

if ckpt_path is not None:
    print("Load BLIP2-LLM Checkpoint: {}".format(ckpt_path))
    ckpt = torch.load(ckpt_path, map_location="cpu")
    model.load_state_dict(ckpt["model"], strict=False)

vis_processor = Blip2ImageEvalProcessor()
prompt = [
    {"speaker": "ユーザー", "text": "<Img><ImageHere></Img>これは何?"},
]
prompt = [f"{uttr['speaker']}: {uttr['text']}" for uttr in prompt]
prompt = "\n".join(prompt)
prompt = prompt + "\n" + "システム: "

# image_url = "https://huggingface.co/rinna/bilingual-gpt-neox-4b-minigpt4/resolve/main/sample.jpg"
while True:
    image_url = input("image_url : ")
    try:
        raw_image = Image.open(requests.get(image_url, stream=True).raw).convert("RGB")
        image = vis_processor(raw_image).unsqueeze(0).to(model.device)
        image_emb = model.encode_img(image)
        embs = model.get_context_emb(prompt, [image_emb])

        output_ids = model.gpt_neox_model.generate(
            inputs_embeds=embs,
            max_new_tokens=512,
            do_sample=True,
            temperature=1.0,
            top_p=0.85,
            pad_token_id=tokenizer.pad_token_id,
            bos_token_id=tokenizer.bos_token_id,
            eos_token_id=tokenizer.eos_token_id,
        )
        output = tokenizer.decode(output_ids.tolist()[0], skip_special_tokens=True)
        print(output)
    except:
        print("Error")

URLを入力してエンターを押すと説明が生成されるというのを繰り返すようにしただけです。

不正なURLで毎回落ちるとモデルロード時間的に悲しいので、上手くいかないときはErrorと表示するだけで落ちないようにしました。

割と精度良いですね。

下の画像で何度か説明してもらいました。

実行時のハードウェア負荷(VRAM使用量など)

RAMは17GB程度、VRAMは11GB程度消費しました。

まとめ Rinna 4B マルチモーダルモデルを動かすには

  1. Git,Pythonを入れておく
  2. 環境構築
    • リポジトリをダウンロード
    • 仮想環境作成
    • 大量のジュールインストール
    • スクリプトとモデルダウンロード
  3. サンプルコードを動かしてみる
  4. 生成された画像の説明文章を楽しむ!!

割と人やモノ、動物など様々な種類の画像に対して、精度良さそうな説明をしてくれます

VRAMもRAMもそこそこ食うものの、ハイエンド限定というほど高負荷ではありません。
間口が広がって嬉しい限りです。

将来的には画像のキャプション、ストックフォトのタグなどは自動生成されるようになるかもしれませんね!(もうなってるかも)

なお、日本語対応版はこちらの記事をご覧ください。

他のLLMの記事もぜひご覧ください!!

他にも色々と面白いAI関連の記事を書いています。合わせてご覧ください。

楽曲生成AI「audiocraft」をWindowsに導入する方法解説&実例付き

画像生成AI「Stable Diffusion」を動かす方法

無料のCopilot「Amazon CodeWhisperer」を登録&VSCodeで使用する方法まとめ

タイトルとURLをコピーしました