32GB GPU에서 KV 캐시 양자화를 피하며 최대 컨텍스트로 Qwen3.8-27B-Q4 실행하기
Running Qwen3.8-27B-Q4 at max context on a 32 GB GPU while avoiding kvcache quantization
핵심 요약
컨텍스트 제한 도달 시 동적으로 설정을 변경해 KV 캐시 양자화를 최소화하는 llama-manager 도구 소개.
- 동적 설정 변경 — 모델 실행 중 speculative decoding 비활성화나 KV 캐시 양자화 등을 실시간 적용함.
- 품질 유지 전략 — 컨텍스트 한계에 도달하기 전까지는 고품질 설정을 유지하여 추론 성능을 최적화함.
- llama.cpp 포크 — 가중치 변경 없이 컨텍스트와 런타임 컴포넌트를 재구성하는 기능을 지원함.
- 단일 GPU 최적화 — 현재는 단일 GPU 환경에서만 작동하며 컨텍스트 부족 문제를 해결함.
KV 캐시 양자화 진짜 못 참겠다. q8_0에서도 차이가 느껴지는데 말 다 했지.
근데 현실적으로 32GB GPU에서 Qwen3.8-27B-UD-Q4_K_XL 돌리면 (mtp랑 mmproj 켜고) 170k 토큰 정도밖에 자리가 안 나. 컨텍스트가 적은 건 아닌데, Qwen3.8이 xhigh 설정으로 돌리면 이걸 순식간에 다 처먹거든.
그래서 공간이 있을 땐 풀 정밀도 KV 캐시를 쓰다가, 컨텍스트 제한에 걸릴 때만 동적으로 양자화하는 환경을 만들고 싶었어. 그래야 진짜 필요할 때까지 품질 저하 없이 세션을 최대한 길게 끌고 갈 수 있으니까.
그래서 이걸 만들었다: https://github.com/wadealexc/llama-manager
이게 뭔데?
기존 llama.cpp의 모델 설정은 **정적(static)**이야. llama-server 실행할 때 설정하면 나중에 바꿀 수가 없거든.
llama-manager는 llama.cpp 포크 버전을 감싸는 작은 래퍼야. 모델 서빙 방식은 똑같은데, 동적(dynamic) 모델 설정을 지원한다는 게 다르지.
즉, 모델을 로드한 뒤에도 추론 가속(speculative decoding)을 켜거나 끄고, mmproj를 추가하거나 제거하고, 컨텍스트 관련 파라미터를 업데이트할 수 있어. llama-manager는 재설정하는 동안에도 KV 캐시를 유지하니까 프롬프트 처리를 다시 할 필요도 없고. 결론적으로 토큰 생성 도중에도 모델을 '핫 리로드'할 수 있게 된 거야.
이건 모델 가중치를 건드리지 않고 컨텍스트와 런타임 컴포넌트를 재구축하는 llama.cpp 포크 버전을 써서 구현했어. 이 기능은 새로운 HTTP 엔드포인트 2개(랑 몇몇 다른 수정 사항들)로 지원돼. 포크 버전에 대한 자세한 정보는 README를 참고해 (README.md#llamacpp-changes).
어떻게 돌아가는데?
토큰 생성 중에 llama-manager가 컨텍스트 제한에 걸려서 요청이 실패하는 걸 감지해. 생성을 멈추지 않고도 컨텍스트를 늘리기 위해 중간에 여러 전략을 적용하는 거지. 기존 KV 캐시는 캐싱/복구되니까 재설정이 끝나자마자 바로 생성이 재개돼.
현재 내장된 전략은 다음과 같아:
-
disable-spec: 켜져 있다면 추론 가속기 비활성화 -
mmproj-to-cpu: mmproj를 GPU에서 CPU로 이동 -
quantize-kv-q8및quantize-kv-q4
개인적으로 KV 양자화는 최후의 수단으로 남겨두고 싶어서, 내 모델들은 이걸 가장 마지막에 실행하도록 설정해 뒀어. Qwen3.8-27B-UD-Q4_K_XL을 돌릴 땐 이런 순서로 전략이 적용돼:
════════════════════════════════════════════════════════════════════════════
qwen3.8-27b baseline: 167,680 tokens device: 31 GiB
════════════════════════════════════════════════════════════════════════════
i strategy ctx (tokens) gain (tokens) weights / ctx GiB
──────────────────────────────────────────────────────────────────────────
0 baseline 167,680 17.13 / 13.14
1 disable-spec 200,960 (+33,280) 17.13 / 13.16
2 mmproj-to-cpu 218,880 (+17,920) 16.02 / 14.27
3 quantize-kv-q8 262,144 (+43,264) 16.02 / 10.40
──────────────────────────────────────────────────────────────────────────
final ctx: 262,144 tokens

