KVSplit - Menjalankan konteks 2-3x lebih panjang di Apple Silicon
(github.com/dipampaul17)- KVSplit adalah proyek open-source yang memungkinkan menjalankan LLM besar dan jendela konteks panjang di Apple Silicon
- Melalui alokasi presisi terpisah untuk key dan value, proyek ini mencapai pengurangan memori hingga 72% dengan penurunan kualitas kurang dari 1%
- Dioptimalkan untuk chip M1/M2/M3 dan framework Metal
- Peningkatan kecepatan eksekusi serta penghematan memori dibuktikan melalui benchmark terukur dan alat visualisasi
- Menyediakan instalasi mudah, perbandingan satu perintah, serta berbagai alat benchmark dan analisis
Pengantar: Mengapa KVSplit penting
KVSplit adalah alat open-source yang memungkinkan menjalankan LLM berukuran besar dan jendela konteks yang jauh lebih panjang di lingkungan Apple Silicon (M1/M2/M3) dengan menerapkan kuantisasi dengan presisi berbeda pada key dan value di dalam KV cache. Proyek ini mengatasi keterbatasan pendekatan sebelumnya yang mengkuantisasi key dan value secara sama, serta secara drastis mengurangi penggunaan memori sambil menekan penurunan kualitas ke tingkat yang nyaris tidak terasa. Benchmark nyata, metrik kecepatan, dan kualitas semuanya dipublikasikan, sehingga dapat dipercaya, dan dukungan Metal bersama alat perbandingan dan visualisasi yang intuitif meningkatkan efisiensi pengembangan.
Keunggulan utama dibanding proyek sejenis adalah sebagai berikut:
- Pemisahan presisi key-value untuk manajemen memori yang lebih efisien
- Dikhususkan untuk Apple Silicon dan mendukung optimasi penuh framework Metal
- Menyediakan integrasi benchmark, perplexity, pengukuran memori/kecepatan/kualitas, dan visualisasi
- Instalasi satu perintah, kompatibilitas model, integrasi llama.cpp
- Visualisasi penghematan memori secara real-time dan berbagai alat uji perbandingan
Fitur utama dan poin inti
Gambaran umum
- Dengan KVSplit, kini dimungkinkan menjalankan LLM yang jauh lebih besar dan panjang konteks yang lebih besar di Apple Silicon
- Dengan memberikan presisi kuantisasi yang berbeda untuk key dan value, proyek ini mencapai penghematan memori sekaligus peningkatan kecepatan
- Terkonfirmasi penghematan memori hingga 72% dan peningkatan kecepatan (5-15%↑), dengan penurunan kualitas kurang dari 1%
- Dukungan penuh Metal, mewujudkan akselerasi optimal Apple Silicon
Hasil benchmark utama
- Pada konfigurasi K8V4 (key 8-bit, value 4-bit)
- Penghematan memori 59% dan penurunan kualitas 0,86% (berdasarkan perplexity)
- Peningkatan kecepatan 5,7% dibanding FP16
- Pada konfigurasi K4V4 (key/value sama-sama 4-bit)
- Hingga 72% penghematan memori
- Terjadi penurunan kualitas sekitar 6%. Direkomendasikan untuk penggunaan yang tidak terlalu sensitif terhadap kualitas
Perbandingan efek penghematan memori
- Berdasarkan FP16 176MB (8K token)
- K8V8 (key/value 8-bit) : 93.5MB (47%)
- K8V4 (key 8-bit, value 4-bit) : 71.5MB (41%)
- K4V4 (key/value 4-bit) : 49.5MB (28%)
Fitur utama
- Fitur kuantisasi terpisah untuk key dan value pada KV cache
- Optimasi penuh untuk Apple Silicon dan Metal
- Skrip analisis benchmark/kualitas (perplexity)/penggunaan memori
- Alat visualisasi dan pembuatan grafik berkualitas publikasi
- Setup satu perintah dan fitur perbandingan real-time
Struktur folder proyek
- llama.cpp: termasuk build yang dioptimalkan untuk Metal
- models: menyimpan file model
- scripts: termasuk skrip benchmark/instalasi/perbandingan/visualisasi
- results, plots: menyimpan hasil benchmark dan file visualisasi
- README.md
Insight ilmiah dan hasil eksperimen
Fenomena inti pada KV cache
- Vektor key memiliki sensitivitas kuantisasi yang jauh lebih tinggi daripada vektor value → kualitas hanya bisa dipertahankan jika key diberi presisi lebih tinggi
- K8V4 adalah sweet spot: pembagian key 8-bit/value 4-bit adalah kompromi terbaik antara kualitas dan memori
- Hemat memori 59%, perplexity hanya memburuk 0,86%, dan kecepatannya juga lebih cepat daripada FP16
- K4V8 meski memiliki jumlah bit yang sama dengan K8V4, menghasilkan penurunan kualitas lebih dari 7 kali lebih besar → membuktikan pentingnya presisi pada sisi key
Implikasi keseluruhan
- Berhasil mewujudkan efisiensi memori sekaligus menjaga kualitas model → memungkinkan menjalankan konteks yang jauh lebih panjang dan model yang lebih besar pada hardware konsumen
Contoh penggunaan dan rekomendasi pengaturan
Contoh menjalankan dengan berbagai presisi kuantisasi
- Dasar (FP16): ./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "prompt" -t 8 --flash-attn
- Rekomendasi K8V4: --kvq 8
- K4V8 (DEMO): --kvq-key 4 --kvq-val 8
- K4V4 (penghematan maksimum): --kvq 4
Contoh konteks panjang
- Konteks 32K: FP16 memerlukan ~1.4GB, tetapi K8V4 dapat dijalankan dengan ~400MB
Penjelasan flag command line
-t 8: jumlah thread, disarankan 8 untuk M1/M2/M3--flash-attn: optimasi Apple Silicon--kvq N: menetapkan N-bit untuk key/value sekaligus--kvq-key,--kvq-val: mendukung pengaturan terpisah-c N: jumlah token konteks (semakin panjang, efek KVSplit semakin maksimal)-n N: jumlah token yang dihasilkan-f FILE: file input dokumen-m MODEL: path model
Benchmark lanjutan dan visualisasi
- Dengan benchmark_kvsplit.py, dapat mengukur karakteristik konfigurasi, panjang sekuens, memori/kecepatan/perplexity/skala
- Dengan visualize_results.py, dapat membuat grafik setingkat paper
- Hasil otomatis disimpan sebagai CSV/JSON dan ringkasan juga disediakan
Optimasi Apple Silicon dan visualisasi memori
- Memanfaatkan penuh framework Metal
- Sangat efektif untuk model M1/M2/M3 yang memiliki beban memori besar
- Dengan capture_memory.sh, penghematan memori dapat divisualisasikan secara real-time
- Karena penataan halaman yang disesuaikan, kapasitas penghematan aktual bisa sedikit berbeda dari nilai teoritis
Ringkasan fitur
- Presisi bit key/value independen dan kuantisasi yang dapat disesuaikan
- Apple Silicon dan Metal dengan optimasi penuh
- Menyediakan benchmark komprehensif untuk memori/kecepatan/kualitas
- Visualisasi berkualitas paper dan perbandingan real-time, dengan dukungan penangkapan memori
- Antarmuka instalasi/penggunaan yang sangat sederhana
Kutipan dan riset referensi
- "More for Keys, Less for Values: Adaptive KV Cache Quantization" (2024)
- "Unifying KV Cache Compression for Large Language Models with LeanKV" (2025)
- Implementasi dasar: [llama.cpp], model uji: [TinyLlama]
Rekomendasi pengaturan dan rencana ke depan
- K8V4 (key 8-bit/value 4-bit) : keseimbangan terbaik dengan kehilangan kualitas 0,86%, penghematan memori 59%, dan kecepatan +5,7%
- K4V4: penghematan memori maksimum (72%), kualitas turun sekitar 6%. Cocok untuk penggunaan yang memprioritaskan memori
- Sangat unggul untuk menjalankan konteks panjang, memungkinkan operasi konteks 2-3x lebih panjang
Roadmap ke depan
- Presisi adaptif berbasis tingkat pentingnya token
- Kuantisasi terpisah per layer
- Optimasi khusus per model (Mistral, Phi-3, dll.)
- Demo web dan dukungan mobile (iOS/iPadOS) direncanakan
Lisensi dan kontribusi
- Lisensi MIT
- Siapa pun, baik developer maupun peneliti AI, dapat berkontribusi melalui Issue dan PR
1 komentar
Komentar Hacker News
Ungkapan ketertarikan karena terasa menarik, pertanyaan tentang intuisi mengapa fenomena ini muncul dan bagaimana proses penemuannya, saran perbaikan agar lebih ramah pengguna seperti tahap penerapan patch di skrip instalasi yang belum tuntas dan penggunaan git submodule, serta usulan agar
llama.cppdipisahkan dari dependensi Python dengan mempertimbangkan beragam lingkungan Pythonllama.cpp, bahwa kode parsing argumen sudah dipindahkan kearg.cppsehingga menjadi tidak bermakna, serta bahwa opsi kuantisasi K/V juga sudah ditambahkan kellama.cppsejak 2023, mempertanyakan alasan keberadaan patch tersebut dan berpendapat bahwa tampaknya itu hanya membuat argumen command line sedikit berbeda, serta memberi peringatan keras agar tidak sembarang menjalankan fileinstall.shdari repositori baru hanya untuk menerapkan file patch yang sesederhana iniPertanyaan apakah patch ini juga mungkin diterapkan di MLX, dengan harapan karena MLX lebih cepat maka pendekatan ini dapat membantu pengguna Mac mendapatkan dukungan percakapan panjang pada kecepatan yang layak dipakai sehari-hari
Pertanyaan apakah ada perbedaan nyata dibanding opsi
--cache-type-k,--cache-type-vbf16juga baru ditambahkan belakangan, sehingga pada masa lalu di GPU Apple pendekatan type_k/v mungkin hanya bisa sampai minimum 16-bit (f16/bf16); karena itu meski tidak tahu pasti bagian dalamllama.cpp, mungkin ini pendekatan yang agak berbedaSetelah membaca kodenya, penulis komentar menilai patch itu tidak perlu, dan memastikan lewat tautan PR bahwa fitur tersebut sudah masuk ke
llama.cppsejak 2023; ada alasan untuk waspada karena pengguna diarahkan menjalankaninstall.shdengan cara menerapkan patch alih-alih memakai repositori fork, serta ditunjukkan bahwa struktur repositorinya membingungkan karena berisi beberapa file patch, kode duplikat, dan penimpaan file patch; pada praktiknya hanya menambahkan opsi--kvq, padahal opsi kuantisasi K/V terpisah sudah ada; muncul kecurigaan bahwa penulis repositori tidak mungkin tidak tahu soal fitur yang sudah ada ini; tidak disarankan menjalankan skrip dari repositori dengan skrip rumit seperti itu; sekalipun postingan HN dan jumlah GitHub star-nya tinggi, isinya dianggap menyesatkan; kekhawatiran juga muncul karena penulis terus menghindari pertanyaan; sebagai tambahan, repositori dan skripnya dinilai campur aduk dengan basis kodellama.cpplama dan tidak sesuai dengan struktur terbaru sehingga makin membingungkanPertanyaan apakah kuantisasi KV diferensial (K8V4 dan sejenisnya) bisa diterapkan juga pada model format
.ggufyang sudah dikonversi, dan apakah ada batasan pada jenis model atau pengaturan tokenizer.ggufyang sudah ada tanpa konversi khusus, karena kuantisasi hanya diterapkan pada KV cache saat runtime dan tidak terkait dengan bobot model; cukup menentukan format penyimpanan memori dengan flag--kvq-keydan--kvq-val; penulis mengaku berhasil menguji pada berbagai model seperti LLama-3, Mistral, Phi-2/Phi-3, TinyLlama, dan Qwen; namun ini khusus untuk backend Metal dillama.cpp, dan karena Flash Attention saat ini melewati format KV cache kustom maka opsi-fa 0diperlukan; selain itu, selama arsitekturnya transformer berbasis attention maka seharusnya semuanya bisa diterapkanPertanyaan apakah patch ini lebih cepat atau lebih baik pada Apple Silicon berkapasitas besar seperti 64GB atau 128GB, dengan menyebut adanya rumor bahwa perluasan context window di Apple Silicon sebenarnya lambat, dan ingin tahu apakah ini bermakna secara praktis untuk memori besar
Ketertarikan dan permintaan penjelasan dari sudut pandang yang sedikit lebih tinggi, pertanyaan apakah model 2048 token bisa dipakai untuk diperluas ke 4~6k dan model konteks 128k bisa dipakai untuk jendela 256k+, serta pertanyaan tentang use case ideal model lokal
Pujian bahwa ini ide dan percobaan yang sangat bagus, serta pertanyaan lanjutan apakah ini juga bisa diterapkan ke GPU dan bisa digabungkan dengan teknik kuantisasi lain
llama.cppjuga sudah mendukung pengaturan terpisah melalui opsi--cache-type-k,--cache-type-v; patch saat ini memang khusus untuk Metal, tetapi prinsipnya bisa dipindahkan apa adanya; ini juga dapat dipakai bersamaan dengan teknik kuantisasi lain, dan karena kuantisasi KV cache hanya diterapkan saat runtime maka tidak berbenturan dengan kuantisasi bobot; keduanya adalah tahap terpisah dalam pipeline konversi; namun untuk engine seperti vLLM atau TensorRT-LLM yang memakai struktur cache berbeda, implementasi terpisah akan diperlukan; efek terbesar di GPU kemungkinan muncul jika diintegrasikan langsung ke struktur FlashAttention, karena penghematan memori bisa langsung berubah menjadi peningkatan kecepatanMenyatakan ada bagian yang tidak benar-benar dipahami dan terasa janggal, menyarankan agar tidak menjalankan skrip tersebut, serta memberi tahu bahwa sudah melaporkannya
Pertanyaan bagaimana perubahan performanya, apakah meski konteks yang lebih panjang bisa dimuat ke memori pada akhirnya kecepatan komputasi tetap sama
fp16,q8,q4, kecepatan iterasi terasa mirip; meski tidak memeriksa cara kerja internalnya, semula berharap vektor akan dipacking lewat pemrosesan batch SIMD 4~8 bit, tetapi kesannya ternyata tidak demikian