KVSplit - Appleシリコンで2〜3倍長いコンテキストを実行
(github.com/dipampaul17)- KVSplitは、Appleシリコン上で大規模LLMと長いコンテキストウィンドウを実行できるようにするオープンソースプロジェクト
- キーと値を分離した精度割り当てにより、最大72%のメモリ削減と品質低下1%未満を達成
- M1/M2/M3チップおよびMetalフレームワーク向けに最適化
- 実行速度の改善とメモリ節約を、実測ベンチマークと可視化ツールで実証
- 容易なインストール、ワンコマンド比較、さまざまなベンチマークおよび分析ツールを提供
紹介: なぜKVSplitが重要なのか
KVSplitは、KVキャッシュ内部のキーと値に異なる精度の量子化を適用することで、Appleシリコン(M1/M2/M3)環境で大規模LLMとはるかに長いコンテキストウィンドウの実行を可能にするオープンソースツール。既存プロジェクトがキーと値を同一に量子化していた限界を克服し、メモリ使用量を大幅に削減しながら、品質低下はほとんど体感できないレベルに抑えている。実際のベンチマーク、速度、品質指標がすべて公開されており信頼性が高く、Metal対応と直感的な比較・可視化ツールによって開発効率も高い。
同種プロジェクトと比べた主な利点は以下の通り。
- キー・バリュー精度の分離による、より効率的なメモリ管理
- Appleシリコン特化およびMetalフレームワークのフル最適化対応
- ベンチマーク、パープレキシティ、メモリ/速度/品質の測定と可視化を統合提供
- ワンコマンドインストール、モデル互換、llama.cpp統合
- リアルタイムのメモリ削減可視化と各種比較テストツール
主な特徴とコア内容
概要
- KVSplitを使うことで、従来よりはるかに大きなLLMと長いコンテキスト長をAppleシリコンで実行可能
- キーと値それぞれに異なる量子化精度を割り当てることで、メモリ削減と速度改善を両立
- 最大72%のメモリ節約および速度改善(5〜15%↑)、品質低下1%未満を確認
- Metalを完全サポートし、Appleシリコンで最適な高速化を実現
主なベンチマーク結果
- **K8V4(キー8ビット、値4ビット)**構成では
- 59%のメモリ削減および0.86%の品質低下(パープレキシティ基準)
- FP16比で5.7%の高速化
- **K4V4(キー/値ともに4ビット)**構成では
- 最大72%のメモリ削減
- 品質は約6%低下。品質感度が低い用途に推奨
メモリ削減効果の比較
- FP16基準で176MB(8Kトークン)の場合
- K8V8(8ビットキー/値): 93.5MB(47%)
- K8V4(8ビットキー、4ビット値): 71.5MB(41%)
- K4V4(4ビットキー/値): 49.5MB(28%)
主な機能
- KVキャッシュのキー・値を個別量子化する機能
- Appleシリコン・Metal完全最適化
- ベンチマーク/品質(パープレキシティ)/メモリ使用量分析スクリプト
- 可視化ツールと論文品質のグラフ生成
- ワンコマンドセットアップとリアルタイム比較機能
プロジェクトフォルダ構成
- llama.cpp: Metal最適化ビルドを含む
- models: モデルファイルを保存
- scripts: ベンチマーク/インストール/比較/可視化スクリプトを含む
- results, plots: ベンチマーク結果および可視化ファイルを保存
- README.md
科学的インサイトと実験結果
KVキャッシュの中核的な現象
- キーベクトルは量子化感度が値ベクトルよりはるかに高い → 品質を維持するにはキーにより高い精度を割り当てる必要がある
- K8V4がスイートスポット: キー8ビット/値4ビットの配分が、品質とメモリのトレードオフとして最適
- メモリ59%削減、パープレキシティは0.86%のみ悪化、速度もFP16より高速
- K4V8はK8V4と同じビット数にもかかわらず、7倍以上大きい品質低下が発生 → キー側精度の重要性を実証
総合的な示唆
- メモリ効率の確保とモデル品質の維持を両立 → コンシューマ向けハードウェアでも、はるかに長いコンテキストと大きなモデル運用が可能
使用例と設定の推奨
さまざまな量子化精度での実行例
- 基本(FP16): ./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "プロンプト" -t 8 --flash-attn
- K8V4推奨: --kvq 8
- K4V8(DEMO): --kvq-key 4 --kvq-val 8
- K4V4(最大削減): --kvq 4
長いコンテキストの例
- 32Kコンテキスト: FP16では約1.4GB必要だが、K8V4なら約400MBで実行可能
コマンドラインフラグの説明
-t 8: スレッド数、M1/M2/M3では8推奨--flash-attn: Appleシリコン最適化--kvq N: キー/値の両方をNビットに設定--kvq-key,--kvq-val: 個別設定をサポート-c N: コンテキストトークン数(長いほどKVSplitの効果が最大化)-n N: 生成トークン数-f FILE: 文書入力ファイル-m MODEL: モデルパス
高度なベンチマーキングと可視化
- benchmark_kvsplit.pyで、構成別・シーケンス長別のメモリ/速度/パープレキシティ/スケール特性を測定
- visualize_results.pyで論文レベルのグラフを生成
- 結果はCSV/JSONに自動保存され、要約も提供
Appleシリコン最適化とメモリ可視化
- Metalフレームワークを完全活用
- メモリ負荷の大きいM1/M2/M3機種で決定的な効果
- capture_memory.shでリアルタイムのメモリ削減を可視化可能
- カスタムページアライメントにより、実際の削減量は理論値とわずかに異なる場合がある
要約機能の整理
- 独立したキー/値ビット精度とカスタム量子化
- AppleシリコンおよびMetalの完全最適化
- メモリ/速度/品質の総合ベンチマークを提供
- 論文品質の可視化とリアルタイム比較、メモリキャプチャをサポート
- 非常に簡単なインストール/利用インターフェース
引用および参考研究
- "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]
推奨設定と今後の計画
- K8V4(キー8ビット/値4ビット): 品質損失0.86%、メモリ59%削減、速度+5.7%で最適なバランス
- K4V4: 最大のメモリ削減(72%)、品質は約6%低下。メモリ最優先の用途に適する
- 長いコンテキスト実行に特に強く、2〜3倍長いコンテキスト運用が可能
今後のロードマップ
- トークン重要度ベースの適応精度
- レイヤー別の個別量子化
- モデル別のカスタム最適化(Mistral、Phi-3など)
- Webデモおよびモバイル(iOS/iPadOS)対応予定
ライセンスと貢献案内
- MITライセンス
- 開発者/AI研究者は誰でもIssueおよびPRで貢献可能
1件のコメント
Hacker Newsのコメント
興味深いという反応。なぜこの現象が起きるのかという直感や、どうやって発見したのかへの質問。インストールスクリプトのパッチ適用段階が未完成である点や、git submodule の活用などユーザーフレンドリーな改善提案。また、さまざまな Python 環境を考慮して
llama.cppと Python 依存関係を分離すべきだという提案llama.cppに適用されていないと指摘。引数パースコードはすでにarg.cppに移動しており意味がないこと、K/V 量子化オプションも 2023 年にすでにllama.cppに追加されていたことを説明。パッチの存在意義に疑問を呈し、単にコマンドライン引数を変えただけに見えるという意見。この程度の簡単なパッチファイルのために、わざわざ新しいリポジトリのinstall.shを実行するのは避けるべきだという強い勧告このパッチが MLX でも可能かを尋ねる質問。MLX のほうが速度が出やすく、このアプローチが Mac ユーザーの実用的な速度での長文対話サポートに役立つのではという期待
--cache-type-k、--cache-type-vオプションとの実質的な違いがあるのかという質問bf16対応も最近追加されたもので、以前は Apple GPU 上でtype_k/v方式では最低でも 16 ビット(f16/bf16)までしか使えなかったため、llama.cpp内部の詳細は分からないが、少し異なるアプローチかもしれないという推測コードを読んだ結果、このパッチは不要だと判断。該当機能はすでに 2023 年に
llama.cppに取り込まれていたことを PR リンクで確認したという指摘。わざわざ fork リポジトリではなくパッチ適用方式でinstall.shを実行させようとしている点にも警戒が必要。リポジトリ内には複数のパッチファイルや重複コードがあり、パッチファイルを上書きするなど構造が混乱していると指摘。実際には--kvqオプションを追加しているだけだが、すでに個別の K/V 量子化オプションが存在する。著者がこうした既存機能を知らなかったはずがないのではと疑っている。複雑なスクリプトを提供するリポジトリのスクリプト実行は勧められない、という意見。HN 投稿や GitHub スター数は多いが内容には誤解を招く部分が多いとの批判。著者が質問を避け続けている点も懸念。加えて、リポジトリとスクリプトの両方が古いllama.cppコードベースと混在しており、最新構成と合っていないため混乱を招くという結論すでに変換済みの
.gguf形式モデルにも、差別的 KV 量子化(K8V4 など)を適用できるのか、モデル種類やトークナイザー設定に制限はあるのかという質問.ggufモデルに特別な変換なしでそのまま使える点だという説明。量子化は実行時の KV キャッシュにのみ適用され、モデル重みとは無関係。--kvq-keyと--kvq-valフラグでメモリ保存形式を指定するだけ。本人は LLaMA-3、Mistral、Phi-2/Phi-3、TinyLlama、Qwen などさまざまなモデルで成功を確認したとのこと。ただしllama.cppの Metal バックエンド専用で、Flash Attention は現在カスタム KV キャッシュ形式をバイパスするため-fa 0オプションが必要。それ以外は、アテンションを使う Transformer 構造であれば適用可能64GB、128GB など大容量 Apple Silicon では、このパッチはより速いのか、あるいはより有利なのかという質問。Apple Silicon でコンテキストウィンドウを広げると実際には遅いという話もあり、大容量メモリでどれほど意味があるのか知りたいという内容
面白いという反応と、もう少し高い視点からの説明を求める声。2048 トークンモデルを 4〜6k ほどに拡張して使えるのか、128k コンテキストモデルを 256k+ に広げられるのか、ローカルモデルの理想的なユースケースは何かという質問
とても良いアイデアと試みだという称賛。GPU にも適用できるのか、ほかの量子化手法と併用できるのかという追加質問
llama.cppの CUDA バックエンドもすでに--cache-type-k、--cache-type-vオプションで分離設定をサポートしている。現在のパッチは Metal 向けに特化しているが、原理自体はそのまま移植可能。他の量子化手法とも併用でき、KV キャッシュ量子化は実行中にのみ適用されるため、重み量子化とは衝突しない。変換パイプラインの別工程だからという説明。ただしvLLM、TensorRT-LLMなど独自のキャッシュ構造を持つエンジンでは別実装が必要。GPU で最大の効果が出るのは FlashAttention 構造に直接統合した場合で、メモリ削減がそのまま速度向上につながる可能性があるよく理解できない点があり、怪しさを感じるのでこのスクリプトの実行は避けるべきだと勧め、通報したと案内
性能がどう変わるのか気になる、より長いコンテキストをメモリに載せても結局計算速度は同じではないかという質問
fp16、q8、q4とキャッシュタイプを変えても、反復速度はほぼ同じに感じるという所感。内部動作は確認していないが、4〜8 ビット SIMD 一括処理でベクトルがパックされることを期待していたものの、実際にはパックされていないように見えるという印象