Qwen 27B (IQ4_XS, Q8/Q4 KV)를 16GB RX 9070 XT에서 262k 컨텍스트로 구동: 적응형 KV 스트리밍을 통한
요약
본 글은 llama.cpp에 적응형 KV 스트리밍과 RDNA 4/ROCm 최적화를 구현하여, Qwen3.8-27B 모델을 단일 16GB RX 9070 XT GPU에서 262k 컨텍스트로 구동하는 방법을 다룹니다. 이를 통해 메모리 제약 문제를 극복하고, 다양한 커널 및 스트리밍 최적화 기법(예: Sibling activation reuse, Online Log-Sum-Exp)을 적용하여 높은 디코드 속도를 달성했음을 보여줍니다.
핵심 포인트
- ROCm/HIP 포팅으로 AMD GPU에서 적응형 KV 스트리밍 구현
- 262k 컨텍스트를 처리하기 위해 호스트 RAM과 PCIe SDMA 활용
- 다양한 커널 최적화(SwiGLU, Sibling activation reuse 등)로 성능 향상
- MTP 적용 및 전력 제한 환경에서도 높은 디코딩/프리필 속도 유지
저는 llama.cpp에 적응형 KV 스트리밍(adaptive KV streaming)과 RDNA 4 / ROCm 최적화를 구현하여, Qwen3.8-27B (IQ4_XS 가중치, Q8_0/Q4_0 KV 캐시)를 단일 16 GB RX 9070 XT GPU에서 전체 262,144 토큰 컨텍스트 창을 사용하여 80+ t/s 디코드 속도로 구동하는 작업을 진행해 왔습니다. Qwen 27B IQ4_XS는 약 14.3 GB이므로, 16 GB 카드에서는 VRAM 여유 공간이 부족합니다. ASCII 압축 버전은 비-ASCII 어휘를 약 13.6 GB (12.6 GiB)로 줄여 사용 가능한 VRAM을 약 3.4 GiB 남깁니다. Q8_0/Q4_0 KV 캐시를 사용하더라도, 262k 컨텍스트는 KV 텐서만으로도 약 7.4 GiB가 필요하여 llama.cpp에서 약 65k 토큰을 넘어서면 OOM(Out of Memory)이 발생합니다.
저는 RaymondHuang210129/llama.cpp-adaptive-kv-streaming에서 발견했는데, 이 프로젝트는 NVIDIA/CUDA용 적응형 KV 스트리밍을 도입했지만 AMD/ROCm은 지원하지 않았습니다. 저는 이를 ROCm/HIP으로 포팅하여, 호스트 RAM에 전체 262k 캐시(약 7.4 GB)를 유지하는 동시에, 컴퓨팅과 함께 PCIe SDMA를 통해 경계가 있는 작업 집합(bounded working sets)을 비동기적으로 스트리밍합니다 (프리필 약 450 MiB, 디코드 약 2,100 MiB). 또한 stew675/llama-cpp-rdna-boosts의 커널 최적화도 통합했습니다 (4행 다중 열 mmvq, Q4_K/Q5_K용 16바이트 벡터 로드, SwiGLU 융합, 단일 큐 비동기 HIP 그래프). 추가 개선 사항은 다음과 같습니다: Sibling activation reuse: 병렬 투영(게이트/업 및 Q/K/V)에 걸쳐 양자화된 활성화를 재사용하여 중복 메모리 패스를 방지합니다. In-register fused residual add + RMSNorm: 활성화 값을 패스 간에 VGPRs에 유지하고, mmvq를 위해 양자화된 q8_1 복사본을 직접 작성합니다. Multi-column SwiGLU & GDN fusions: mmvq에서 4열 검증 배치로 확장된 융합 게이트/업 + SwiGLU와 하이브리드 레이어용 순환 선형 어텐션 게이트를 융합합니다. Online Log-Sum-Exp prefill & pipelined prefetch: 온라인 LSE 누적을 통해 스트리밍되는 페이지에 걸쳐 청크별 프리필을 계산하고, 레이어 L+1의 PCIe 전송과 레이어 L의 컴퓨팅을 오버랩(overlap)합니다. Persistent graph arenas: 프리필/디코드 단계 전환에 걸쳐 아레나를 재사용하여 해제(teardown) 오버헤드를 제거합니다.
스트림 최적화된 추측 디코딩(speculative decoding): 단일 헤드 MTP 검증 및 따라잡기 과정을 첫 번째 초안 단계에 통합(MTP 순방향 패스를 절반으로 줄이고 초안 KV 오염 방지), 검증 그래프를 위한 전용 영역을 할당하여 재구축 버블 제거, 검증 배치에 페이지 디코드 어텐션 확장 적용, 확률적 거부 샘플링과 결합된 적기 n-그램 스태킹. 벤치마크 성능: 디코딩(Decode) : 36.5 t/s (1k) -> 32.1 t/s (65k) -> 27.0 t/s (131k) -> 9.5 t/s (262k). 디코딩(MTP 적용 시): 71.8-86.5 t/s (1k-4k) -> 72.9 t/s (65k) -> 78.6 t/s (131k) -> 31.1 t/s (262k). 프리필(Prefill) : 1368.4 t/s (1k) -> 1120.3 t/s (65k) -> 863.0 t/s (131k) -> 585.8 t/s (262k). 9070 XT를 231W 제한(기본 TDP 304W 대비 -24%)으로 작동시켜도 프리필 지연 시간은 단지 3.6%의 페널티만 발생하며, 디코딩 처리량은 거의 동일하게 제공하여 전력을 절약하고 장시간 구동 시 카드를 조용하게 유지합니다. 전체 세부 정보는 저장소에서 확인하세요: https://github.com/achyudh/llama.cpp/tree/feature/adaptive-kv-stream-rocm /u/bottlestreet3d 제출 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/LocalLLaMA의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기