VRAM 속의 핫한 전문가들! llama.cpp에서 동적 전문가 캐싱을 통해 Qwen3.5-122B-A10B의 CPU+GPU 토큰 생성 속도를 레이어 기반 단일 GPU 부분 오프로드 대비 27% 향상
Hot Experts in your VRAM! Dynamic expert cache in llama.cpp for 27% faster CPU +GPU token generation with Qwen3.5-122B-A10B compared to layer-based single-GPU partial offload
핵심 요약
llama.cpp에서 자주 호출되는 전문가(expert)를 VRAM에 캐싱하여 CPU와 GPU 간의 데이터 전송 지연을 줄이고 추론 속도를 27% 향상시키는 기법을 공유함.
- 동적 전문가 캐싱 — 자주 사용되는 MoE 전문가를 VRAM에 상주시켜 CPU-GPU 간 데이터 전송 지연을 최소화함.
- 성능 향상 — 기존 레이어 기반 오프로드 대비 토큰 생성 속도가 27% 빨라졌으며, 프롬프트 처리 속도 저하도 거의 없음.
- 하이브리드 추론 — RTX 4090과 고성능 CPU를 조합하여 대규모 모델인 Qwen3.5-122B를 효율적으로 구동함.
- 구현 상세 — llama.cpp의 MoE 관련 파라미터를 조정하여 VRAM 사용량을 최적화하고 추론 효율을 극대화함.
Claude가 코드는 잘 짜줬지만, 이 글은 내가 직접 원시인처럼 썼음. Qwen3.5-122B를 돌려보고 싶었는데 통합 메모리 시스템이 없어서 15 tok/s는 너무 느렸음. 23 tok/s도 여전히 느리긴 하지만 스트리밍 응답 속도는 확실히 체감될 정도로 빨라짐.
Tl;dr:
- 지난 N개의 토큰 동안 가장 자주 라우팅된 전문가가 무엇인지 추적함. 자주 호출되는 전문가를 VRAM에 로드함으로써 얻는 처리 속도 향상이 시스템 RAM(cold)에서 VRAM(hot)으로 전문가 텐서를 전송할 때 발생하는 지연 시간보다 클 것이라고 판단함. N개의 토큰마다 이 과정을 반복함.
결과:
- 모든 전문가를 CPU로 오프로드한 기본 설정 대비:
- +44.8% 토큰 생성 속도 (15.65 tok/s -> 22.67 tok/s)
- 프롬프트 처리 속도 저하 없음
- 동일한 VRAM 사용량의 레이어 기반 오프로드 대비:
- +26.8% 토큰 생성 속도 (17.87 tok/s -> 22.67 tok/s)
- 프롬프트 처리 속도가 아주 약간 느려짐
기본 설정: 모든 전문가를 CPU로 오프로드 (LLAMA_ARG_OVERRIDE_TENSOR=exps=CPU)
프롬프트 처리 (tok/s, n=2928): 514.93, 534.64, 531.26
토큰 생성 (tok/s, n=~300): 15.60, 15.67, 15.69
부분 레이어 오프로드 (22.6 GB VRAM 사용): 8개 레이어를 GPU에 로드 (LLAMA_ARG_N_CPU_MOE = 40)
프롬프트 처리 (tok/s, n=2929): 556.42, 581.73, 618.08
토큰 생성 (tok/s, n=~300): 17.93, 17.81, 17.87
핫 전문가 캐시 (22.2 GB VRAM 사용): VRAM 캐시에 44개의 전문가 슬롯 할당 (LLAMA_ARG_MOE_HOT_K = 44, LLAMA_ARG_MOE_HOT_REBALANCE_INTERVAL=60, LLAMA_MOE_HOT_PP_BYPASS_N_TOKENS=64)
프롬프트 처리 (tok/s, n=2929): 557.18, 542.76, 546.77
토큰 생성 (tok/s, n=~300): 22.26, 22.97, 22.77
사양:
- RTX 4090 24GB + Ryzen 9 7950X 96GB
- bartowski의 Qwen3.5-122B-A10B Q4_K_L + bf16 vision mmproj
- KV Cache 131K 토큰 @ Q8_0/Q8_0
- 프롬프트 처리 시, ubatch=3072 & batch=3072
더 자세한 내용은 여기 저장소에서 확인 가능 (현재는 코드만 있고 바이너리는 없음, 아직 작업 중):
https://github.com/ParmesanParty/llama.cpp


