JoyCaptionをllama-serverで動かして画像キャプショニングする(GPUメモリ6GBでもOK)
はじめに
つい2日前(2025年12月17日)に『JoyCaptionのNF4量子化モデルを使って画像キャプショニングする(GPUメモリ16GB環境対応)』という記事を書きました。
その後、llama.cppのllama-serverを使ってJoyCaptionを簡単に動かすことができたので、改めて記事を書いています。
「JoyCaptionがどんなものか」については、前回の記事を参照ください。
使用した量子化モデル
今回は、以下の量子化モデルをllama-serverに読み込むことで、JoyCaptionを使った画像キャプショニングを行うことができました。
KoboldCpp用に作成されたGGUFファイルのようですが、llama-serverでも問題なく動作しました。作者様に感謝です。
環境
今回は以下の2つの環境で試し、どちらでも動作しました。GPUメモリ6GBの環境でも動作するのは嬉しいですね。
- ホストA:
- CPU: AMD Ryzen 7 3700X(8コア/16スレッド)
- メモリ: 64GB
- GPU: NVIDIA GeForce RTX 4080(16GB)
- OS: Ubuntu 24.04.3 LTS
- NVIDIAドライバ: 570.195.03
- ホストB:
- CPU: Intel Core i7 13620H(10コア/16スレッド)
- メモリ: 64GB
- GPU: NVIDIA GeForce RTX 4050(6GB)
- OS: Ubuntu 22.04.5 LTS
- NVIDIAドライバ: 580.105.08
なお、今回はDocker版かつCUDA版のllama.cppを使用しました。バージョンなどは以下の通りです。
$ docker run --rm --gpus all ghcr.io/ggml-org/llama.cpp:server-cuda --version
ggml_cuda_init: GGML_CUDA_FORCE_MMQ: no
ggml_cuda_init: GGML_CUDA_FORCE_CUBLAS: no
ggml_cuda_init: found 1 CUDA devices:
Device 0: NVIDIA GeForce RTX 4080, compute capability 8.9, VMM: yes
load_backend: loaded CUDA backend from /app/libggml-cuda.so
load_backend: loaded CPU backend from /app/libggml-cpu-haswell.so
version: 7444 (58062860a)
built with GNU 11.4.0 for Linux x86_64
モデルのダウンロード
モデルファイルのダウンロード方法は以下の通りです。
使用した量子化モデルはF16、Q8_0、Q4_Kの3種類が公開されていますが、今回はQ8_0、Q4_Kの2種類を試しました。
なぜかJoyCaptionモデル本体は大文字のL、Projectorモデルは小文字のlで始まっているので、ファイル名を指定するときには注意が必要です。
# Projectorモデル(Q8_0、Q4_Kのどちらを使う場合も必要)
$ wget https://huggingface.co/concedo/llama-joycaption-beta-one-hf-llava-mmproj-gguf/resolve/main/llama-joycaption-beta-one-llava-mmproj-model-f16.gguf
$ sha256sum llama-joycaption-beta-one-llava-mmproj-model-f16.gguf
94002cb5c354c7c9e538e64f37d593db9eceeca2e94573bae6cd3b2bd8bb1952 llama-joycaption-beta-one-llava-mmproj-model-f16.gguf
# Q8_0: 8ビット量子化モデル
$ wget https://huggingface.co/concedo/llama-joycaption-beta-one-hf-llava-mmproj-gguf/resolve/main/Llama-Joycaption-Beta-One-Hf-Llava-Q8_0.gguf
$ sha256sum Llama-Joycaption-Beta-One-Hf-Llava-Q8_0.gguf
914fccbc28d0bdf87bab2937f58707bbc33556021664cd16a9666607d4058b99 Llama-Joycaption-Beta-One-Hf-Llava-Q8_0.gguf
# Q4_K: 4ビット量子化モデル
$ wget https://huggingface.co/concedo/llama-joycaption-beta-one-hf-llava-mmproj-gguf/resolve/main/Llama-Joycaption-Beta-One-Hf-Llava-Q4_K.gguf
$ sha256sum Llama-Joycaption-Beta-One-Hf-Llava-Q4_K.gguf
e8ae55dd07e61d541ab741d6ed63e7810192cea65d7ef8cda69b2a99fb06dc15 Llama-Joycaption-Beta-One-Hf-Llava-Q4_K.gguf
llama-serverの実行
llama-serverの実行方法は以下の通りです。事前にDocker、NVIDIAドライバ、NVIDIA Container Toolkitを導入しておく必要があります。
--modelオプションにJoyCaptionモデル本体を、--mmprojにProjectorモデルをそれぞれ指定してください。(以下はカレントディレクトリにGGUFファイルがある場合の例です)
# Q8_0: 8ビット量子化モデル
$ docker run --rm --gpus all -p 8080:8080 -v $(pwd):/models ghcr.io/ggml-org/llama.cpp:server-cuda \
--model /models/Llama-Joycaption-Beta-One-Hf-Llava-Q8_0.gguf \
--mmproj /models/llama-joycaption-beta-one-llava-mmproj-model-f16.gguf \
--port 8080 --host 0.0.0.0
# Q4_K: 4ビット量子化モデル
$ docker run --rm --gpus all -p 8080:8080 -v $(pwd):/models ghcr.io/ggml-org/llama.cpp:server-cuda \
--model /models/Llama-Joycaption-Beta-One-Hf-Llava-Q4_K.gguf \
--mmproj /models/llama-joycaption-beta-one-llava-mmproj-model-f16.gguf \
--port 8080 --host 0.0.0.0
推論速度
以下のプロンプト、画像を入力した場合の推論速度はそれぞれ以下の通りでした。
なお、測定に際してはllama-serverのウェブUIから3回推論を実行し、最も早かった結果を記載しています。(測定結果は概ね安定していました)
- プロンプト: Write a long detailed description for this image.
- 画像: 1000x986ピクセル
| ホスト | GPU | Q8_0 |
Q4_K |
|---|---|---|---|
| ホストA | NVIDIA GeForce RTX 4080(16GB) | 77.99 tokens/sec | 124.58 tokens/sec |
| ホストB | NVIDIA GeForce RTX 4050(6GB) | 10.63 tokens/sec | 25.18 tokens/sec |
Q8_0でもそれなりの速度で動作しているので、少しでも高い精度を求めるのであればQ8_0が良さそうです。
出力例
具体的なキャプショニングとタグ付けの出力例は以下の通りです。今回はPixabayの写真をお借りしました。

キャプショニング
プロンプト: Write a long detailed description for this image.
This is a digitally altered photograph featuring a bearded man in a blue patterned suit and tan hat, kneeling on a sunlit concrete sidewalk. He is extending his right hand to touch the nose of a small, tan-colored Labrador Retriever wearing a black harness. The dog is standing on its hind legs, reaching up with its right paw. The background includes blurred, historic-style buildings with beige and gray exteriors, and a patch of grass in the left corner. The image has a surreal, almost painterly quality with exaggerated colors and textures, particularly the man's suit and the dog's fur. The photograph has gray borders on the top and bottom.
入力した写真には女性が写っていますが、なぜか男性と認識されてしまっていますね。その他にも「んん?」と思える箇所がいくつかあります。
プロンプトについては公式サイトに具体例が色々と記載されているので、ターゲットに合わせて調整するのが良さそうです。
上記の出力をそのままNano Banana Proに入力すると、以下のような画像が生成されました。

うーん、まあ、元の写真の雰囲気は伝わってきますね。それにしてもNano Banana Proの描写力、凄いです。
タグ付け
プロンプト: Write a list of Booru-like tags for this image.
photograph, digital manipulation, surreal, dog, small dog, brown and white dog, harness, kneeling man, elderly man, white beard, brown hat, blue patterned robe, gray pants, white shoes, sunlight, street, old building, gray building, white window, brown door, textured pavement, shadow, high contrast, hyper-realistic, surreal style, touching hands, interaction, friendly gesture, daytime, outdoor setting, urban environment, artistic composition, visual contrast, human-animal bond, warm colors, detailed textures, stylized elements
こちらも男性と誤認していますが、それっぽいタグが並んでいます。
おわりに
動かすのに四苦八苦したJoyCaptionですが、llama-serverであればあっさりと動かすことができました。
これで沢山の画像に対してAPI経由でゴリゴリと画像キャプショニングできます。
JoyCaptionの作者はもちろん、各種量子化モデルを提供してくれている量子化職人の方々にも感謝です。
最後に、本記事が少しでも参考になったら「いいね」して頂けると励みになります。
Discussion