llama-cpp について
llama.cppを副次的な推論エンジンとして使うためのスキルで、モデル実行、APIサーバー起動、LoRAアダプターの読み込み、Ollamaとのベンチマーク用スクリプトを備えています。Apple Siliconで推論やモデル開発の設定を行うユーザー向けです。
主な機能
- 01llama-cliでGGUFモデルを実行
- 02OpenAI互換APIサーバーの起動
- 03LoRAアダプターの動的読み込み
- 04Ollamaとの推論ベンチマーク
- 05LoRAアダプターをGGUFに変換
- 06OllamaモデルのGGUFファイルを特定
活用シーン
- 01ベースモデル上でLoRAアダプターを試す
- 02Ollamaとの推論速度を比較
- 03設定可能なAPI経由でモデルを提供
- 04学習パイプラインのLoRA出力をGGUFに変換
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tdimino/ claude-code-minoan --skill llama-cppインストール後、Claude Code で/llama-cppを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.mdscripts/convert_lora_to_gguf.pyconvert_to_train_txt.pyeval_local.shllama_bench.shllama_lora.shllama_serve_qwen35_9b.shllama_serve_qwen35.shllama_serve.shollama_model_path.shtrain_local.sh詳細
llama.cpp - セカンダリ推論エンジン
Apple Silicon での高速な推論、LoRA アダプターの読み込み、ベンチマークのために llama.cpp に直接アクセスします。RLAMA と一般用途では引き続き Ollama をプライマリとして使用し、llama.cpp は高性能なツールとして活用します。
前提条件
brew install llama.cpp
バイナリ:llama-cli、llama-server、llama-embedding、llama-quantize
クイックリファレンス
Ollama モデルから GGUF パスを解決する
モデルファイルの重複を避けるため、Ollama のモデル名から GGUF の blob パスを解決します。
~/.claude/skills/llama-cpp/scripts/ollama_model_path.sh qwen2.5:7b
推論を実行する
GGUF=$(~/.claude/skills/llama-cpp/scripts/ollama_model_path.sh qwen2.5:7b)
llama-cli -m "$GGUF" -p "Your prompt here" -n 128 --n-gpu-layers all --single-turn --simple-io --no-display-prompt
API サーバーを起動する
OpenAI 互換サーバーを起動します(ポート 8081。Ollama の 11434 を避けます)。
~/.claude/skills/llama-cpp/scripts/llama_serve.sh <model.gguf>
# Or with options:
PORT=8082 CTX=8192 ~/.claude/skills/llama-cpp/scripts/llama_serve.sh <model.gguf>
サーバーをテストします。
curl http://localhost:8081/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"default","messages":[{"role":"user","content":"Hello"}]}'
Qwen3.5 をサーブする
非対称 KV キャッシュ、jinja テンプレート、思考モードに対応する Qwen3.5 モデル専用サーバーです。
9B Dense(24~36GB システムに推奨):
# Default: Qwen3.5-9B, thinking mode, 32K context
~/.claude/skills/llama-cpp/scripts/llama_serve_qwen35_9b.sh
# Full precision F16 (~17.9 GB, zero quantization loss)
~/.claude/skills/llama-cpp/scripts/llama_serve_qwen35_9b.sh ~/models/Qwen3.5-9B-BF16.gguf
# Non-thinking mode, shorter context
THINK=0 CTX=8192 ~/.claude/skills/llama-cpp/scripts/llama_serve_qwen35_9b.sh
35B MoE(64GB 以上のシステム向け):
~/.claude/skills/llama-cpp/scripts/llama_serve_qwen35.sh # defaults to qwen3.5:35b-a3b
9B Q4 は約 6.6 GB を使用します(十分な余裕があります)。F16 は約 17.9 GB を使用し、36GB のシステムで 32K コンテキストとともに動作します。非対称 KV キャッシュ(q8_0 キー+q4_0 値)を使用すると、FP16 キャッシュと比べて KV メモリを約 60% 削減できます。
F16(フル精度)モード
最高品質(量子化による損失なし)を実現するには、BF16 GGUF をダウンロードしてサーブします。
# Download once (~17.9 GB)
huggingface-cli download unsloth/Qwen3.5-9B-GGUF "Qwen3.5-9B-BF16.gguf" --local-dir ~/models
# Serve F16
~/.claude/skills/llama-cpp/scripts/llama_serve_qwen35_9b.sh ~/models/Qwen3.5-9B-BF16.gguf
M4 Max 36GB での F16 と Q4 の比較:
| Q4_K_M(デフォルト) | BF16(F16) | |
|---|---|---|
| サイズ | 6.6 GB | 17.9 GB |
| 速度 | 約 38 tok/s | 約 8~12 tok/s |
| 品質 | 約 99.5% | 100%(基準) |
| 最大コンテキスト | 262K | 約 32K(快適に使用可能) |
ベンチマーク(llama.cpp と Ollama の比較)
~/.claude/skills/llama-cpp/scripts/llama_bench.sh qwen2.5:7b
両エンジンのプロンプト処理と生成の tok/s を並べて報告します。
LoRA アダプターによる推論
ベース GGUF モデルに LoRA アダプターを動的に読み込みます(マージ不要)。
~/.claude/skills/llama-cpp/scripts/llama_lora.sh <base.gguf> <lora.gguf> "Your prompt"
これは Ollama に対する大きな利点です。モデルを再構築せずに LoRA アダプターをホットスワップできます。
Kothar LoRA を GGUF に変換する
Kothar トレーニングパイプラインの HuggingFace LoRA アダプターを、マージ済みの GGUF モデルに変換します。
python3 ~/.claude/skills/llama-cpp/scripts/convert_lora_to_gguf.py \
--base NousResearch/Hermes-2-Mistral-7B-DPO \
--lora <path-or-hf-id> \
--output kothar-q4_k_m.gguf \
--quantize q4_k_m
llama.cpp と Ollama の使い分け
| タスク | 使用するもの |
|---|---|
| RLAMA クエリ | Ollama(ネイティブ統合) |
| 手早くモデルとチャットする | Ollama(ollama run) |
| LoRA アダプターのテスト | llama.cpp(llama_lora.sh) |
| tok/s のベンチマーク | llama.cpp(llama_bench.sh) |
| 推論速度の最大化 | llama.cpp(10~20% 高速) |
| カスタムサーバー設定 | llama.cpp(llama_serve.sh) |
| 埋め込みの生成 | どちらでも可(Ollama の方が簡単、llama-embedding の方が制御性に優れる) |
| Kothar GGUF 変換 | llama.cpp(convert_lora_to_gguf.py) |
アーキテクチャ
Ollama (primary, port 11434) llama.cpp (secondary, port 8081)
├── RLAMA RAG queries ├── LoRA adapter hot-loading
├── Model management (pull/list) ├── Benchmarking
├── General chat ├── Custom server configs
└── Embeddings (nomic-embed-text) └── Kothar GGUF conversion
Both share the same GGUF model files (~/.ollama/models/blobs/)
サブプロセスのベストプラクティス(ビルド 8180 以降)
スクリプトやサブプロセスから llama-cli を呼び出す場合:
- 必ず
--single-turnを使用します — 1 回応答を生成して終了します(対話チャットモードでハングするのを防ぎます)。 - 必ず
--simple-ioを使用します — リダイレクトされた出力を大量に埋め尽くす ANSI スピナーを抑制します。 - 必ず
--no-display-promptを使用します — プロンプトのエコーを抑制します。 - 従来の
-ngl 999ではなく--n-gpu-layers allを使用します。 - 引数なしの
--flash-attnではなく--flash-attn onを使用します — 現在は引数が必要です。 - タイミング統計は stdout に
[ Prompt: X t/s | Generation: Y t/s ]と表示されます(--show-timings経由。デフォルト:オン)。 - stderr は変数ではなくファイルにリダイレクトします — スピナーの出力が bash の変数の上限を超える可能性があります。