- KVSplit은 Apple Silicon에서 LLM의 attention KV cache에 key와 value별로 다른 양자화 정밀도를 적용해 같은 메모리 예산에서 더 긴 컨텍스트와 더 무거운 모델 실행을 목표로 함
- 핵심 결과는 K8V4 구성이며, 8K 토큰 기준 FP16 176.00MB 대비 71.50MB로 줄이고 토큰 처리 속도는 54,360 tokens/sec에서 57,438 tokens/sec로 높이며 perplexity 변화는 +0.86%로 제시됨
- key가 value보다 양자화에 더 민감하다는 결과를 바탕으로, 같은 총 비트 수를 쓰는 K4V8은 K8V4보다 품질 저하가 약 7배 크다고 정리함
- 제공 기능은 llama.cpp 패치 적용, Metal 지원 빌드, 메모리·속도·perplexity 벤치마크, CSV/JSON 결과 저장, 시각화 도구, Activity Monitor 기반 메모리 절감 캡처를 포함함
- 권장 구성은 품질과 메모리 절감의 균형을 위한 K8V4이며, 최대 메모리 절감이 필요하면 K4V4로 72% 절감과 약 6% 품질 손실을 감수하는 선택지가 있음
KVSplit이 해결하려는 문제
- KVSplit은 Apple Silicon Mac에서 LLM 추론 시 KV cache 메모리를 줄이기 위한 프로젝트임
- attention 메커니즘의 KV cache에서 key와 value에 서로 다른 양자화 정밀도를 적용함
- 목표는 다음과 같음
- 메모리 사용량을 최대 72% 절감
- 같은 메모리 예산에서 2-3배 긴 컨텍스트 실행
- FP16 대비 추론 속도를 유지하거나 개선
- Apple Silicon에 맞춘 Metal 지원 제공
핵심 벤치마크 결과
- 8K 토큰 기준 구성별 결과는 다음과 같음
- FP16: 176.00MB, 54,360 tokens/sec
- K8V8: 93.50MB, 51,503 tokens/sec, perplexity +0.03%
- K8V4: 71.50MB, 57,438 tokens/sec, perplexity +0.86%
- K4V8: 71.50MB, 58,690 tokens/sec, perplexity +6.06%
- K4V4: 49.50MB, 55,193 tokens/sec, perplexity +6.15%
- 메모리 절감 표에서는 K8V4가 8K 토큰에서 59% 절감, K4V4가 72% 절감으로 제시됨
- 성능 표에서는 K8V4가 FP16 대비 +5.7%, K4V8이 +8.0%, K4V4가 +1.5% 속도 향상을 보임
- K8V8은 FP16 대비 메모리를 줄이지만 속도는 -5.3% 로 낮아짐
시퀀스 길이에 따른 메모리 사용
- 컨텍스트 길이가 길어질수록 KV cache 메모리 절감 효과가 커짐
- 8192 토큰 기준 메모리 사용량은 다음과 같음
- FP16: 176.00MB
- K8V8: 93.50MB
- K8V4: 71.50MB
- K4V8: 71.50MB
- K4V4: 49.50MB
- 4096 토큰 기준으로도 FP16 88.00MB 대비 K8V4/K4V8은 35.75MB, K4V4는 24.75MB를 사용함
- 128 토큰 기준에서는 FP16 5.50MB, K8V4/K4V8 2.23MB, K4V4 1.55MB로 제시됨
key와 value의 비대칭성
- KV cache 메모리는 각 토큰의 key 벡터와 value 벡터 저장이 지배함
- 프로젝트의 핵심 관찰은 key가 value보다 양자화에 훨씬 민감하다는 점임
- K8V4는 8-bit key와 4-bit value를 사용해 다음 균형점을 제공함
- FP16 대비 perplexity 저하 0.86%
- 메모리 절감 59%
- FP16보다 빠른 추론 속도
- K4V8은 K8V4와 같은 총 비트 수를 쓰지만, 품질 저하가 K8V4보다 약 7배 크다고 정리됨
- 이 비대칭성 덕분에 consumer hardware에서 더 긴 컨텍스트와 더 큰 모델 실행이 가능해진다고 설명함
설치와 통합 방식
- 설치는 저장소를 clone한 뒤
scripts/install_kvsplit.sh를 실행하는 방식임
git clone https://github.com/dipampaul17/KVSplit.git
cd kvsplit
chmod +x scripts/install_kvsplit.sh
./scripts/install_kvsplit.sh
- 설치 스크립트는 Python 환경 설정 방식을 선택할 수 있음
- Virtual Environment: 프로젝트 폴더 안에 독립 Python 환경 생성
- System Python: 기존 Python 설치 사용
- Skip Python Setup: 사용자가 Python 환경을 직접 관리
- llama.cpp 통합 방식도 선택 가능함
- 표준 방식: llama.cpp를 clone하고 KV split 패치를 적용
- Git submodule 방식: 개발자나 고급 사용자를 위해 llama.cpp를 submodule로 추가
- 설치 과정은 Apple Silicon용 Metal 지원 llama.cpp 설정, differentiated KV cache quantization 활성화, 선택적 테스트 모델 다운로드, 시각화 도구 설정을 포함함
사용 예시와 CLI 옵션
- 빠른 비교는 사용자가 가진 GGUF 모델로 실행할 수 있음
python scripts/quick_compare.py --model models/your-model.gguf
- 비교 대상은 FP16, K8V8, K8V4, K4V8, K4V4이며 메모리, 속도, 품질 지표를 함께 보여줌
- README의 실행 예시는
llama-cli에 --flash-attn과 KV 양자화 옵션을 함께 사용함
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "Your prompt" \
-t 8 --flash-attn --kvq 8
- K4V8 예시는 key와 value 비트를 따로 지정함
./llama.cpp/build/bin/llama-cli -m models/your-model.gguf -p "Your prompt" \
-t 8 --flash-attn --kvq-key 4 --kvq-val 8
- 32K 컨텍스트 예시는 FP16에서는 약 1.4GB, K8V4에서는 약 400MB가 필요하다고 제시됨
./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
- 주요 CLI 플래그는 다음과 같음
-t 8: 스레드 수, 대부분의 Apple Silicon 칩에서 8 권장
--flash-attn: 최적화 attention 활성화, Apple Silicon에서 권장
--kvq N: key와 value 비트 설정
--kvq-key N: key 비트만 설정
--kvq-val N: value 비트만 설정
-c N: 컨텍스트 크기
-n N: 생성할 토큰 수
-f FILE: 입력 파일
-m MODEL: .gguf 모델 파일 경로
벤치마크와 시각화 도구
- 전체 벤치마크는
scripts/benchmark_kvsplit.py로 실행함
python scripts/benchmark_kvsplit.py
python scripts/benchmark_kvsplit.py --config K8V4 --seq-len 4096
- 시각화는
scripts/visualize_results.py로 생성함
python scripts/visualize_results.py
- 벤치마크는 다음 항목을 측정함
- Memory Usage: VRAM과 KV cache 메모리
- Performance: 시퀀스 길이별 tokens/sec
- Quality:
llama-perplexity를 사용한 perplexity
- Scaling: 시퀀스 길이에 따른 메모리와 성능 변화
- 결과는 CSV/JSON 형식으로 저장되며 자동 요약 통계와 시각화 플롯을 생성함
capture_memory.sh는 Activity Monitor에서 메모리 절감을 캡처하는 도구임
Apple Silicon 최적화와 제약
- KVSplit은 Apple의 Metal framework에 맞춰 최적화됨
- Apple Silicon M series처럼 메모리 제약이 있는 장치에서 메모리 효율을 강조함
- README는 llama.cpp의 256B page alignment 때문에 실제 메모리 절감이 이론 계산과 약간 다를 수 있다고 밝힘
- 지원 대상으로 M1, M2, M3, M4 칩을 포함함
권장 구성과 로드맵
- 권장 구성은 K8V4임
- 8-bit key, 4-bit value
- 59% 메모리 절감
- 0.86% 품질 손실
- FP16 대비 +5.7% 추론 속도
- 최대 메모리 절감은 K4V4임
- 4-bit key와 4-bit value
- 72% 메모리 절감
- 약 6% 품질 손실
- 덜 민감한 애플리케이션에 적합하다고 제시됨
- 매우 긴 컨텍스트에는 K8V4 또는 K4V4가 권장되며, 컨텍스트 길이가 길수록 메모리 절감이 누적됨
- 향후 계획은 다음과 같음
- 토큰 중요도 기반 Adaptive Precision
- 레이어별 다른 정밀도를 쓰는 Layer-Specific Quantization
- Mistral, Phi-3 등에 맞춘 모델별 최적화
- 웹 데모
- iOS와 iPadOS 지원
- 라이선스는 MIT이며, 기여는 issue 또는 pull request로 받을 수 있음