llama.cpp
やはりC/C++製のLLM推論エンジンが本命かなぁ、あらま;
投稿フォーム:
Spam判定に使える?
当初からの課題にチャレンジ!
■ llama-cpp サーバ起動 (テスト環境はメインPC、CPUチップ内蔵GPUのみ)
~/git/llama.cpp$ Model=/data/models/Gemma-4-E4B-It-7.5B-BF16-q4_k_m.gguf
~/git/llama.cpp$ OPT="--host 127.0.0.1 --port 8000 -ngl 99 -c 4096"
~/git/llama.cpp$ build-vulkan/bin/llama-server -m $Model $OPT
今回はllama-cpp-pythonを使わずに、単にllama-serverを直接起動。
で、クライアントとしてpythonコードを書いてスパム判定のテストをしました。
■ ソースコード(spamAi.py)
_______________________________________________________
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="llama-cpp-dummy",)
# 指示書
instruction ="""
あなたは日本にあるWebサイトで、スパム投稿を監視する専門家です。
提示された評価対象テキストを厳しく検証してください。
ただし、多少くだけた日本語文は多目に見てください。
広告、不正リンク、無関係な宣伝、自動生成文などのスパム確率を求めることが目的です。
思考プロセスの出力は無用です。余計な挨拶も無用です。
出力は必ず以下のJSON形式のみにしてください。
{"spam_prob": 0.00〜1.00の数値, "reason": "判定理由(簡潔に)"}
"""
# BBS投稿テキスト(例)
content ="""
owaです。FZUG から頂いてきたチャットBBSを改造しましたので試験公開します。
何か書き込んでください^^。
"""
# 処理
response = client.chat.completions.create(
model="local-model",
messages=[
{"role":"system", "content": instruction},
{"role":"user", "content": f"評価対象テキスト:\n{content}"},
],
temperature=0.0, # 0.0:判定のブレを防ぐ,1.0:多様な返答
response_format={"type": "json_object"}
)
print(response.choices[0].message.content)
_______________________________________________________
■ 実行
(venv) ~/llamapy$ python spamAi.py
{"spam_prob": 0.05, "reason": "自作・改造したBBSの試験公開に関する投稿であり、広告や不正なリンク等のスパム要素は見られないため。"}
--
content(投稿テキスト)を色々変えて試したところ、
モデルがGemma-4-E4B-It-7.5B-BF16-q4_k_m.ggufの場合、
概ねspam投稿記事の返り値が0.75以上、hamの場合0.20以下でした。
(処理速度は5〜50秒/件程度)
モデルをgemma-4-12b-it-qat-q4_0.ggufに変更すると、
spam記事が0.95以上、hamが0.05以下と、かなり精度が向上しました。
ただし、倍くらい遅くなりますが;
何も勉強していない状況でこの成績です(^.^;
既存のベイズ君二世と併用すれば、このBBSで使えるのではないかなぁ。
GGUFファイル作成
■ 準備
1. venv仮想環境を最新にする
2. llama.cppで必要なモジュールをインストール
(venv) ~/git$ pip install -r llama.cpp/requirements.txt
3. モデル(gemma-4-E4B-it)を取得
(venv) ~/git$ git clone https://huggingface.co/google/gemma-4-E4B-it
Cloning into 'gemma-4-E4B-it'
...
(venv) ~/git$ ls
gemma-4-E4B-it/ llama.cpp/ venv/
■ GGUF作成
4. まずGGUFを作成
(venv) ~/git$ llama.cpp/convert_hf_to_gguf.py gemma-4-E4B-it/
(venv) ~/git$ ls gemma-4-E4B-it/*.gguf
Gemma-4-E4B-It-7.5B-BF16.gguf
5. 量子化(4bit)
(venv) ~/git$ IN=gemma-4-E4B-it/Gemma-4-E4B-It-7.5B-BF16.gguf
(venv) ~/git$ OUT=gemma-4-E4B-it/Gemma-4-E4B-It-7.5B-BF16-q4_k_m.gguf
(venv) ~/git$ llama.cpp/build-cpu/bin/llama-quantize $IN $OUT q4_K_M
... 数分かかる
(venv) ~/git$ du -m gemma-4-E4B-it/*.gguf
14,356MB Gemma-4-E4B-It-7.5B-BF16.gguf
5,089MB Gemma-4-E4B-It-7.5B-BF16-q4_k_m.gguf
これまでも、このq4モデルを併用してました。
llama-cppサーバに接続
クライアント側からつなぐ説明を追加;
まず OpenAI モジュールをインストール
(venv) ~/llamapy$ pip install openai
ソースコード(client.py)
________________________________________________________________________________
from openai import OpenAI
client = OpenAI(
base_url="http://{host2}:8000/v1", # {host2}はllama-cppサーバのアドレス
api_key="sk-no-key-required", # llama-cpp-pythonでは空でも動く
)
prompts = [
{"role":"system", "content":"あなたはMLBの選手です。"},
{"role":"user", "content":"正しく立つことを知ってますか?"},
]
response = client.chat.completions.create(
model="local-model", # サーバー側で指定されたモデル名(任意)
messages=prompts,
temperature=0.7, # 高いほど多様な返答
)
print(response.choices[0].message.content)
________________________________________________________________________________
■ 実行
(venv) ~/llamapy$ python client.py
ああ、もちろんだ。
プロの世界で生き残るには、技術以前に「正しい立ち方」が基本中の基本だからな。
...
llama-cpp-python鯖
ローカルLLMサーバとして起動してみました。
インタフェース(API)はOpenAI互換だそうです。
👉 https://llama-cpp-python.readthedocs.io/en/latest/server/
(venv) ~/llamapy$ python -m llama_cpp.server --model /data/models/gemma-4-12b-it-qat-q4_0.gguf --host 0.0.0.0 --port 8000 --verbose false --n_gpu_layers 99 --n_ctx 4096 --flash_attn true
INFO: Started server process [32685]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
________________________________________________________________________________
外のマシンからhttp経由で会話ができます。
ようやくローカルLLMを利用できる環境が整いました(^.^;
今は麓。これから山を登ります。
Gradioなど、便利なツールがいろいろあるみたい。
でも、それは、また別の話...
llama-cpp-python実行サンプル
■ ソースコード (sample.py)
________________________________________________________________________________
from llama_cpp import Llama
model='/data/models/gemma-4-12b-it-qat-q4_0.gguf'
llm = Llama(
model_path=model, # 自分のモデルに合わせてね!
n_ctx=2048, # コンテキスト長(入力最大トークン数)...VRAMが余ってるならもっと大きく!
n_gpu_layers=-1, # GPUを使う場合強烈に効く(-1:可能な限り使う、0:CPUのみ)
verbose=False, # 詳細なログ出力しない(default=True)
flash_attn=True # GPU次第。最新のCUDA設定では効くとか?
)
prompts = [
{"role":"system", "content":"あなたは綺麗なお姉さんです。"},
{"role":"user", "content":"フリーレンのこと知ってますか?"},
]
output = llm.create_chat_completion(
messages=prompts,
temperature=0.7, # 高いほど多様な返答
)
print(output['choices'][0]['message']["content"])
________________________________________________________________________________
■ 実行
(venv) ~/llamapy$ python sample.py
ええ、もちろん知っているわ。
『葬送のフリーレン』のことね。とても素敵で、少し切ない物語よね。
時を忘れて旅をするエルフの魔法使い...
gemma-4-12b は、結構新しいモデルのようですわ(^^;
llama-cpp-python
勢いでインストールした
配布元👉 https://github.com/abetlen/llama-cpp-python
ヒント👉 https://github.com/ggml-org/llama.cpp/blob/master/docs/build.md
■ まず仮想環境作成
~$ mkdir llamapy
~$ cd llamapy
~/llamapy$ python3 -m venv venv
~/llamapy$ source venv/bin/activate
(venv) ~/llamapy$ python -m pip install --upgrade pip
■ llama-cpp-python のインストール (CUDAホストに対応)
llama-cpp (CUDA版)を先にビルドしてて良かったと思う。同じ CMAKE オプションを使います
(venv) ~/llamapy$ export CMAKE_ARGS='-DGGML_CUDA=ON -DGGML_CUDA_NCCL=OFF -DCMAKE_CUDA_ARCHITECTURES="86"'
(venv) ~/llamapy$ pip install llama-cpp-python --no-cache-dir
ソースからビルドするので、15分くらいかかりました...
まずはllama-cppのビルド(cmake)を試して置くのが吉と思います。
一度失敗してから、再ビルドするには環境クリアなども必要です。
(venv) ~/llamapy$ pip install --upgrade --force-reinstall llama-cpp-python --no-cache-dir
CPU/CUDA/Vulkanの比較
ベンチマークを試してみました
pp512 (Prompt Processing): 512トークンの入力速度
tg128 (Token Generation): 128トークンの生成速度
モデルは最初に定義して置きます
~/git/llama.cpp$ Model=/data/models/gemma-4-12b-it-qat-q4_0.gguf
■ CPUホスト
~/git/llama.cpp$ time build-cpu/bin/llama-bench -m "$Model"
| model | size | params | backend | threads | test | t/s |
| -------------- | -------: | ------: | ------- | ------: | ----: | ----------: |
| gemma4 ?B Q4_0 | 6.48 GiB | 11.91 B | CPU | 4 | pp512 | 6.94 ± 0.10 |
| gemma4 ?B Q4_0 | 6.48 GiB | 11.91 B | CPU | 4 | tg128 | 3.77 ± 0.03 |
real 10m16.274s
user 40m10.284s
sys 0m3.167s
________________________________________________________________________________
■ CUDAホスト
~/git/llama.cpp$ time build-cuda/bin/llama-bench -ngl 99 -m "$Model"
| model | size | params | backend | ngl | test | t/s |
| -------------- | -------: | ------: | ------- | --: | ----: | -------------: |
| gemma4 ?B Q4_0 | 6.48 GiB | 11.91 B | CUDA | 99 | pp512 | 2507.27 ± 100. |
| gemma4 ?B Q4_0 | 6.48 GiB | 11.91 B | CUDA | 99 | tg128 | 53.23 ± 0.07 |
real 0m16.226s
user 0m15.372s
sys 0m0.845s
________________________________________________________________________________
■ Vulkanホスト
~/git/llama.cpp$ time build-vulkan/bin/llama-bench -ngl 99 -m "$Model"
| model | size | params | backend | ngl | test | t/s |
| -------------- | -------: | ------: | ------- | --: | ----: | -------------: |
| gemma4 ?B Q4_0 | 6.48 GiB | 11.91 B | Vulkan | 99 | pp512 | 1707.19 ± 0.69 |
| gemma4 ?B Q4_0 | 6.48 GiB | 11.91 B | Vulkan | 99 | tg128 | 51.26 ± 0.06 |
real 0m18.138s
user 0m8.368s
sys 0m0.969s
Vulkanも試してみた
参考👉 AMDローカルLLMホスティングにおけるROCm vs Vulkan:2026年版ガイド
https://www.glukhov.org/ja/llm-hosting/comparisons/amd-rocm-vs-vulkan-llm-hosting/
■ Vulkanホスト対応でビルド(CPU版ビルド後の環境です)
~/git/llama.cpp$ sudo apt install libvulkan-dev glslc glslang-tools spirv-headers
~/git/llama.cpp$ cmake -B build-vulkan -DGGML_VULKAN=ON
~/git/llama.cpp$ cmake --build build-vulkan --config Release -j 4
■ コンソールから実行(モデルは同じ)
~/git/llama.cpp$ Model=/data/models/gemma-4-12b-it-qat-q4_0.gguf
~/git/llama.cpp$ build-vulkan/bin/llama-cli -m "$Model"
_______________________________________________________
> こんにちは↵
こんにちは!何かお手伝いできることはありますか?
質問や相談など、何でもお気軽にどうぞ。
> /exit↵
_______________________________________________________
これも速い! 約50トークン/秒くらい。
CUDAホスト対応ビルド
NVIDIAグラボならこれがベストか
■ 事前確認
~$ nvidia-smi
CUDA Version: 13.2 (対応する nvcc の最大バージョンらしい)
~$ nvcc -V
release 12.0, V12.0.140
■ CUDAホスト対応でビルド(CPU版ビルド後の環境です)
~/git/llama.cpp$ sudo apt install nvidia-cuda-toolkit
~/git/llama.cpp$ cmake -B build-cuda -DGGML_CUDA=ON -DGGML_CUDA_NCCL=OFF -DCMAKE_CUDA_ARCHITECTURES="86"
[注意1] nccl (マルチGPU) について警告が出ます
-DGGML_CUDA_NCCL=OFF を追加
[注意2] Linux Mint 22.3 の nvcc V12.0 は古いらしい、エラーになる
-DCMAKE_CUDA_ARCHITECTURES="86" を追加
失敗したらbuild-cudaを削除し、原因を修正し "cmake -B build-cuda ..." を繰り返します
~/git/llama.cpp$ rm -rf build-cuda
~/git/llama.cpp$ cmake -B build-cuda -DGGML_CUDA=ON ...
そしてビルド
~/git/llama.cpp$ cmake --build build-cuda --config Release -j 4
■ コンソールから実行(モデルは同じ)
~/git/llama.cpp$ Model=/data/models/gemma-4-12b-it-qat-q4_0.gguf
~/git/llama.cpp$ build-cuda/bin/llama-cli -m "$Model"
_______________________________________________________
> こんにちは↵
こんにちは!何かお手伝いできることはありますか?
ご質問や、相談したいこと、またはただの雑談など、何でもお気軽にお話しください。
> /exit↵
_______________________________________________________
さすがに速い! 約50トークン/秒くらい。
llama.cppインストール
CPUホスト版なら、大きなGPUが無くても動くらしい
■ まずは llama.cpp をダウンロード
~$ sudo apt install git git-lfs
~$ mkdir git
~$ cd ~/git
~/git$ git clone https://github.com/ggml-org/llama.cpp.git
~/git$ ls
llama.cpp/
~/git$ cd llama.cpp/
■ CPUホストに設定してビルド
~/git/llama.cpp$ sudo apt install cmake g++ libcurlpp-dev ccache libssl-dev
~/git/llama.cpp$ cmake -B build-cpu
~/git/llama.cpp$ cmake --build build-cpu --config Release -j 4
■ コンソールから実行
gemma-4-12bモデル(ggufファイル)をダウンロード
https://www.kaggle.com/models/google/gemma-4/gguf
そして起動
~/git/llama.cpp$ Model=/data/models/gemma-4-12b-it-qat-q4_0.gguf
~/git/llama.cpp$ build-cpu/bin/llama-cli -m "$Model"
_______________________________________________________
build : b11294-185103dcf
model : /data/models/gemma-4-12b-it-qat-q4_0.gguf
ftype : Q4_0
modalities : text
available commands:
/exit or Ctrl+C stop or exit
/regen regenerate the last response
/clear clear the chat history
/read <file> add a text file
/glob <pattern> add text files using globbing pattern
_______________________________________________________
> こんにちは↵
こんにちは!何かお手伝いできることはありますか?
> /exit↵
_______________________________________________________
毎秒数トークンでした。