-
llama-cpp의 --cpu-moe 옵션을 활용해 MOE 전문가 레이어를 CPU에서 처리하고, 주의(attention) 레이어만 GPU에 오프로드해 5~8GB VRAM으로 빠른 프리필 성능을 구현
- GPU에는 KV 캐시, Attention 가중치·활성값, 라우팅 테이블, LayerNorm 등 비전문가 파라미터만 상주해 메모리 사용량이 낮음
- RTX 3060Ti급 GPU와 64GB~96GB 시스템 RAM으로도 120B 모델을 가볍게 구동 가능하며, BF16 지원 GPU(RTX 3000+)에서 최적 성능을 발휘함
- 5GB VRAM 사용 시 토큰당 8.15ms(122.66 토큰/초) 성능을 기록했고, 8GB VRAM 사용 시 7.44ms(134.44 토큰/초)까지 개선됨
- 120B 구조는 소비자용 하드웨어에 최적화된 설계로, GPU 자원이 부족한 환경에서도 고속 실행이 가능함
CPU-MOE와 GPU 오프로딩 구조
-
--cpu-moe 옵션으로 전문가(MOE) 레이어를 전부 CPU에서 처리
- 예: --n-cpu-moe 36 → 36개 MOE 블록 전부 CPU 실행
- 필요 시 일부 MOE만 GPU로 옮겨 성능 조정 가능
- GPU에는 다음만 상주시켜 VRAM 절약
- KV 캐시(시퀀스)
- Attention 가중치와 활성값
- 라우팅 테이블
- LayerNorm 및 기타 비전문가 파라미터
- MOE 가중치는 GPU에 상주하지 않아 대형 MLP 파라미터 부담 없음
메모리 및 하드웨어 요구사항
- GPU: 5~8GB VRAM으로 충분 (예: RTX 3060Ti)
- GPU는 BF16 지원 시 최적 (RTX 3000 시리즈 이상)
- 시스템 RAM: 최소 64GB, 이상적으로는 96GB
- Linux mmap을 활용해 전체 모델이 메모리에 안 들어가도 ‘핫’ 전문가 레이어는 메모리에 유지
성능 수치
5GB VRAM 환경
- 프롬프트 처리: 8.15ms/토큰 (122.66 토큰/초)
- 추론: 55.44ms/토큰 (18.04 토큰/초)
8GB VRAM 환경 (--n-cpu-moe 36, 나머지 GPU)
- 프롬프트 처리: 7.44ms/토큰 (134.44 토큰/초)
- 추론: 39.03ms/토큰 (25.62 토큰/초)
22GB VRAM 환경 (MOE 일부 GPU)
- 프롬프트 처리: 6.13ms/토큰 (163.01 토큰/초)
- 추론: 32.45ms/토큰 (30.82 토큰/초)
결론
- GPT-OSS-120B의 설계는 소비자용 하드웨어에서도 대규모 모델을 고속 실행하도록 최적화됨
- VRAM 사용량을 줄이면서도 속도를 유지하는 CPU-MOE 구조 덕분에 GPU 리소스가 제한된 환경에 특히 적합함
핵심 질문 & 답변 내용
Q1. 이 설정에서 실제 VRAM 사용량은 얼마나 되나요?
-
원 작성자: MOE 전부 CPU 실행 시 약 5GB VRAM, 주의 레이어만 GPU로 올림
-
추가 설명: GPU에는 KV 캐시, Attention 가중치·활성값, 라우팅 테이블, LayerNorm만 상주
Q2. RAM은 최소 얼마가 필요한가요?
-
원 작성자: 최소 64GB, 이상적으론 96GB 권장
-
이유: Linux mmap이 '핫' 전문가 레이어를 메모리에 유지해 전체 모델 적재 없이도 빠른 접근 가능
Q3. 일부 MOE 레이어를 GPU로 옮기면 속도가 많이 빨라지나요?
-
원 작성자: 약간 빨라질 수 있지만 큰 차이는 없음
-
예시:
- MOE 전부 CPU: 프롬프트 134토큰/초, 추론 25토큰/초
- MOE 8개 GPU: 프롬프트 163토큰/초, 추론 30토큰/초
- VRAM 사용량은 22GB로 증가
Q4. 어떤 GPU가 적합한가요?
-
원 작성자: RTX 3060Ti 이상이면 충분, BF16 지원(RTX 3000+) 권장
-
이유: MOE 외 모든 레이어가 BF16로 동작
Q5. 명령어 세팅은 어떻게 하나요?
-
원 작성자: PR #15157 기준 예시 제공
~/build/llama.cpp/build-cuda/bin/llama-server \
-m $LLAMA_MODEL_DIR/gpt-oss-120b-mxfp4-00001-of-00003.gguf \
--n-cpu-moe 36 \
--n-gpu-layers 999 \
-c 0 -fa \
--jinja --reasoning-format none \
--host 0.0.0.0 --port 8502 --api-key "dummy"