見出し画像

My LLMこと始め ② MacでLLava1.5


※カバー画像はBing(Image Creator)に
「Would you draw a cute lava llama with glasses ?」
と依頼して描いてもらいました。

画像を理解するLLM

LLaVA-1.5」というLLM(大規模言語モデル)が2023年10月に公開されました。
Bingに聞いたところ、10月8日にarXivに論文が投稿され、同日にモデルとコードが公開さたそうです。
GPT-4V」の発表で気になるマルチモーダル
「LLaVA-1.5」はオープンソースと知り、試したくなりました。

開発したのは、ウィスコンシン大学とマイクロソフト・リサーチ、コロンビア大学です。
早速使用した例が見つかりました。

なお、テキストや画像、音声、動画などの複数の種類の情報を一度に処理することが可能なAIをマルチモーダルAIと呼びます。
現状「LLaVA-1.5」で試せるのは画像解析です。
「GPT-4V」には音声会話機能も加わってます(使えるのは有料版)。

Jupyter Notebookで使える?

使用するパソコンのスペックは以下です。

  • MacBook Pro (14インチ、Apple 2021年モデル)

  • 10コアCPU、16コアGPUを搭載したM1 Proチップ

  • 16GB RAM、1TB SSD

なお自分はPythonについては、生成AIのサポートがないと使えないレベルです。

まず、(自分の)Pythonの基本環境である「Jupyter Notebook」で使えないか、と思いました。
(後述しますが、結局あきらめました)

よく使われている「LLaVA-1.5」のGitHubに載っているインストール方法を試します。

# Clone this repository and navigate to LLaVA folder
git clone https://github.com/haotian-liu/LLaVA.git
cd LLaVA

# Install Package
pip install -e .

上記は実行できたようです。

GPUメモリーに収まらない

問題はここからです。
ユーザーインタフェースとして「CLI Inference」を立ち上げます。
it uses less than 8GB VRAM on a single GPU」と書いてあり、比較的負荷がかからないユーザーインタフェースのようなので、実行してみます。

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

モデルのダウンロードが始まります。
10分近く待った気がします。

Downloading (…)l-00003-of-00003.bin:  97%|▉| 6.06G/6.24G [02:06<00:04, 43.0MB/s]
Downloading (…)l-00003-of-00003.bin:  97%|▉| 6.07G/6.24G [02:07<00:03, 43.4MB/s]
Downloading (…)l-00003-of-00003.bin:  97%|▉| 6.08G/6.24G [02:07<00:03, 44.6MB/s]
Downloading (…)l-00003-of-00003.bin:  98%|▉| 6.09G/6.24G [02:07<00:03, 41.2MB/s]
Downloading (…)l-00003-of-00003.bin:  98%|▉| 6.10G/6.24G [02:07<00:03, 40.9MB/s]
Downloading (…)l-00003-of-00003.bin:  98%|▉| 6.11G/6.24G [02:08<00:03, 40.0MB/s]
Downloading (…)l-00003-of-00003.bin:  98%|▉| 6.12G/6.24G [02:08<00:02, 41.5MB/s]
Downloading (…)l-00003-of-00003.bin:  98%|▉| 6.13G/6.24G [02:08<00:02, 42.4MB/s]
Downloading (…)l-00003-of-00003.bin:  98%|▉| 6.14G/6.24G [02:08<00:02, 42.5MB/s]
Downloading (…)l-00003-of-00003.bin:  99%|▉| 6.16G/6.24G [02:08<00:01, 44.6MB/s]
Downloading (…)l-00003-of-00003.bin:  99%|▉| 6.17G/6.24G [02:09<00:01, 42.2MB/s]
Downloading (…)l-00003-of-00003.bin:  99%|▉| 6.18G/6.24G [02:09<00:01, 42.9MB/s]
Downloading (…)l-00003-of-00003.bin:  99%|▉| 6.19G/6.24G [02:09<00:01, 45.1MB/s]
Downloading (…)l-00003-of-00003.bin:  99%|▉| 6.20G/6.24G [02:09<00:00, 47.3MB/s]
Downloading (…)l-00003-of-00003.bin:  99%|▉| 6.21G/6.24G [02:10<00:00, 50.0MB/s]
Downloading (…)l-00003-of-00003.bin: 100%|▉| 6.22G/6.24G [02:10<00:00, 49.7MB/s]
Downloading (…)l-00003-of-00003.bin: 100%|▉| 6.23G/6.24G [02:10<00:00, 50.6MB/s]
Downloading (…)l-00003-of-00003.bin: 100%|█| 6.24G/6.24G [02:10<00:00, 47.7MB/s]
Downloading shards: 100%|████████████████████████| 3/3 [08:57<00:00, 179.06s/it]
Downloading (…)lve/main/config.json: 100%|█| 4.76k/4.76k [00:00<00:00, 1.63MB/s]

終わった、と思ったらエラーが出ました。

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/Users/xxxxx/LLM/LLaVA/llava/serve/cli.py", line 125, in <module>
    main(args)
  File "/Users/xxxxxLLM/LLaVA/llava/serve/cli.py", line 32, in main
    tokenizer, model, image_processor, context_len = load_pretrained_model(args.model_path, args.model_base, model_name, args.load_8bit, args.load_4bit, device=args.device)
                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/xxxxx/LLM/LLaVA/llava/model/builder.py", line 103, in load_pretrained_model
    model = LlavaLlamaForCausalLM.from_pretrained(model_path, low_cpu_mem_usage=True, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/anaconda3/lib/python3.11/site-packages/transformers/modeling_utils.py", line 2842, in from_pretrained
    raise ValueError(
ValueError: 
                        Some modules are dispatched on the CPU or the disk. Make sure you have enough GPU RAM to fit
                        the quantized model. If you want to dispatch the model on the CPU or the disk while keeping
                        these modules in 32-bit, you need to set `load_in_8bit_fp32_cpu_offload=True` and pass a custom
                        `device_map` to `from_pretrained`. Check
                        https://huggingface.co/docs/transformers/main/en/main_classes/quantization#offload-between-cpu-and-gpu
                        for more details.

「Bard」に聞いたところ、

エラーメッセージは、LlavaのモデルをGPUメモリに収めることができないことを示しています。このエラーを解決するには、以下の方法があります。

1. GPUメモリを増やす。
2. モデルを8ビット量子化にして、メモリ使用量を減らす。
3. CPUまたはディスクでモデルを実行する。

Bard

という回答でした。
上記で試したのは70億パラメータバージョンの「llava-v1.5-7b」です。
この前に130億パラメータの「llava-v1.5-13b」を使い同じエラーを出しています。
サイズの小さいモデルでやり直したのですが、ダメでした。

Juypter Notebookでなく、ターミナルを使うべきだったのかもしれません。
ただ、Pythonの実行環境を複数扱うほど慣れていないので、比較的手間のかからない手段をが望ましいのです。

Hugging Faceにggml版発見

さてどうしましょう。
調べたところ、Macで動かしたケースを見つけました。

目に留まったのは「ggml」形式のモデルがあるということ。
上記にで紹介しているGitHubの「ggerganov/llama.cpp」に入手先のリンクがありました。
Hugging Faceから入手できます。

試しに70億パラメータ(7b)の「ggml-model-q4_k.gguf」をダウンロード。
text-generation-webui/modelsフォルダに配置します。

text-generation-webuiを使おう

思いついたのは先日使用した「text-generation-webui
llama.cpp」で使われているggmlやgguf形式などのLLMとの対話用ユーザーインタフェースを提供するツールです。
(現在はggmlから新フォーマットのggufへの切り替えが進んでいるようです)

text-generation-webuiを起動します。
(移動についてはこちら参照

% python one_click.py
・・・
Running on local URL: http://127.0.0.1:7860

ブラウザで「http://127.0.0.1:7860」を開き、「Model」タブから「ggml-model-q4_k.gguf」を選択します。

Modelタブのドロップダウンメニューから指定

Load」ボタンをクリックしてセット完了です。

質問開始。画像をどう渡す?

Chat」タブに移動し会話を開始します。
LLava1.5のデモツールでは画像をドラッグして質問できます。
text-generation-webuiにはそのインタフェースがないのでどうなる?と思いながら進めました。

text-generation-webui

AI

How can I help you today?

You

あなたは誰ですか?

AI

私は Assistant と呼ばれる人工知能です。どのようにお手伝いできますか?

You

画像の説明ができますか?

AI

Yes, I can describe images for you. Please provide the image or describe it to me and I will do my best to help you.
(Google翻訳:はい、画像について説明させていただきます。画像を提供していただくか、説明してください。最善を尽くしてお手伝いいたします。)

You

画像を提供する方法を教えてください。

AI

Sure! You can either upload the image file to a cloud storage service like Google Drive, Dropbox, or OneDrive and share the link with me, or you can describe the image to me in text.
(もちろん!画像ファイルを Google Drive、Dropbox、OneDrive などのクラウド ストレージ サービスにアップロードしてリンクを共有することも、テキストで画像を説明することもできます。)

You

Ok, I'll share link "https://llava-vl.github.io/static/images/view.jpg".

AI

Thank you for sharing the link! Please let me know if there is anything else I can help with.

You

Could you please explain the image in the link?

AI

Certainly! The image depicts a beautiful view of a mountain range during sunset. The sky is filled with warm, vibrant colors as the sun dips below the horizon. The mountains are covered in lush greenery and tower over the surrounding landscape. It's a picturesque scene that captures the beauty of nature.
(この画像は、日没時の山並みの美しい景色を描いています。太陽が地平線に沈むと、空は暖かく鮮やかな色で満たされます。山々は豊かな緑に覆われ、周囲の風景にそびえ立っています。自然の美しさを捉えた美しい景色です。)


日本語でのフル回答は現状無理そうです。
リンクの画像については、LLavaのデモで使われているものです。
湖についてのコメントがありませんでしたが、画像を説明する機能はあるようです。

「普通じゃない」を理解してくれる

Llava1.5のデモツールで使っているもう1つの画像を使ってみます。


You

次はこのリンクの画像です。

https://llava.hliu.cc/file=/nobackup/haotian/code/LLaVA/llava/serve/examples/extreme_ironing.jpg

What is unusual about this image ?
(この画像の何が異常ですか?)

AI

This image is quite unique because it features a person doing an extreme version of ironing, which is typically done with regular household appliances like a steam press or an iron and board. Instead, the person in the image is using two hair dryers to help get out wrinkles from a shirt. It's unconventional and humorous to see someone using such an unusual method for ironing clothes.
(この画像は、通常スチーム プレスやアイロンとアイロン台などの一般的な家庭用電化製品を使用して行われるアイロンがけの極端なバージョンを行っている人を描いているため、非常にユニークです。代わりに、画像内の人物は 2 台のヘアドライヤーを使用してシャツのシワを伸ばしています。アイロンがけにこのような珍しい方法を使用している人を見るのは、型破りでユーモラスです。)


「2台のヘアドライヤー」がどこから来たのかわかりませんが、アイロンは認識しています。

「注意事項」を教えてくれる

もう一度湖の画像を使い、LLavaのデモと同じ質問をしてみます。


You

Look at this image.
https://llava-vl.github.io/static/images/view.jpg
What are the rhings I should be cautious about when I visit the place ?
(この場所に行く際に気をつけるべきことは何ですか?)

AI

When visiting this beach location shown in the image, you may want to take into consideration factors such as sun protection (sunburn can be a concern at the beach), bringing proper swimming attire if planning to go into the ocean or pool, and also being mindful of personal safety while on the beach by staying within designated areas and being aware of any local regulations. Additionally, it would be helpful to have information about nearby amenities such as restrooms, showers, and food options for a more enjoyable experience.
(画像に示されているこのビーチの場所を訪れる際は、日焼け対策 (ビーチでは日焼けが心配になる場合があります)、海やプールに入る予定がある場合は適切な水着を持参すること、また、ビーチにいる間は指定されたエリア内に留まり、現地の規制に注意することで個人の安全に留意してください。また、周辺にあるトイレやシャワー、食事などの施設情報もあれば、より快適に過ごすことができます。)


テキスト生成モデル「ELYZA」を利用

これまでの会話はLLavaだろうか?
と疑問がよぎり、他のモデルに切り替えてみました。
text-generation-webuiには複数種類のLLMモデルを使えるようにしています。
前に取得した「ELYZA-japanese-Llama-2-7b-fast-instruct-q4_K_M.gguf」に切り替えました。
日本のELYZA社が公開したモデルです。
Metaの「Llama 2」をベースとした商用利用可能な日本語LLMです。


You

この画像を見てください。
https://llava-vl.github.io/static/images/view.jpg
この場所に行く際に気をつけるべきことは何ですか?
いくつかの注意事項を考えました。

AI

まずは、車を降りて歩く際は十分に周囲の確認をしましょう。自動車の存在には常に気を付けた方がいいです。また、夜のドライブの際は前方を明るく照らすと危険ですので、手元に光源を置いた方が良いでしょう。さらに、雨が降っているときは滑りやすいので注意が必要です。


画像を認識してくれているようですが、解釈はイマイチ。
画像解析用の追加学習をしているかどうかの差でしょうか。
モデルの切り替えはうまくできているようなので、LLavaを使えていたようです。
リンク先の画像を読み組むのは、ベースのLLMであるLlama 2が持っている機能かもしれません。

ベースモデル「Llama 2」を利用

と考え、「llama-2-7b-chat.Q4_K_M.gguf」に切り替えました。


You

Look at this image.
https://llava-vl.github.io/static/images/view.jpg
What are the rhings I should be cautious about when I visit the place ?

AI

Hello! That's a beautiful image of a scenic coastline. When it comes to visiting such places, there are several things you might want to keep in mind for a safe and enjoyable trip. Here are some suggestions:

  1. Check weather forecasts: Before heading out, make sure to check the weather forecast for the area you'll be visiting. This will help you pack accordingly and avoid any potential risks associated with inclement weather.

  2. Respect local customs: When traveling to new places, it's essential to respect local customs and traditions. Research the culture of the place you're visiting and try to blend in as much as possible. This will help you avoid any misunderstandings or uncomfortable situations.

  3. Stay hydrated: When traveling, especially in hot climates, it's crucial to stay hydrated by drinking plenty of water throughout the

(こんにちは!美しい海岸線のイメージですね。そのような場所を訪れる場合、安全で楽しい旅行のために心に留めておきたいことがいくつかあります。以下にいくつかの提案を示します。

  1. 天気予報を確認する: 出かける前に、訪問する地域の天気予報を必ず確認してください。これは、適切に荷造りし、悪天候に伴う潜在的なリスクを回避するのに役立ちます。

  2. 地元の習慣を尊重する: 新しい場所に旅行するときは、地元の習慣や伝統を尊重することが不可欠です。訪問先の文化を調べて、できるだけ溶け込むように努めてください。そうすることで、誤解や不快な状況を避けることができます。

  3. 水分補給を続ける: 旅行中、特に暑い気候では、滞在中ずっと水をたくさん飲んで水分補給を続けることが重要です。)


湖でなく海と認識していますが、詳細に回答してくれました。

今回使ったLLavaとLlamaは、推論を効率化・高速化する(量子化と呼ぶそうで、その)方法が異なるかもしれないので、一概に比較はできなさそうです。
使う画像によってLLavaの優位点がはっきりわかるかもしれません。
新フォーマットのgguf版があれば、精度も変わる可能性があります。
今度は130億パラメータのモデルで試そうと思います。
ただ、LLMのモデルを手当たり次第にダウンロードすると、すぐに数百Gバイトを超えそうです。
加えて、学習が更新されたモデルがすぐ出る動きの速い分野。
使うモデルは絞っていきたいと考えています。
VRAMを十分に積んだWindowsマシンが欲しくなりました。


(後日談)
LLava1.5の130億パラメータのモデル(ggml)を使ったところ、数行の回答に5分以上待ちました。
文章生成能力が向上したのかを確認するまでに至りませんでした。
遅が気になり、Macのアクティビティモニタを見たとこr、GPUが動いてないことがわかりました。
調べてみると、text-generation-webuiはMacのGPUを生成処理に使えないという事実。
Appleが提供するグラフィックスAPI「Metal」を使うなどの隠し技(?)があるようですが、自分のスキルでは足踏みしてしまいます。
M1チップに最適されるまでにまだ時間がかかりそうです。
Windowsマシンはすぐには買えないので、「Google Colaboratory」の有料版を使おうと考え始めています。


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