MiniGPT-4マルチモーダルLLMをローカルで動かす

イラストや写真をAIに説明させたいなあ、という動機からマルチモーダルLLMを動かしてみました。マルチモーダルはChatGPT-4でもできますし、Bingでもできますが、諸般の事情でオープンソースを用いいてロカール環境で動かすことにしました。最近ではrinna-4BやStabirityAIもマルチモーダルLLMを発表しています。 筆者も試しましたが、回答がすごくあっさりしていて物足りなさを感じました。そこで、以前に注目していたMiniGPT-4を動かすことにしました。 ちなみにrinna-4Bで動かしているマルチモーダルはMiniGPT-4ベースです。
(*Vicuna-v0~v1.3までは非商用です。v1.5は商用で利用できるようです。ただし、v1.5はMiniGPT-4では使えません。)

論文執筆者ホームページは以下になります。
https://minigpt-4.github.io/

デモを動かしてみる

ここではオンラインデモを試すことができ、Abstractの上に並んだボタンのSpaceからデモ画面に入ることができます。手持ちのイラストでどのような回答が得られるのか試して見ました。

デモ画面

プロンプト:explain this picture
以下のような回答がありました。
This image depicts a beautiful garden with pink and white flowers and a white gazebo in the background. The garden is surrounded by tall trees and a pathway leading to the gazebo. The sky is a light blue with clouds and a few birds flying in the sky. The overall atmosphere of the image is peaceful and serene.
日本語に訳すとこんな感じ
「この画像は、背景にピンクと白の花と白い西洋風あずまやがある美しい庭園を描いています。庭園は高い木々に囲まれ、西洋風あずまやに続く小道があります。空は水色で、雲があり、数羽の鳥が空を飛んでいます。絵全体の雰囲気は穏やかで穏やかです。」
日本語のプロンプトも使えます。文末に「日本語で答えて」と書くと回答も日本語になります。

ローカルでの動かし方

システム構成
第12世代 i5
メモリー 32G
GPU   GForce-3060-12G
OS    Ubuntu20.04-JP

ソースコードはこちらです。

動かし方はリポジトリのREAD.MEに記載されてるので、大きな問題はないと思いますが、筆者は忠実に実行しようとしてやや戸惑いました。

環境設定

git clone https://github.com/Vision-CAIR/MiniGPT-4.git
cd MiniGPT-4
conda env create -f environment.yml
conda activate minigpt4

リポジトリ通りで問題はないはずです。

MiniGPT-4ではLLMとしてVicuna-13Bが用いられています。デモと同じように動かすにはVicuna-13Bが必要ですが、VRAMが24G必要だとのことで、Vicuna-7Bで動かすことができるcheckpointが準備されています。 こちらですと3060など、
VRAM-12Gがあれば動きます。今回はVicuna-7B版を動かします。

Vicunaモデルの準備

リポジトリではv0バージョンを用いた、と記載されていたので、指示通りVicuna-v0を準備するためにリポジトリに記載された作成方法のリンク先リポジトリをみました。

https://github.com/Vision-CAIR/MiniGPT-4/blob/main/PrepareVicuna.md

ここで問題発生。Vicuna-v0を作成するためにはMetaにLLAMA-7BかLLAMA-13Bの利用申請をする必要があり、審査に通るまで5日程度必要のようです。

v0で無くても動く

結論から言いますとVicuna-v0でなくても動きます。Vicunaのリポジトリに一覧が記載されています。

https://github.com/lm-sys/FastChat/blob/main/docs/vicuna_weights_version.md

v0以外はすでにモデルが作成済みなので、厄介な手続きや構築作業なしにダウンロードだけで利用でいます。以下のようなディレクトリ構造にするよう求められているので、MiniGPT-4ディレクトリ内にvicuna-7b-v1.3ディレクトリを作成し、V1.3 7B内の全てのファイルをダウンロードします。
vicuna-7b-v1.3
├── config.json
├── generation_config.json
├── pytorch_model.bin.index.json
├── pytorch_model-00001-of-00003.bin
...
ディレクトリを/minigpt4/configs/models/minigpt4.yamlの16行目に設定します。

minigpt4.yaml
model:
  arch: mini_gpt4

  # vit encoder
  image_size: 224
  drop_path_rate: 0
  use_grad_checkpoint: False
  vit_precision: "fp16"
  freeze_vit: True
  freeze_qformer: True

  # Q-Former
  num_query_token: 32

  # Vicuna
  llama_model: "./vicuna-7b-v1.3/"

  # generation configs
  prompt: ""

preprocess:
    vis_processor:
        train:
          name: "blip2_image_train"
          image_size: 224
        eval:
          name: "blip2_image_eval"
          image_size: 224
    text_processor:
        train:
          name: "blip_caption"
        eval:
          name: "blip_caption"

次にcheckpointディレクトリを作成してMiniGPT-4のcheckpointをダウンロードします。 表にはCheckpoint Aligned with Vicuna 13BとCheckpoint Aligned with Vicuna 7Bがありますが、今回はCheckpoint Aligned with Vicuna 7Bをcheckpointディレクトリにダウンロードします。その後、
eval_configs/minigpt4_eval.yaml
の11行目にcheckpointを指定します。

minigpt4_eval.yaml
model:
  arch: mini_gpt4
  model_type: pretrain_vicuna
  freeze_vit: True
  freeze_qformer: True
  max_txt_len: 160
  end_sym: "###"
  low_resource: True
  prompt_path: "prompts/alignment.txt"
  prompt_template: '###Human: {} ###Assistant: '
  ckpt: './checkpoint/pretrained_minigpt4_7b.pth'


datasets:
  cc_sbu_align:
    vis_processor:
      train:
        name: "blip2_image_eval"
        image_size: 224
    text_processor:
      train:
        name: "blip_caption"

run:
  task: image_text_pretrain
  
eval_configs/minigpt4_eval.yaml

これで準備完了です。

デモを動かす

リポジトリ通りのコマンドを実行します。

python demo.py --cfg-path eval_configs/minigpt4_eval.yaml  --gpu-id 0

初期化が始まり、全て上手くいくと、URLからアクセスできるようになります。
デフォルトでは、
http://127.0.0.1:7860/
になります。

Initializing Chat
Downloading (…)solve/main/vocab.txt: 100%|████| 232k/232k [00:00<00:00, 778kB/s]
Downloading (…)okenizer_config.json: 100%|███| 28.0/28.0 [00:00<00:00, 2.42kB/s]
Downloading (…)lve/main/config.json: 100%|██████| 570/570 [00:00<00:00, 249kB/s]
Loading VIT
100%|██████████████████████████████████████| 1.89G/1.89G [00:57<00:00, 35.4MB/s]
Loading VIT Done
Loading Q-Former
100%|████████████████████████████████████████| 413M/413M [00:12<00:00, 35.8MB/s]
Loading Q-Former Done
Loading LLAMA

===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
================================================================================
Loading checkpoint shards: 100%|██████████████████| 2/2 [00:30<00:00, 15.22s/it]
Loading LLAMA Done
Load 4 training prompts
Prompt Example 
###Human: <Img><ImageHere></Img> Please provide a detailed description of the picture. ###Assistant: 
Load BLIP2-LLM Checkpoint: ./checkpoint/prerained_minigpt4_7b.pth
Initialization Finished
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://74bc1a00161547e37d.gradio.live

This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces

http://127.0.0.1:7860/にアクセスすると、以下の画面が開きます。オリジナルと同じデモ画面を動かすことができました。

URLにアクセスした画面

試しにサイトのデモ版と同じように使ってみました。

サイトデモと同じ画像、同じプロンプトの結果

サイトデモよりも詳しい説明をしてくれました。日本語だと以下のような感じです。

「これは、ピンクと白の花が場面全体に散りばめられている、満開の公園の絵です。背景に、白とピンクの屋根と大きなドームを持つ建物が見えます。地面は花で覆われ、ピンクと白の花壇がいくつかあります。歩道には木々が植えられており、近くにはベンチがいくつかあります。遠くに青い水をたたえた湖があります。

絵はピンクと白の花が咲く庭園を舞台にしています。 この絵では、ピンクと白の花が咲く公園から、白とピンクの屋根と大きなドームのある建物まで小道が続いています。地面は花で覆われ、ピンクと白の花壇がいくつかあります。歩道には木々が植えられており、近くにはベンチがいくつかあります。遠くに青い水をたたえた湖があります。

絵はピンクと白の花が咲く庭園を舞台にしています。その道は、白とピンクの屋根と大きなドームを持つ建物に通じています。地面は花で覆われ、ピンクと白の花壇がいくつかあります。歩道には木々が植えられており、近くにはベンチがいくつかあります。遠くに青い水をたたえた湖があります。

絵はピンクと白の花が咲く庭園を舞台にしています。この道は白とピンクの屋根と大きなドームのある建物に通じています」

重複ありますが、なかなかいい感じです。

まとめ

今回はVicuna 7Bでしたが、3090や4090であれば同じ方法でVicuna 13Bが動くはずです。 rinna-4BやStabilityAIよりも高精度なマルチモーダルが、ローカルで動かすことができることで用途が広がります。

商用利用について
Vicuna-v0~v1.3までは非商用の可能性があります。v1.5は非商用で間違いありません。