MiniGPT-v2を試す
デモ。ちょっとすごい。
コード
レポジトリをクローン
$ git clone https://github.com/Vision-CAIR/MiniGPT-4 && MiniGPT-4
READMEを見るとcondaを使っているが、うちはpyenv+pyenv-virtualenv環境でやる。
$ pyenv virtualenv 3.10.13 MiniGPT-4
$ pyenv local MiniGPT-4
CUDAのバージョンに合わせてまずpytorchをインストール。うちは11.8。
$ pip install torch==2.0.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
その他のパッケージをインストール
$ pip install \
huggingface-hub==0.18.0 \
matplotlib==3.7.0 \
psutil==5.9.4 \
iopath \
pyyaml==6.0 \
regex==2022.10.31 \
tokenizers==0.13.2 \
tqdm==4.64.1 \
transformers==4.30.0 \
timm==0.6.13 \
webdataset==0.2.48 \
omegaconf==2.3.0 \
opencv-python==4.7.0.72 \
decord==0.6.0 \
peft==0.2.0 \
sentence-transformers \
gradio==3.47.1 \
accelerate==0.20.3 \
bitsandbytes==0.37.0 \
wandb
LLama-2-7b-chat-hfをダウンロード
$ huggingface-cli login
$ git lfs install
$ git clone https://huggingface.co/meta-llama/Llama-2-7b-chat-hf
MiniGPT-4の事前学習済みチェックポイントをダウンロード。Googleドライブからのダウンロードはこのあたりを参考に。
$ FILE_ID=1aVbfW7nkCSYx99_vCRyP1sOlQiWVSnAl
$ FILE_NAME=minigptv2_checkpoint.pth
$ curl -sc /tmp/cookie "https://drive.google.com/uc?export=download&id=${FILE_ID}" > /dev/null
$ CODE="$(awk '/_warning_/ {print $NF}' /tmp/cookie)"
$ curl -Lb /tmp/cookie "https://drive.google.com/uc?export=download&confirm=${CODE}&id=${FILE_ID}" -o ${FILE_NAME}
モデルのパスを設定。どうやらフルパスで設定する必要がある様子。
llama_model: "/SOMEWHERE/MiniGPT-4/Llama-2-7b-chat-hf"
ckpt: '/SOMEWHERE/MiniGPT-4/minigptv2_checkpoint.pth'
では起動、、、と行きたいところだけど、ちょっと使いにくいので以下を修正する(必須ではない)
demo.launch(share=True, enable_queue=True)
デフォルトではshare=True
になっているのでインターネット上に公開されてしまう。気にしない人はこのままで。個人的にはローカルで完結させたいので以下のように修正。
demo.launch(enable_queue=True, server_name="0.0.0.0", server_port=7860)
次、チャットウインドウが狭くてヒストリーが追いにくい。
chatbot = gr.Chatbot(label='MiniGPT-v2')
ちょっと高さを広げておく。
chatbot = gr.Chatbot(label='MiniGPT-v2', height=800)
ではいよいよ起動。初回起動時はなにかダウンロード(1.89GB)が行われるようでちょっと時間がかかる。
$ python demo_v2.py --cfg-path eval_configs/minigptv2_eval.yaml --gpu-id 0
こんな感じ。
メモリ使用量はこんな感じ。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.30.02 Driver Version: 530.30.02 CUDA Version: 12.1 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 58C P8 12W / 450W| 11329MiB / 24564MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
+---------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=======================================================================================|
| 0 N/A N/A 1122 G /usr/lib/xorg/Xorg 9MiB |
| 0 N/A N/A 1359 G /usr/bin/gnome-shell 10MiB |
| 0 N/A N/A 1654734 C ...pyenv/versions/MiniGPT-4/bin/python 11304MiB |
+---------------------------------------------------------------------------------------+
MiniGPT-v2でできること
画像をアップロードして、なにかクエリを入力すれば、その画像についての対話ができる。
それ以外に、予め用意されているいくつかのタグを使うと物体検出等でよく行われるタスクを言語で指示できる
Grounding
"Grounding"は日本語にどう訳せばいいのかわからなかった。色々調べてみると"Visual Grounding"ともいうようなので、ChatGPTに聞いてみた。
「Visual grounding」とは、通常、自然言語処理(NLP)とコンピュータビジョン(CV)の領域で使用される用語で、テキストと画像の関連性や対応関係を特定し、理解することを指します。これは、特定のテキストが示す情報や言及が、画像内のどの部分に対応しているのかを確認する過程を意味します。
単純に言うと、画像を読み取った内容をテキスト化して、そのテキストを画像内のオブジェクトと紐づけるということだと理解した。
[grounding]
タグを付けて画像を説明させると
- 画像内の説明がテキストで行われる
- 画像内のオブジェクトがバウンディングボックスでアノテートされる
- テキストとオブジェクトがそれぞれ紐づけられる
となっているのがわかる。
Detection
[detection]
タグを使うと、画像内からテキストで指定した物体を検出する。
Refer
Detectionと似ているけど、[refer]
タグを使うと指定の物体の画像内での位置が返される。
Identity
[refer]
タグで画像内の位置を指定すると、その領域内二検出された物体がテキストで返される。
VQA
Visual Question and Answeringだと思うけど、[vqa]
タグを使うと画像に対する質問に回答する。回答は説明的なものではなくてシンプルな単語での回答になる。
まとめ
7B でこのレベルはちょっとすごい。