200달러짜리 구형 GTX 1080(8GB VRAM)에서 30B MoE 모델 24+ tok/s 구동하기
24+ tok/s from ~30B MoE models on an old GTX 1080 (8 GB VRAM, 128k context)
핵심 요약
200달러 수준의 중고 PC와 llama.cpp의 MoE 오프로딩 기술을 활용해 구형 GTX 1080에서 30B급 모델을 쾌적하게 구동한 사례.
- MoE 오프로딩 — 시스템 RAM과 GPU를 활용해 VRAM 부족을 해결하고 PCIe 대역폭을 최대로 활용함.
- MTP 최적화 — 임베딩 테이블을 GPU로 강제 이동시켜 Gemma 4의 추론 속도를 약 22% 향상함.
- 하드웨어 가성비 — 200달러 수준의 중고 부품 조합으로 128k 컨텍스트의 대형 모델을 구동함.
- 설정 난관 — 구형 파스칼 아키텍처와 최신 CUDA/GCC 환경 간의 호환성 문제를 패치로 해결함.
저는 Qwen 3.6 35B-A3B와 Gemma 4 26B-A4B를 200달러짜리 중고 기기(i7-6700 / GTX 1080 / 32GB RAM)에서 llama.cpp를 사용하여 구동했습니다(TurboQuant/RotorQuant KV 캐시 양자화 덕분에 8GB VRAM 내에서 128k 컨텍스트가 가능합니다).
결과 (Q4_K_M 모델, 128k 컨텍스트):
|모델|tok/s|주요 플래그|
|:-|:-|:-|
|Qwen 3.6 35B-A3B|~24| --n-cpu-moe 30, K=turbo4 V=turbo3|
|Gemma 4 26B-A4B (MTP 없음) |~20|--n-cpu-moe 20, K=V=turbo3, --flash-attn|
|Gemma 4 26B-A4B + MTP (기본)|~21|임베딩 테이블이 CPU에 위치|
|Gemma 4 26B-A4B + MTP (수정)|~24.5|--override-tensor-draft "token_embd.weight=CUDA0"|
비결은 MoE 오프로딩입니다. llama.cpp는 사용하지 않는 전문가 가중치를 시스템 RAM에 두고 PCIe를 통해 GPU로 스트리밍하는 동시에, 활성 레이어와 KV 캐시는 GPU에 유지할 수 있습니다. 시스템은 완전히 PCIe 대역폭 제한을 받고 있습니다(GPU 사용률은 40~50% 수준이지만 PCIe 3.0 x16 대역폭은 최대치에 도달함).
가장 큰 발견: Gemma 4의 MTP 추측 디코딩은 기본 설정에서는 거의 도움이 되지 않습니다(약 5% 향상). 알고 보니 llama.cpp가 토큰 임베딩 테이블을 무조건 CPU에 유지하고 있더군요. 보통은 괜찮지만(단순한 get_rows 조회), Gemma 4의 MTP 어시스턴트는 LM 헤드가 연결되어 있어서 모든 초안 토큰마다 PCIe를 가로질러 262k×1024 행렬 곱셈을 수행하게 됩니다. --override-tensor-draft를 사용하여 GPU로 강제 이동시키면 실제 약 22%의 속도 향상과 약 79%의 초안 수락률을 얻을 수 있습니다.
설정 시 어려웠던 점 (Fedora 42 + Pascal GPU):
- akmod-nvidia를 580xx 브랜치로 고정 (Pascal은 레거시로 전환 중)
- CUDA 12.9를 위해 gcc-14 강제 사용 (최신 gcc는 거부됨)
- glibc 2.41 호환성을 위해 CUDA의 math_functions.h 패치
- TurboQuant 캐시와 Gemma MTP 지원을 위해 AtomicBot-ai/atomic-llama-cpp-turboquant 포크 사용
모든 빌드 세부 사항이 담긴 전체 블로그 포스트 (모든 명령어와 MTP 임베딩 테이블 문제에 대한 디버깅 심층 분석 포함)
조만간 유튜브 영상 가이드도 올릴 예정입니다. 영상이 준비되면 업데이트하겠습니다.
설정에 대해 궁금한 점이 있다면 언제든 물어봐 주세요.



