Microsoftやウィスコンシン大学マディソン校などの研究チームが開発し、2023年4月17日に公開した「LLaVA」は「視覚」を持つAIで、画像を入力するとその画像に基づいて返答を行うことができます。2023年10月5日に登場したLLaVA-1.5はさらにクオリティが向上しているとのことなので、実際にGoogleのクラウドコンピューティングサービス「Google Cloud Platform(GCP)」上で動作させてみました。

LLaVA/pyproject.toml at main · haotian-liu/LLaVA

https://github.com/haotian-liu/LLaVA

2023年4月にリリースされた旧バージョンの性能や、デモサイトの使い方については下記の記事で確認できます。

画像を認識して年齢推測可能&人名クイズにも正答できる無料の高性能チャットAI「LLaVA」を使ってみた - GIGAZINE



GCP上で動作させてみる前に、一度デモで性能を確認してみます。左上のバージョン選択欄で「llava-v1.5-13b」を選び、サンプル画像を送信して「この写真について簡潔に説明してください」とメッセージを送信するとLLaVAが画像の様子を細かく説明してくれます。旧バージョンでは返答が英語のみとなっていましたが、LLaVA-1.5では日本語で返事してくれる模様です。



「10文字程度で」と注文をつけると大幅に短くまとまりましたが、さらに文体や形式を指定してみても返答は変化しませんでした。あまり細かく注文をつけても対応できないようです。



動作のイメージがつかめたので、早速環境を構築していきます。今回はGCPで構築を行うので、コンソールにアクセスして「VMを作成」をクリック。



名前欄に「test-llava」と入力し、マシンの構成でGPUを選択します。今回は16GBのVRAMを搭載しているNVIDIA T4を使用することにしました。



マシンタイプは「n1-standard-4」を選択。今回はテスト用ということで、VMプロビジョニングモデルは「スポット」にしました。GCPの都合で突然インスタンスが止まる可能性があるものの、料金を安く抑えることができます。



NVIDIA CUDAスタックを手動でインストールする代わりにインストール済みのイメージを使用してブートするので、「イメージを切り替え」をクリックします。



CUDAがプリインストールされているイメージが選択されているので、ディスクのサイズを決めて「選択」をクリック。



画面下部の「作成」ボタンをクリックしてインスタンスを作成します。



インスタンスが起動したら「SSH」ボタンをクリック。



別ウィンドウが開き、インスタンスにSSHで接続できました。最初にNvidiaのドライバをインストールするか聞かれるので「y」と入力してエンターキーを押します。



続いてLLaVAをインストールします。まずは下記のコマンドを実行してGitHubからリポジトリをクローン。

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 .

LLaVAのモデル一覧ページでCheckpointのパスを確認します。今回使用したいのはLLaVA-1.5の13Bモデルなのでパスは「liuhaotian/llava-v1.5-13b」とのこと。



LLaVAを実行するためのコマンドは下記の通り。モデルを「--model-path 〜」の形式で指定し、読み込ませたい画像を「--image-file 〜」の形式で指定します。画像の指定はインターネット上のパスでもOK。また、フルサイズのモデルをロードするにはVRAMが少なくとも24GB必要とのことなので、「--load-8bit」をつけてメモリの必要量を軽減します。

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

コードを実行すると自動でモデルのダウンロードが始まりました。



約1時間後、モデルの準備が整い「USER:」と表示されました。早速「画像について10文字程度で簡潔に説明して下さい」とプロンプトを入力します。



しかし「CUDA out of memory」とエラーがでて動作が止まってしまいました。8bit量子化を行っても15GBのVRAMでは足りなかった模様。



今度は「--load-4bit」をつけて4bit量子化を行い、さらにVRAMの必要量を削減します。

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

30分程度待機するとモデルの準備が完了しました。先ほどと同じプロンプトを送信します。



LLaVAの返答は「A wooden pier over a lake with mountains in the background(背景に山のある湖に浮かぶ木の桟橋)」というものでした。4bit量子化を行ったためか、日本語では回答してもらえませんでしたが、適切に画像について説明できています。



なお、4bit量子化を行ったときのLLaVA-1.5-13BモデルのVRAM消費量は約10GBでした。