マルチモーダル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:」という文字が表示され、入力を受け付けるようになります。ここで質問を入力します。例えば、
と質問したら、「ASSISTANT:」という行が表示され、そこにLLaVAの回答が表示されていきます。
今回は、
という出力でした。claudeに和訳させると、
となります。ベンチがあるなど、やや不正確なところもありますが、大体合っています。一般のPCで動くモデルでここまで正確に予想ができるなら素晴らしいでしょう。
日本語で出力して欲しいとお願いしたらしてくれました。多言語に対応しているのもこのモデルのすごいところです。
おわりに
今回は、マルチモーダルLLMの「LLaVA」をDocker+Ubuntuの環境で動かす方法を説明しました。個人のPCでも動作可能なレベルのマルチモーダルLLMは貴重なので、ぜひこちらの記事を参考にしてご自身のアプリに組み込むなどの使い方をしてみてはいかがでしょうか?それではまた。