概要
- KVSplit はApple Silicon向けに開発された、Attention機構の KVキャッシュ に異なる量子化精度を適用するツールです。
- メモリ使用量を最大72%削減 し、品質低下を最小限に抑えつつ、より長いコンテキストや大型LLMをMacで実行可能。
- K8V4(8bitキー/4bit値) 構成が最良のバランスを実現し、 推論速度も向上 する場合が多いです。
- Metal完全対応 でApple Siliconのパフォーマンスを最大化。
- 簡単なインストール と包括的なベンチマーク・可視化ツールを提供。
Apple Silicon向けKVSplit:差別化KVキャッシュ量子化によるLLM推論の最適化
KVSplitとは
- Attentionの キー(key)と値(value) に 独立した量子化精度 を適用することで、 メモリ効率と品質維持 を両立する技術提案。
- Apple Silicon (M1/M2/M3)に最適化されており、Metalサポートを活用すること。
- llama.cpp をパッチ適用し、--kvq-key/--kvq-valフラグで 個別ビット幅 を指定可能に拡張すること。
- ベンチマークスイート と可視化ツールを同梱し、効果を定量的に確認すること。
主な特徴・メリット
- メモリ使用量削減 :最大72%削減(K4V4構成)、K8V4で59%削減+品質劣化0.86%のみ確認。
- 長いコンテキストウィンドウ :同じメモリ予算で2〜3倍長い文脈長を実現すること。
- 推論速度向上 :K8V4やK4V8構成で最大8%高速化を確認すること。
- 品質維持 :キーのビット幅が品質に大きく影響し、値は低ビット幅でも品質劣化が小さいことを実証。
- Metal最適化 :Apple SiliconのMetalフレームワークをフル活用し、効率的な推論を実現すること。
ベンチマーク結果(8Kトークン時)
| 構成 | VRAM使用量 | メモリ削減率 | 推論速度 (tokens/sec) | 品質劣化 (Perplexity) | |----------|------------|--------------|----------------------|-----------------------| | FP16 | 176MB | — | 54,360 | — | | K8V8 | 93.5MB | 47% | 51,503 | +0.03% | | K8V4 | 71.5MB | 59% | 57,438 | +0.86% | | K4V8 | 71.5MB | 59% | 58,690 | +6.06% | | K4V4 | 49.5MB | 72% | 55,193 | +6.15% |
- K8V4 が最良のバランス(メモリ59%削減、品質劣化0.86%、速度+5.7%)。
- K4V8 は同じビット数でも品質劣化が7倍大きいことを確認(キー精度の重要性を示唆)。
メモリ削減のスケーリング
- シーケンス長が伸びるほど KVキャッシュのメモリ削減効果が増大 すること。
- 例:FP16で32Kトークン→約1.4GB、K8V4で約400MBに圧縮可能。
インストール・セットアップ
- 前提条件 :macOS (Apple Silicon), Homebrew, Xcode Command Line Tools
- リポジトリクローン
git clone https://github.com/dipampaul17/KVSplit.git cd kvsplit chmod +x scripts/install_kvsplit.sh ./scripts/install_kvsplit.sh - Python環境 (仮想環境orシステムPythonを選択可能)、 llama.cpp のMetal対応ビルド自動化、 テストモデルの自動ダウンロード、可視化ツールのセットアップも自動化すること。
llama.cppでの利用例
- FP16ベースライン
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "Your prompt" -t 8 --flash-attn - 推奨:K8V4(8bitキー/4bit値)
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "Your prompt" -t 8 --flash-attn --kvq 8 - K4V8(4bitキー/8bit値)
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "Your prompt" -t 8 --flash-attn --kvq-key 4 --kvq-val 8 - K4V4(4bitキー/4bit値)
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "Your prompt" -t 8 --flash-attn --kvq 4 - 長文対応例(32K文脈長)
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -c 32768 -n 4096 -t 8 --flash-attn --kvq 8 -f your-long-document.txt
コマンドラインフラグ一覧
-t 8:スレッド数(Apple Siliconは8推奨)--flash-attn:最適化Attention有効化--kvq N:キー・値ともにNビット指定--kvq-key N:キーのみNビット指定--kvq-val N:値のみNビット指定-c N:文脈長(長いほどKVSplitの恩恵増大)-n N:生成トークン数-f FILE:入力ファイル指定-m MODEL:モデルファイルパス
ベンチマーク・可視化
- 簡易比較
python scripts/quick_compare.py --model models/your-model.gguf - 詳細ベンチマーク
python scripts/benchmark_kvsplit.py python scripts/benchmark_kvsplit.py --config K8V4 --seq-len 4096 - 可視化
python scripts/visualize_results.py - メモリ削減のGIF化
./scripts/capture_memory.sh
プロジェクト構成
llama.cpp/:Metal最適化llama.cppmodels/:モデル格納先scripts/:インストール・ベンチマーク・可視化スクリプトresults/:ベンチマーク結果plots/:可視化出力README.md:ドキュメント
科学的知見・論拠
- キーは値よりも量子化に敏感 であり、精度劣化を抑えるにはキー側のビット幅を優先することが重要。
- K8V4 が「品質・効率・速度」の最適解であることを実証。
- メモリ効率 を最大化しつつ、消費者向けMacで長文コンテキストや大型モデルを扱うことが現実的になる提案。
推奨構成
- 総合ベスト :K8V4(8bitキー/4bit値)→59%削減+品質劣化0.86%のみ、速度向上(+5.7%)
- 最大メモリ削減 :K4V4(4bitキー/4bit値)→72%削減、品質劣化約6%(用途限定向き)
- 長文対応 :K8V4またはK4V4(文脈長が長いほど恩恵大)
今後のロードマップ
- 適応的精度制御 :トークン重要度に基づく動的ビット幅割当
- 層ごとの量子化 :モデル層ごとに異なる精度を適用すること
- モデル特化最適化 :Mistral、Phi-3等への最適化
- Webデモ・モバイル対応 :iOS/iPadOSへの展開
ライセンス・貢献
- MITライセンス で公開
- 貢献歓迎 :Issue/PRでフィードバック・改善提案を受け付けること
参考文献・クレジット
- "More for Keys, Less for Values: Adaptive KV Cache Quantization" (2024)
- "Unifying KV Cache Compression for Large Language Models with LeanKV" (2025)
- llama.cpp (ベース実装)、 TinyLlama (テストモデル)
まとめ
- Apple Silicon で 大型LLM/長文推論 を実現したいユーザーにとって、 KVSplit は現時点で最も合理的な選択肢。
- メモリ効率・品質・速度 すべてを高水準で両立する提案であり、今後のLLM推論の標準技術となる可能性が高いことを確認。