Llama.cppでVision機能が利用可能に!
引用元:https://news.ycombinator.com/item?id=43943047
MBP M1 64GBで ggml-org/gemma-3-4b-it-GGUF を試したら、結構速いし4Bでもそこそこ画像説明してくれる。
使うにはまず GitHubから取ってビルドして、モデルDLしてサーバ起動する。
手順はコマンド書いといたよ。
Web UIは http://127.0.0.8080/。
-hf なしなら –mmproj オプション忘れずに。
unsloth のモデルはもっと速そう。
どんな画像試しても、”この画像には、帽子をかぶった男性、車椅子の女性、大きな頭の子供、スーツ姿の男性、帽子をかぶった女性など、様々なポーズをとった多様な人々が映っています。”って同じ応答が返ってくるんだけど。
いやいや、どれも画像には写ってないし。
どうやってデバッグ始めればいいのかも分かんないよ。
自分も同じだよ。
どの画像アップしても、代わりにこんなメッセージが出てくるんだ。
”これは、「one does not get it」というフレーズを嘲笑的に使ったユーモラスなミームです。これは、冗談やミームの文脈が理解できずにイライラする人々についてのジョークです。”
なんで動かないのか分かんないなあ。
よし、このスレッドのこのコメントを試したら、問題が解決したよ!
https://news.ycombinator.com/item?id=43943624
これって、実際の画像が見れてないってことじゃない?
何か理由があって読み込めてないんだよ。
画像が見えてないだけで、なんで例えば「何も見えない」とか「視覚的な解釈ができない意味不明なもの」じゃなくて、あんな具体的でおかしな出力になるのか想像つかないな。
そんなの、使う側としては最悪だよね。
LLMって、「役に立てない」って言うのが苦手なんだ。
helpful assistantになるように訓練されてるから、画像が見えてないのに何かでっち上げちゃう(ハルシネーション)。
もう今となっては、そういうもんだと思ってていいよ。
学習データに制御が入ってないってこと?
面白い事実として、何も入力しないでLLMにプロンプト送っても、適当な意味不明なのが出てきたりするんだぜ。
あと、temperatureをゼロに設定すると、毎回同じ出力になるんだ!
うーん、俺も同じ結果だなー。でもさ、M1で7b model使うと、プロンプト処理が10倍くらい速くなるって話らしいよ。このGitHubディスカッション見てみて。https://github.com/ggml-org/llama.cpp/discussions/4167もしかしてencoderの最適化がまだなのかな?
それって4/8 bit quantsの話?それともフル精度のfp16 modelでの数字?
4 bit quantの gemma-3-4b-it-Q4_K_M.gguf を使ってるよ。promptは”describe”とか、短くしたい時は”short description”だよ。
君が写真家ってことで、君のサイトの写真を使ってみたら gemma 4bが具体的な説明を出して、それが結構正確だったんだ。
使った写真は zamadatixのサイトの L’Officiel.02シリーズ(L-officel_lanz_08_1369.jpg)からだよ。
俺は写真家じゃないけど、例はありがとう!写真はこちら:https://payload.cargocollective.com/1/15/509333/14386490/L-o…
説明は完璧じゃないね。建物も丘陵もドレスも違う点がある。
4 GB modelだし文句はないけど。quantに関する質問は速度のことだよ。大きいmultimodal modelはもっと正確だった(例:”wooden and stone rustic structure”)。
ちなみに、画像処理は別のmodelが画像を読み込んで1000 tokenくらい生成してるよ。
(vision機能はllama.cppに前からあったけど、メンテしてたから分かる、めっちゃ大変だったんだ)
今回のこれは素晴らしい仕事だよ。vision codeはリベースとかリファクタリングが必要だったから、新しいのが出たのは大歓迎だね。
待ってごめん、これどういう仕組み?
gemma3は siglipを使って256 embeddingsを並列出力できると思ってたんだけど。
codeのポインタとかあれば共有してもらえる?
この https://github.com/ggml-org/llama.cpp/blob/master/tools/mtmd… を見つけたけど、正しいcode pathか分からなくて。
promptに基づいて生成された画像の例とかある?
試す前に見てみたいな。
はっきりさせとくけど、このmodelは画像を生成してるんじゃなくて、送られてきた画像を説明してるんだよ。
めっちゃうまく動くよ!llama.cppをsourceからcompileして llama-mtmd-cli をゲット。
vision対応quant modelで試してみて。例えばこれ実行してみて:
./llama.cpp/llama-mtmd-cli -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL -ngl -1
チャットで /image image.png で画像を読み込んでchat!
追記:-ngl -1 は Metal backends ではもう不要(CUDAは必要)。llama.cppがdefaultでGPUに自動offloadするようになったよ!
参考になれば、https://docs.unsloth.ai/basics/gemma-3-how-to-run-and-fine-t… のdocumentを更新したよ。llama-mtmd-cli を直接使えるって書いてあるから。Mistral Smallでも動くはずだよ。
LLaMAをデスクトップで動かして、ノートPCからアクセスできる簡単なGUIってある?
もしMac使ってるなら、https://recurse.chat/試してみて.モデルダウンロードしてチャット始めるだけってくらい簡単だよ.Llama.cppの新しいマルチモーダルサポートも入ったばっか.
https://docs.openwebui.com/ を見てみてよ.デスクトップのIP使えば、ノートPCからアクセスできるよ(同じネットワークにいるならね).
それってollamaとそれをサポートするクライアントでよくない? tailscale使って内部ネットワーク組むとマジでうまくいくよ
もしHomebrewでLlama.cppをインストールしたら、llama-mtmd-cliはもう含まれてるよ.だから、ただ llama-mtmd-cli <args> って実行するだけでいいんだ.
OK、実は -ngl 99 を使う方が良くて、-ngl -1 は良くないね.-1は動くかも動かないかも!
あー、それってGPUにオフロードするレイヤー数の省略形だよ :) でもまあ、最高の略語じゃないかもね.
SmolVLMシリーズもサポートしてるよ!ミニサイズだから爆速レスポンスなんだ!リアルタイムホームビデオ監視システムにピッタリだね。これ次の趣味プロジェクトのアイデアの一つだよ!
llama-server -hf ggml-org/SmolVLM-Instruct-GGUF
llama-server -hf ggml-org/SmolVLM-256M-Instruct-GGUF
llama-server -hf ggml-org/SmolVLM-500M-Instruct-GGUF
llama-server -hf ggml-org/SmolVLM2-2.2B-Instruct-GGUF
llama-server -hf ggml-org/SmolVLM2-256M-Video-Instruct-GGUF
llama-server -hf ggml-org/SmolVLM2-500M-Video-Instruct-GGUF
定期的にpullしてリビルドするたびに、最新のgitコミットであなたのコミットに気づいてたんだ。これ(そしてLlama.cpp全般)でのあなたの全ての作業に感謝してるよ!
サーバーにmtmd機能を取り込んでくれてありがとう。他のコメントしてくれた人みたいに、期待してコミットをずっと追ってたんだ。
もっとコメントを表示(1)
うん、でも高速レスポンスの質はどうなの?2.2B以下のやつでも、ちゃんと筋の通った文章出せるの?
これまでに見つけた中で、これが一番分かりやすいドキュメントだよ: https://github.com/ggml-org/llama.cpp/tree/master/tools/mtmd…
アーキテクチャ固有の画像埋め込み前処理を別のライブラリに切り出したのは面白いね。text-onlyのTransformerでhuggingface/tokenizersライブラリができたのと似てるかも。
この機能を使って、最近の旅行写真にGemma3 4bでキーワードとか説明を付けたんだ。すごい上手くいったよ、テキストの入った写真のOCRで概要出してくれたり、文脈から写真の場所を推測したりもできた。自分でホストできるのはめっちゃいいね。
それはすごいね。要は、画像のリストをループして、それぞれの画像に対してプロンプトを実行して、結果をどこか(メタデータとかsqliteとか)に保存してるってこと?
うん、そうだよ。それぞれの画像を同じプロンプトでループして、結果をSQLiteに保存してるんだ。検索したり、将来的にWebUIで見せたいなと思って。
コードはこれだよ: https://gist.github.com/Q726kbXuN/…
一枚の画像の出力例はこれ: https://imgur.com/a/6jpIbvk
POCコードで汚いけど動くよ。
いいね! フォルダに入ってる全部の写真のサマリーを作るのって、どれくらい難しいと思う?例えば旅行の写真とか、イベント後の写真とか、写真がまとまってる場合。
めっちゃ簡単だよ。各画像の詳細を出して、そのサマリーから全体のサマリーを作るか、全部の画像をまとめて放り込むかできるよ: https://imgur.com/a/1IrCR97
画像が多いと文脈の限界でmap-reduceが必要だろうけど、それも難しくないと思う。
写真のexifデータから場所を抽出して、プロンプトに含めるのも良いかもね。座標を受け取って都市名を返す逆ジオコーディングのライブラリやサービスがあるから、旅行のサマリーがもっと良くなるはずだよ。
Gemma 4bってこの用途に十分なの?僕は4bじゃダメだと思って、もっと大きいGemmaを色々試してたんだ。
使ってみた感じだと、俺の用途には十分良さそうだったよ。
ネットで見つけた適当な画像をいくつか食わせてみたんだけど、どんな感じのメタデータが出るかは、ここの静的ダンプで見れるよ:https://q726kbxun.github.io/llama_cpp_vision/index.html
完璧ってわけじゃないけど、キーワードとか説明文のおかげで、たくさんの画像の中から探すのには十分役に立ちそう。
llama.cppはいろんなプラットフォーム用にコンパイル済みのリリースを提供してるんだ。
今回のリリースに新しいvision機能が入ってるよ:https://github.com/ggml-org/llama.cpp/releases/tag/b5332
macOSだと、llama-b5332-bin-macos-arm64.zipをダウンロードして、動かすにはこれを実行する必要があったんだ。
unzip llama-b5332-bin-macos-arm64.zip
cd build/bin
sudo xattr -rd com.apple.quarantine llama-server llama-mtmd-cli *.dylib
そしたら、対話型ターミナル(3.2GBのモデルダウンロードが必要)をこうやって実行できたよ(参考:https://news.ycombinator.com/item?id=43943370R)
./llama-mtmd-cli -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL -ngl 99
もしくは、localhost 8080のウェブサーバー(UIとAPI付き)をこうやって起動できたよ:
./llama-server -hf unsloth/gemma-3-4b-it-GGUF:Q4_K_XL -ngl 99
もっと詳しいメモはここに書いたよ:https://simonwillison.net/2025/May/10/llama-cpp-vision/
brewユーザーなら、パッケージインストール時に–HEADを指定できるよ。
こうすれば、brewが自動的に最新のmasterブランチをビルドしてくれるんだ。
そういえば、brewのバージョンはあと数時間で更新されるから、その後は単に“brew upgrade llama.cpp”すれば準備OKになるよ!
俺もconvert_hf_to_gguf.py –mmprojには超感動したよ!
これでvisionモデルの量子化がずっと簡単になった!
Llama-serverがvisionをサポートしたのも間違いなく超クールだね。
しばらく待ってたんだ!
そういえば、-nglは今自動で最大値に設定されるから、もう-ngl 99ってつける必要ないよ!
追記:ごめん、これはMetalだけだわ。
CUDAとか他のGPUバックエンドの場合は、まだ手動で-nglを指定する必要があるよ。
え、マジで!
じゃあ単に-nglでいいの?
あ、あと、1つのGPUが終わったら次のGPUに(つまり順番に)自動で割り当てることってできるか知ってる?
俺は小さいモデルでも手動で–device CUDA0って設定しなきゃいけないんだけど、たぶん全部のGPUに分散させると通信オーバーヘッドがあるだろうし!
あー、いや、俺が言いたいのは、今は“-ngl N”っていう引数自体を省略できるってことなんだ。
CPPコードの中でデフォルトで-1(伝統的な0じゃなくて)に内部設定されてて、-1は全部GPUにオフロードするって意味だから。
マルチGPUでカスタムレイヤー設定を指定する方法は全然わからないけど、それは興味深いね!
え、待って!
じゃあGPUオフロードがデフォルトでオンなの?
おお、最高だね!
今のところPythonスクリプトで”推測”しなきゃいけないんだ。
つまり、全部の.gguf分割ファイルのファイルサイズを合計して、CUDAメモリ使用量を検出して、おおよそいくつのGPUに割り当てるか、つまり–device CUDA0,CUDA1みたいに指定してるんだ。
あーー、ごめん、これを実際に制御してるコードがllama-model.cppの中にあるって忘れてたわ。
間違った情報ごめん。
-nglがデフォルトで最大値に設定されるのは、Metalバックエンドを使ってる場合だけだ。
(llama_model_default_params()の中のコードを見てね)
素人向けに何が変わったの? 数ヶ月前にllama.cpp試した時、もう画像説明とかできたけど?
これ、ollamaでgemma3みたいなマルチモーダルモデル使うのとどう違うの?Macのapple siliconだと何かメリットある?誰か経験談教えてくれると嬉しいな
二つあるよ。
1.llama.cppはggmlエコシステムに統合されてるから、ollamaよりずっと速く最適化できるんだ。pixtral/mistral small 3.1の2D-RoPEとか、すぐ追加されるflash attentionでメモリも少なく済む。
2.ollamaより多くのモデルをサポートしてるよ。pixtralもsmolvlmもollamaはサポートしてないんだ。
一方で、ollamaはgemma3でiSWAをサポートしてるけど、llama.cppはしてないんだ。iSWAはkv cacheのサイズを1/6にするんだよ。
iSWAって何?ネットで全然見つからないんだけど
gemma3には文脈サイズが1024トークンのレイヤーもあれば、フル長のレイヤーもあるんだ。gemmaの技術レポート読む必要があるよ。
interleaved sliding window attentionだよ
この変更って、最終的にollamaにも追加されるんじゃないの? ollamaってllama.cppベースだと思ってたんだけど。
僕の理解だと(関係者じゃないけど、コード見た感じ)、ollamaは最初は全部llama.cppをランナーとして使ってたみたい。でも新しいモデルのために自分たちでGolangでランナーを書き始めたんだ。だから、ほとんどのモデルはllama.cppだけど、新しいやつは彼らのGolangランナーなんだよ。
そういえば - llama.cppのvisionサポート、今回も素晴らしい出来だよ - この調子で頑張ってね!!
Danielさんありがとう!量子化の素晴らしい仕事に拍手だよ、開発中にunslothのMistral Small IQ2_Mを使ってるんだけどめちゃくちゃよく動くんだ!!
もっとコメントを表示(2)
へへへ、Mistralのチャットテンプレートを更新しなきゃいけなかったんだよね−あなたのllama.cppのPRは見たよ−tokenizer_config.jsonファイルにchat_templateがないのが紛らわしくて、chat_template.jinjaにあったんだ。chat_templateをtokenizer_config.jsonに移さなきゃいけなかったんだけど、あなたの修正で今は大丈夫になったと思うよ。
へぇー、いい情報だね!誰かがチャットテンプレートを直そうとしてるだろうなって思ってたよ、ははは。でも、GGUF−my−repoスペース経由でユーザーが自由に自分のquantsを作れるようにしてるから、そのソースから生成されるquantsも直さなきゃいけないんだ。
UI開発でVision機能を活用できるツールって何かあるかな?例えば、趣味でTS/Reactでフロントエンドを開発してるんだけど、VSCodeでローカルやクラウドのLLMを使ってもVision付きでもスクショ撮ってチャットに貼り付けなきゃいけないんだ。理想的には、何らかの停止条件(たとえn回繰り返しだけだとしても)を満たすまで全部自動化したいな。でも、プレビューをスクショしてチャットに貼り付けるだけの拡張機能(キーボードショートカットで起動)でもすごく時間短縮になると思うんだけど。
これはすごいね。定期的にプルしてリビルドしてたんだけど、コミットノートを見ててさ(たぶんngxsonさんたちが)、最初はVisionモデルをそれぞれ独自のCLIプログラムで追加して、それから一つのCLIプログラムに統合して独立した方を非推奨にして、バグ修正や画像処理の改善も続けてたんだ。サーバーサポートもいつか追加されるんじゃないかって期待してたんだけど、ついに来たね!ありがとう!
また一歩進んだ感じだね。初めてスマホでローカルLLMを動かして、結構まとまった会話ができた時、エッジ推論は少なくとも個人的なアシスタントとか”デジタルワイフ”みたいなビジネスケースで本当に早く離陸するだろうなって想像したんだ。Llama.cppとその派生技術の上に構築される次の波のアプリが、今後3ヶ月で世界経済に何をもたらすか興味津々だよ。
”3ヶ月での世界経済”なんて話は、最近のAIブームが3年経ってもまだ換金できてない小切手を書いてるようなもんだよ。
AIは集合知の確率分布を学習してるけど、サンプリングだけじゃ根本的な向上はないと思うんだ。高品質なデータがなければ、AIはどんどん訓練コストが高くなって、1980年代のエキスパートシステムに戻っちゃうかも。最近のAIイノベーションは停滞してるけど、分布を活用するツール(セマンティック検索とか)としては素晴らしいよ。これがAGIへのアプローチかは疑問だけどね。
それは”確率的なオウム”みたいに単純じゃないよ。定義と公理から始めて、全ての定理は発明して証明できるはずなんだ。モデルをループに入れて、内部的な”思考”と外部フィードバック、生成・取得した新しいデータを使わせるのが進むべき道だと思う。データを定期的に圧縮すれば、またアルゴリズム競争が始まるね。
「定義や公理から始めて、すべての定理を発明し証明できる」って考え方は、symbolic AIの前提だったけど、このやり方はもう捨てられちゃったみたいだね。
大きな経済的影響を与えるのに、AGIである必要はないよ。単に、今ある十分な数のCAPTCHAを破れればいいんだ。
それ、もう今日できてるよ。
やっとだ!Open source multimodalは、closed source optionsに比べてあまりにも遅れてて、みんなベンチマークすら試そうとしないんだ。まだ、新しいモデルが出るたびにテキストとか数学のテストばっかやってる。だって、ひどすぎるからね。
llama.cppって、去年くらいにVisionサポートあったんじゃなかったっけ?
そうだよ、ずっとあったんだ。でも”llama-mtmd-cli”って1つの傘下に全部移されたんだよ!
そうそう、でも今回は汎用化されたから、llama-serverのGUIにも追加できるようになったんだよ。
multimodal LLMを彼らのVulkanバックエンドで実行するのって可能?Vulkanしかサポートしてない4gbのGPUがいっぱい転がってるんだ。
うん、llama.cppはVulkanのサポートがすごくいいよ。
少し前にVisionが削除された時は本当に悲しかったよ。復活してくれて嬉しい。関係者の皆さんに感謝!