Rough Experiments with Llamafile and LLaVA 1.5

Michael Lynch

LlamafileとLLaVA 1.5での手探りの実験

オープンソースのチャットボット/LLMをLlamafileで試す方法について書かれたSimon Willisonの記事を読みました。あまりに簡単そうに書かれていたので、自分でも試してみることにしました。

私が長年趣味で続けているプロジェクトの一つに、ライブコメディを探せるサイトWanderJestがあります。このサイトで難しいのは、今後開催されるショーについての正式な情報が、たいていそのショーのポスターにしか載っていないことです。たとえば、こんなポスターです。

これまで私は、こうした情報を手作業で拾っていました。しかし、面倒ですし、時間もかかります。

Simonは、Llamafileを使えばLLaVA 1.5を簡単に動かせると書いていました。LLaVA 1.5なら、画像についてチャットボットに質問できます。ポスターから欲しい情報をすべてLLaVAに読み取ってもらえれば、WanderJestで抱えている問題を自動化して解決できるかもしれません。

CPUベースのLLaVA 1.5

まず、Debian Bookwormを動かすScalewayのPRO2-S VMインスタンスを立ち上げてみました。どのVMでも構いませんが、Scalewayのサーバーなら手軽に立ち上げられる環境があるので、これを選びました。

SSH接続時にポートフォワーディングを有効にして、LlamafileのWebインターフェースにアクセスできるようにしました。

ssh mike@$MY_SCALEWAY_IP -L 8080:localhost:8080

Simonの手順に従い、サーバーを実行するバイナリをダウンロードします。

curl -LO https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4-server.llamafile && \
  chmod 755 llava-v1.5-7b-q4-server.llamafile

続いて、サーバーを起動しました。

./llava-v1.5-7b-q4-server.llamafile --nobrowser

問題なく動き、ブラウザーにWebインターフェースが表示されました。

ショーのポスターをアップロードしてみましたが、何も起こりません。ポスターをアップロードするだけでなく、質問もしなければならないことが分かりました。

というわけで、出だしから少し苦戦です。3人の名前をすべて間違え、実際の名前に似たものをでっち上げています。

ユーザー:このポスターに載っている出演者は誰ですか?

Llama:このポスターに載っている出演者は、Ayeshah Mae、Jennifer Myskowski-Szynski、Ayisha Maeです。

この回答を生成するのに、約1分かかりました。表示された統計情報は次のとおりです。

1トークンあたり130ms、毎秒7.67トークン

別の質問も試してみました。

ユーザー:このショーはどこで開催されますか?

Llama:このコメディショーケースは、ペンシルベニア州RathmellのLuthier’s Co-opで開催されます。

今回も何かしら読み取れてはいますが、正確さは70%程度です。

JSON形式で情報を取得できるかも気になりました。しかし、LLaVAにJSONで答えさせるのには苦労しました。「次の質問にはJSONで回答してください」と書いても、指示を無視して普通の英語で返してきます。

研究論文では、LLaVAの著者が、LLaVAにJSONで回答させる例を示しています。

LLaVAにJSONで回答させる例。研究論文より

論文に書かれていた形式をそのまま試してみましたが、何も返ってきませんでした。

ユーザー:この画像内のテキストを読み取り、次のJSON形式で情報を返してください(xxxはプレースホルダーです。画像内に情報がない場合は、代わりに「N/A」と入力してください)。{“title”: xxx, “date”: xxx, “time”: xxx, “performers”: xxx, “hosts”: xxx, “location”: { “address”: xxx, “city”: xxx, “state”: xxx, “zipCode”: xxx}}

サーバーログを見るとリクエストの処理は完了しているのに、何も返ってきていないことが分かりました。

もう一度試すと、今度はJSONを正常に生成しました。ただし、相変わらず情報の多くをでっち上げています。

ユーザー:この画像内のテキストを読み取り、次のJSON形式で情報を返してください(xxxはプレースホルダーです。画像内に情報がない場合は、代わりに「N/A」と入力してください)。{“title”: xxx, “date”: xxx, “time”: xxx, “performers”: xxx, “hosts”: xxx, “location”: { “address”: xxx, “city”: xxx, “state”: xxx, “zipCode”: xxx}}

Llama:{“title”: “Luther’s Coop Comedy Showcase”, “date”: “December 2nd”, “time”: “7:00 PM - 9:30 PM”, “performers”: [“Ayisha M. Quinn”, “Jennifer Myskowski-Szczykowski”], “hosts”: [“Molly Hyne & Matt Woodland”], “location”: { “address”: “109 Court St, Framingham, MA”, “city”: “Framingham”, “state”: “MA”, “zipCode”: “01702”}}

正しかった点もいくつかあります。

  • 「Matt Woodland」という名前を正しく読み取った
  • 日付を12月2日と正しく特定した
  • 州をMAと正しく特定した

しかし、それ以外は細かい間違いから大きな間違いまで、ほぼすべて誤っていました。興味深いことに、01702はマサチューセッツ州FraminghamのZIPコードです。ポスターには載っていなかった情報なので、どこか別の場所から拾ってきたに違いありません。しかし、このショーはFraminghamで開催されるわけではありません。

CUDAを使ったGPUベースのLLaVA 1.5に失敗

私はLLMのパラメーターについて何も知りませんが、設定をいくつか調整して、出力が改善するか試してみたくなりました。問題は、CPUベースの処理では質問1つに答えるのに約1分かかることです。これでは、いろいろ試すには遅すぎます。

そこで、ScalewayのGPU-3070-Sインスタンスを立ち上げることにしました。NVIDIA 3070 GPUを搭載し、GPU用VRAMを8GB備えています。CPUベースで処理するより、ずっと速くなるはずだと考えました。

LlamaファイルでGPUを使うには、LinuxにCUDAをインストールする必要があります。ところが、これが驚くほど大変でした。NVIDIAには公式の手順がありますが、非常に込み入っています。

何度か失敗した末に、NVIDIAの手順を次のように調整しました。これで、ScalewayのUbuntu 22.04 GPU最適化OSにCUDAをインストールできました。

sudo apt-get install linux-headers-$(uname -r) && \
  sudo apt-key del 7fa2af80 && \
  echo "deb [signed-by=/usr/share/keyrings/cudatools.gpg] https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /" | sudo tee /etc/apt/sources.list.d/cuda-ubuntu2204-x86_64.list && \
  wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin && \
  sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600 && \
  sudo apt-get update && \
 sudo apt-get install -y cuda-toolkit

それから、再びLlamafileをダウンロードしました。

curl -LO https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4-server.llamafile && \
  chmod 755 llava-v1.5-7b-q4-server.llamafile

そして、サーバーを起動しました。

./llava-v1.5-7b-q4-server.llamafile --nobrowser

すべて問題なく動き、サーバーログにもVMのGPUを使っていることが表示されました。画像をアップロードして質問してみると、サーバーが次のエラーでクラッシュしました。

CUDA error 2 at /home/mike/.llamafile/ggml-cuda.cu:6006: out of memory

GPU用VRAMが2倍あるScalewayのより高性能なRENDER-Sインスタンスでも試しましたが、同じようにクラッシュしました。

あるllama.cppのGitHub issueが似た状況に見え、回避策として「pinning」を無効にすればよいと書かれていたので、試してみました。

export GGML_CUDA_NO_PINNED=1
./llava-v1.5-7b-q4-server.llamafile --nobrowser

それでもクラッシュしました。

CUDAはバッチサイズが大きすぎるとRAMを使い果たすことがあるというStackOverflowのスレッドを読んだので、次のように再実行してみました。

./llava-v1.5-7b-q4-server.llamafile --nobrowser --batch-size 1

しかし、結果は同じでした。

CUDAを使ったGPUベースのLLaVA 1.5に成功

更新(2023-12-04):ついに動作させることができました。

Scalewayにサポートチケットを起票し、より高性能なGPUを使えるようにしてもらう必要がありました。ScalewayのH100-1-80Gインスタンスで試したところ、RAM 240GB、VRAM 80GBの環境ではすべて問題なく動き、CPUで実行した場合の10.6倍の速度が出ました。

GPUでLLaVAを実行すると、CPUを使う場合の10.6倍高速でした

まとめ

デフォルト設定のLLaMA 1.5では、ショーのポスターから情報を読み取るという私の用途にはうまく対応できないようです。

試したのはまだ数時間だけなので、これを可能にする設定があるのかもしれません。

今後1年で、オープンソースのAIモデルがさらに改善し、より利用しやすくなることを期待しています。

原文は Michael Lynch により に公開されました。

この記事は「gpt-5.6-terra」を使用して翻訳されました。