RX 9070 XT 16GB에서 Adaptive KV Streaming을 활용한 Qwen 27B 262k 컨텍스트 구동 (80+ t/s)
Qwen 27B (IQ4_XS, Q8/Q4 KV) at full 262k context on a 16GB RX 9070 XT: 80+ t/s decode with Adaptive KV Streaming
핵심 요약
llama.cpp에 RDNA 4 및 ROCm 최적화를 적용하여 16GB GPU에서 Qwen 27B 모델의 262k 컨텍스트를 효율적으로 구동하는 기술을 공유함.
- ROCm 최적화 — RDNA 4 아키텍처에 맞춰 커널 최적화 및 비동기 스트리밍 구현
- KV 캐시 스트리밍 — 16GB VRAM 한계를 극복하기 위해 호스트 RAM과 PCIe를 활용한 적응형 KV 캐시 관리
- 성능 벤치마크 — MTP를 활용하여 262k 컨텍스트에서 최대 31.1 t/s의 디코드 속도 달성
- 전력 효율 — TDP 제한을 통해 성능 저하를 최소화하면서 저전력 및 저소음 환경 구축
llama.cpp에 적응형 KV 스트리밍이랑 RDNA 4 / ROCm 최적화를 적용해서 16GB RX 9070 XT GPU 한 장으로 Qwen3.8-27B(IQ4_XS 가중치, Q8_0/Q4_0 KV 캐시)를 262,144 토큰 전체 컨텍스트 윈도우로 80+ t/s 디코딩 속도 뽑아내려고 작업 중이다.
Qwen 27B IQ4_XS 모델이 14.3GB 정도라 16GB 카드에서는 VRAM이 턱없이 부족하더라. 그래서 ASCII-condensed 버전으로 비 ASCII 어휘를 쳐내서 13.6GB(12.6 GiB)까지 줄였고, 덕분에 3.4GB 정도 VRAM 여유를 확보했다. 근데 Q8_0/Q4_0 KV 캐시를 써도 262k 컨텍스트면 KV 텐서만 7.4GB가 필요해서, 기존 llama.cpp로는 65k 토큰 넘어가면 바로 OOM 터지더라고.
그러다 RaymondHuang210129/llama.cpp-adaptive-kv-streaming을 발견했는데, 이게 NVIDIA/CUDA용 적응형 KV 스트리밍은 되는데 AMD/ROCm은 지원을 안 하길래 내가 직접 ROCm/HIP으로 포팅했다. 전체 262k 캐시는 호스트 RAM(약 7.4GB)에 박아두고, 연산이랑 동시에 PCIe SDMA로 필요한 데이터(프리필 ~450 MiB, 디코딩 ~2,100 MiB)만 비동기로 스트리밍하게 만들었음.
여기에 stew675/llama-cpp-rdna-boosts의 커널 최적화(4행 다중 열 mmvq, Q4_K/Q5_K용 16바이트 벡터화 로드, SwiGLU 퓨전, 단일 큐 비동기 HIP 그래프)도 싹 다 때려 박았다.
추가 개선 사항:
-
Sibling activation reuse: 병렬 프로젝션(gate/up 및 Q/K/V) 간에 양자화된 활성화 값을 재사용해서 메모리 중복 액세스 방지.
-
In-register fused residual add + RMSNorm: 패스 사이에 활성화 값을 VGPR에 유지하고 mmvq용 q8_1 사본을 바로 써버림.
-
Multi-column SwiGLU & GDN fusions: 퓨전된 Gate/Up + SwiGLU를 mmvq의 4열 검증 배치까지 확장하고 하이브리드 레이어용 순환 선형 어텐션 게이트를 퓨전함.


