見出し画像

マルチモーダルLLM「LLaVA」をDocker+Ubuntuで動かす


はじめに

 claudeやChatGPT-4oのように画像とテキストなど複数の入力を受け付けるマルチモーダルLLMが最近流行ってきています。研究の一環でマルチモーダルLLMについて調査をしており、特に個人のPCでも動作するサイズの「LLaVA」というモデルを研究に利用できないか考えてます。

 私の研究室では、大量のGPUを使えるマシンに遠隔でアクセスしてそこでdockerコンテナを作り、その中で機械学習などの重い処理を行うのですが、今回LLaVAを動かすまでに結構手こずったので、同様の環境の方のために記録を残しておきます。

動作環境

  • PC: MacBook Air M1

  • Docker: 

  • Ubuntu: 20.04、CUIオンリー

  • Python: 3.10.12

  • anaconda: 

動かしてみる

 モデルのサイズ的にgoogle colabの無料GPUでは厳しそうなので、Docker+Ubuntu20.04でコンテナを作ってそこでGPUを使って動かすことにします。

1. GPUを使えるdockerイメージのダウンロード

こちらはNVIDIA公式が公開しているdockerイメージです。動くことが確定しているのでありがたいです。欲しいUbuntuのバージョンとCUDAのバージョンを選びましょう。サイトにあるdocker pullの文をコピーして実行するだけでOK。

2. dockerコンテナの作成

docker run --gpus all -it nvidia/cuda:12.4.1-cudnn-devel-ubuntu20.04

nvidia/cuda以降は自分のダウンロードしたイメージです。イメージの名前を調べるなら

docker images

3. 必要なソフトのインストール

dockerコンテナの環境はCUDA以外余計なプログラムが一切入っていないので、必要な物を順次入れていきます。python、git、curlがあればOKだと思います。

4. githubからLLaVAのダウンロード

公式githubからダウンロードします。今後は基本的にここの指示通りに進めます。

5. anacondaのダウンロード

LLaVA公式ではcondaを用いた仮想環境での実行が推奨されています。
自分の環境にまだ入っていない場合はanaconda公式からダウンロードしてください。

私の環境ではGUIがなかったのでこちらを参考にインストールしました。

anacondaをインストールし終わった後はマシンを再起動したらcondaが使えるようになるのですが、Docker環境ではマシンの再起動が難しいので、こちらを参考にしてパスを通しました。

6. 仮想環境の構築、LLaVAの環境設定

LLaVA公式にある通りに進めていきます。

リポジトリのクローン

git clone https://github.com/haotian-liu/LLaVA.git
cd LLaVA


パッケージのインストール、仮想環境の構築

conda create -n llava python=3.10 -y
conda activate llava
pip install --upgrade pip  # enable PEP 660 support
pip install -e .


以下のコードは、とりあえず実行するだけなら不要です。いずれファインチューニングとかしたいなら入れておきましょう。

pip install -e ".[train]"
pip install flash-attn --no-build-isolation


7. 実行

python -m llava.serve.cli \
    --model-path liuhaotian/llava-v1.5-13b \
    --image-file "https://llava-vl.github.io/static/images/view.jpg" \
    --load-8bit

このコードを実行すれば、LLaVAが動作します。初回の実行では、モデルのダウンロードが入るためかなり時間がかかります。

オプション1個目のモデルのパスでは、モデルの名前を指定します。今回はパラメータ数13B(=Billion)のものを使っていますが、7Bなどのもう少し軽量なものもあります。7Bならgoogle colabのGPUでも動作するかも?

2つ目のオプションの--image-fileは画像のパスを渡すものですが、今回の画像は、LLaVA側がデフォルトで用意したものになっています。自分で用意した画像のパスでももちろんOK。

今回渡した画像

最後の--load-8bitというオプションは、モデルの推論を早くするための量子化の指定です。この量子化を行うためにはGPUが必須になります。(この行がなければCPUでも動作するかも?未検証ですが)

8. 実行結果

モデルのダウンロードが済んだら、「USER:」という文字が表示され、入力を受け付けるようになります。ここで質問を入力します。例えば、

USER: please explain about this picture.

と質問したら、「ASSISTANT:」という行が表示され、そこにLLaVAの回答が表示されていきます。

今回は、

ASSISTANT: The image features a wooden pier extending out into a large body of water, possibly a lake. The pier is surrounded by a serene landscape, with mountains visible in the distance. The scene is captured in black and white, adding a timeless and peaceful atmosphere to the image.

There are several benches placed along the pier, providing a place for visitors to sit and enjoy the view. Some of these benches are located closer to the water, while others are positioned further back on the pier. The benches are spaced out, allowing for a comfortable and relaxing experience for those who choose to sit and take in the beautiful surroundings.

という出力でした。claudeに和訳させると、

この画像には、大きな水域、おそらく湖に向かって伸びる木製の桟橋が描かれています。桟橋の周りには、遠くに山々が見える穏やかな風景が広がっています。この風景はモノクロで撮影されており、画像に時代を超えた平穏な雰囲気を添えています。

桟橋の上には何枚かのベンチが置かれており、訪れた人々が座って景色を楽しめるようになっています。このベンチの中には水際に近いものもあれば、桟橋の奥に置かれているものもあります。ベンチは適度な間隔を開けて配置されているため、そこに座って美しい景色を堪能したい人々にとってくつろげる空間となっています。

claudeの翻訳

となります。ベンチがあるなど、やや不正確なところもありますが、大体合っています。一般のPCで動くモデルでここまで正確に予想ができるなら素晴らしいでしょう。

この画像の説明です

日本語で出力して欲しいとお願いしたらしてくれました。多言語に対応しているのもこのモデルのすごいところです。

おわりに

今回は、マルチモーダルLLMの「LLaVA」をDocker+Ubuntuの環境で動かす方法を説明しました。個人のPCでも動作可能なレベルのマルチモーダルLLMは貴重なので、ぜひこちらの記事を参考にしてご自身のアプリに組み込むなどの使い方をしてみてはいかがでしょうか?それではまた。


この記事が気に入ったらサポートをしてみませんか?