전문가(Expert) 우선 llama.cpp 구현
Experts first llama.cpp
핵심 요약
VRAM이 부족한 환경에서 MoE 모델의 자주 쓰이는 전문가(Expert)를 GPU에 캐싱하여 성능을 극대화하는 llama.cpp 포크 프로젝트.
- VRAM 최적화 — 12GB VRAM 환경에서 MoE 모델의 자주 사용하는 전문가만 GPU에 올려 성능 향상함.
- 성능 개선 — Qwen/Gemma 모델 테스트 결과, 기존 대비 토큰 생성 속도가 유의미하게 상승함.
- 기술적 접근 — CPU에 할당되던 MoE 레이어 대신, 자주 호출되는 전문가를 VRAM 캐시에 동적으로 배치함.
- 커뮤니티 테스트 — 리눅스 환경에서 3060/4060 등 다양한 GPU를 대상으로 성능 검증을 요청함.
12GB VRAM을 가진 모든 분들을 위한 글입니다.
레이어 대신 전문가(Expert)를 사용하는 실험적인 구현을 포함한 llama.cpp 포크를 만들었습니다. 이유는 제가 12GB VRAM을 가진 RTX 2060을 사용하기 때문입니다. 12GB면 커 보이지만, 밀집(dense) 모델을 돌리기엔 너무 작습니다. 그래서 주로 MoE 모델을 사용하는데, 문제는 일부 레이어를 CPU로 분산시켜야 한다는 점입니다.
다들 아시다시피 Qwen3.6-35B-A3B는 토큰당 8개의 전문가만 사용합니다. 나머지는 사용되지 않는데, 왜 사용되지 않는 전문가로 가득 찬 전체 레이어 대신, 필요한 전문가만 VRAM에 채워 넣지 않는 걸까요?
어떤 전문가가 사용되는지 모니터링하는 UI를 만들기 시작했습니다. 테스트 결과, 마지막 레이어보다 첫 번째 레이어를 VRAM에 올리는 것이 더 중요하다는 것을 알게 되었습니다. 첫 번째 레이어의 전문가가 다른 레이어보다 더 자주 바뀌기 때문입니다. 불행히도 llama.cpp의 n-cpu-moe는 첫 번째 레이어를 CPU에 남겨두기 때문에 -ot 옵션을 시도해 봤지만, 그건 또 다른 이야기입니다. 최적화된 설정으로 약 22 tk/s를 달성할 수 있었습니다. (2060은 3060의 CUDA 코어 절반 정도밖에 안 된다는 점을 기억하세요.) 기본 --n-cpu-moe를 사용하면 19 tk/s가 나옵니다.
코딩 시 성능 저하가 눈에 띄어서 Q6 모델만 실행합니다. 제 컨텍스트는 양자화되지 않았고(같은 이유로), Java 개발 때문에 100k의 큰 컨텍스트 윈도우가 필요합니다.
하지만 제 전문가 변형 버전을 사용하고 약 62%의 적중률을 기록했을 때, 26 tk/s로 증가했습니다. 손익분기점은 42% 적중률이었습니다. 즉, 프롬프트가 캐시에 있는 GPU 상의 전문가 중 42%를 사용했다는 뜻입니다. 더 작은 RAM 크기(VRAM 사용량을 지정하는 내장 인수)를 테스트하면서 다른 활용 사례가 떠올랐습니다. 좋은 프로필을 사용하면 속도 저하 없이 사용량을 크게 줄일 수 있습니다.
이제 질문입니다. 테스트해 보실 분 계신가요? 3060/4060이나 비슷한 환경에서 어떻게 작동하는지 정말 알고 싶습니다. (CUDA는 필수이며, Qwen 35B A3B나 Gemma 26B A4B 모델이 필요합니다.) 현재 리눅스에서만 테스트되었습니다.
정말이지, 별점 같은 건 받고 싶지 않습니다. 관심 없습니다. 그냥 어떤 NVIDIA 그래픽 카드에서 토큰 생성 속도가 얼마나 증가하는지 알고 싶을 뿐입니다.
다음 과정을 따라야 합니다: https://github.com/adrianhoehne/llama.cpp를 체크아웃하고 빌드하세요.
다음 추가 인수를 사용하여 시작하세요:
./build/bin/llama-server --moe-layer-perf-out experts.json \
--cpu-moe \
--ctx-size 100000 \
--parallel 1
그런 다음 프롬프트를 시작하고 기다리세요. 모든 전문가가 여전히 CPU에 있기 때문에 평소보다 오래 걸릴 것입니다.
그 후, 인수를 다음과 같이 교체하세요:
./build/bin/llama-server --moe-hot-cache experts.json \
--moe-hot-cache-max-mib -1 \
--moe-hot-cache-auto-reserve-mib 1024 \
--moe-hot-cache-update-rate 0.10 \
--cpu-moe \
--ctx-size 100000 \
--parallel 1

