k_llama.cpp MoE 최적화: 전문가 레지던시, 하이브리드 CPU/GPU 실행, Q2_0 지원
요약
k_llama.cpp 포크 버전이 MoE(Mixture of Experts) 모델 최적화 기능을 추가했습니다. 이 버전은 대역폭 적응형 CPU/GPU 실행, 공유 전문가 레지던시 아이디어 통합, 그리고 Q2_0 양자화 지원을 제공합니다. 특히 `--moe-resident` 옵션을 통해 VRAM 제한 설정이 가능하며, GPU 유휴 컴퓨팅 용량을 활용하여 생성 속도를 향상시키는 데 초점을 맞추고 있습니다.
핵심 포인트
- MoE 모델 최적화를 위한 k_llama.cpp 포크 버전 출시
- 대역폭 적응형 CPU/GPU 실행 및 공유 전문가 레지던시 기능 통합
- Q2_0 양자화 지원으로 다양한 MoE 모델 구동 가능
- 전문가 레지던시 VRAM 제한 설정(`--moe-resident-mib`)을 통해 성능 튜닝 가능
제가 포크(fork)한 버전을 드디어 완성했습니다: https://github.com/IceFog72/ik_llama.cpp 현재로서는 추가하거나 시도하고 싶은 것이 없습니다. 요약하자면, 이 버전에는 다음 기능들이 포함되어 있습니다:
- 대역폭 적응형(Bandwidth-adaptive) CPU/GPU 실행
- https://arxiv.org/pdf/2608.16157에서 가져온 공유 전문가 레지던시 아이디어 (공식 프로파일러, 경계 캐시, 하이브리드 실행 작업에 통합)
이것은 ik_llama의 스케줄러와 양자화된 커널(quantized kernels)에 대한 적응이며, FreeToken jadidbourbaki의 n-gram 캐시 최적화 전체 구현은 아닙니다: https://github.com/jadidbourbaki/llama.cpp/pull/2 - Q2_0 지원 (주로 이러한 모델들이 실행될 수 있도록 하기 위함입니다: https://huggingface.co/ISTA-DASLab/Qwen3.8-Flash-Next-GSQ-RCO-Coder-GGUF)
설정 가능한 전문가 레지던시 VRAM 제한: --moe-resident-mib N
실험적 레지던시 옵션: --moe-resident-profiler old/new, --moe-resident-grouping off/layout
기본 사용법: -cmoe --moe-resident auto --moe-resident-mib N
제가 -ncmoe가 어떻게 작동하는지는 알지 못합니다. 제 하드웨어에서는 제대로 테스트할 수 없기 때문입니다. --moe-resident-mib N이 없으면, --moe-resident auto는 사용 가능한 모든 여유 VRAM을 레지던트 전문가로 채울 것입니다. 하지만 다음과 같이 설정하면: --moe-resident auto --moe-resident-mib 2048, 레지던트 캐시가 사용하는 VRAM 양을 제한하고 의도적으로 일부를 비워둘 수 있습니다. 이 제한은 속도를 개선하는 데 유용한 지점(cap)이 있습니다. 만약 이 제한을 너무 낮게 설정하면 성능이 떨어질 것입니다.
그리고 더 높은 생성 속도의 마법을 보십시오. 핵심은 다음과 같습니다: 이것은 전체 MoE가 VRAM에 맞지 않고 GPU에 여전히 사용되지 않은 컴퓨팅 용량과 여유 PCI 버스 속도가 있을 때만 도움이 됩니다. 만약 GPU가 이미 완전히 로드되었다면, 이 포크는 아마도 아무것도 개선하지 못할 것입니다. 만약 GPU가 약 75% 정도 놀고 있고 VRAM에 많은 레이어가 있다면, 일반 GPU 레이어 몇 개를 줄이고 다음을 사용하는 것이 가치가 있을 수 있습니다:
--moe-resident auto --moe-resident-mib 1024/2048
GPU와 사용 가능한 VRAM에 따라 제한 값을 조정하십시오. 목표는 단순히 완전히 오프로드된 레이어의 수를 최대화하는 것이 아니라, 레지던트 전문가를 사용하여 그렇지 않으면 유휴 상태인 GPU 용량을 채우는 것입니다.
제 환경(RTX 2060 6GB + Ryzen 7 2700X + 40 GB DDR 4 2993Mhz, arch 사용)에서는 유용한 가속을 위해 충분한 완전 전문가 레이어(complete expert layers)를 오프로드할 VRAM이 부족합니다. 그래서 저는 -cmoe 옵션을 사용합니다. 이 변경 사항 이전에는 생성이 GPU 활용률을 약 25-35% 정도로만 남겨두고, 완전히 로드된 CPU에 여전히 약 1.5-2GB의 VRAM이 남아있었습니다. Qwen3.6-35B-A3B-UD-Q4_K_M.gguf 모델을 컨텍스트 길이 15-30k로 사용했을 때, 기본 ik_llama.cpp는 약 23 t/s를 제공하는 반면, 이 포크(fork)는 약 26-30 t/s를 제공합니다. 따라서 제 하드웨어에서는 대략 20-30%의 속도 향상을 보고 있습니다. 더 좋은 GPU와 더 많은 VRAM을 가진 사용자들은 병목 현상이 어디에 있는지에 따라 더 나은 결과를 볼 수도 있을 것입니다. 두 가지 실험적 옵션(--moe-resident-profiler new/old, --moe-resident-grouping off/layout)는 아직 더 많은 테스트가 필요합니다. --moe-resident-profiler new/old를 사용했을 때는 CPU와 GPU 작업 분배가 좀 더 균형 잡히고, CPU에 남아있는 작업량이 약간 많고 GPU 부하가 낮아지지만, 제 환경에서는 명확한 속도 차이는 없습니다. --moe-resident-grouping off/layout 역시 특히 더 좋은 시스템에서 더 많은 테스트가 필요합니다. 때때로 이 옵션들로부터 1-2 t/s 정도의 차이를 보기도 하지만, 제 PC에서는 브라우저 탭 하나만 스니징(sneezing)해도 +/-2-4 t/s의 변화를 일으킬 수 있으므로 이를 결정적이라고 생각하지 않습니다. 제가 현재 사용하는 명령어는 다음과 같습니다: ./llama-server \ -m /mnt/Kingstone_SSD/GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf \ --alias "hz" \ --host 0.0.0.0 \ -ctk q4_0 \ -ctv q4_0 \ -ctv-first q8_0,4 \ -ctv-last q8_0,4 \ -cmoe \ -b $((6 * 512)) \ -ub $((3 * 512)) \ --ctx-size $((64 * 1024)) \ --jinja \ -fa on \ --no-mmap \ --no-context-shift \ --temp 0.6 \ --top-k 24 \ --top-p 0.95 \ --min-p 0.00 \ -ngl 999 \ -np 1 \ --samplers "penalties;dry;top_n_sigma;top_k;typ_p;top_p;min_p;xtc;temperature" \ --moe-resident auto \ --moe-resident-mib $((2 * 512)) \ --k-cache-hadamard \ --v-cache-hadamard \ --moe-resident-profiler old \ --moe-resident-grouping off 저는 이 포크를 개인적인 용도로 메인 ik_llama.cpp 브랜치와 함께 업데이트할 계획입니다. 더 많은 사람들이 테스트하고 피드백을 제공해 준다면, 특히 모델이 VRAM에 완전히 들어가지 않는 시스템의 경우, 궁극적으로 이를 상위(upstream)로 병합하기 위한 PR(Pull Request)을 만들 수도 있을 것입니다.
제출자: u/IceFog72, 커뮤니티: r/LocalLLaMA [링크] [댓글들]
AI 자동 생성 콘텐츠
본 콘텐츠는 r/OpenAI Codex (search)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기