treeru.com
AI

MoE vs Dense 실전 비교 — Qwen3-30B-A3B가 14B보다 느린 이유

2026-03-04
Treeru

MoE(Mixture of Experts)는 30B 파라미터 중 3B만 활성화하므로 효율적이다 — 이론적으로는 맞습니다. 그런데 실측하면 이야기가 달라집니다. Qwen3-30B-A3B(MoE)와 Qwen3-14B(Dense)를 같은 GPU에서 직접 비교하면, 14B가 1.9배 빠르고 VRAM도 절반입니다. 게다가 CPU+GPU 하이브리드 추론(KTransformers)은 완전히 실패했습니다. 왜 실패했는지 18,432개 가중치를 전수 조사해서 원인을 찾았습니다.

2.1배

VRAM 차이 (30B vs 14B)

1.9배

속도 차이 (14B가 빠름)

18,432

전수 조사한 가중치 수

0.78

오류 레이어 cosine sim

MoE란

MoE(Mixture of Experts)는 하나의 레이어에 여러 개의 "전문가(Expert)" 네트워크를 두고, 입력 토큰마다 라우터가 소수의 전문가만 활성화하는 구조입니다. Qwen3-30B-A3B의 경우 총 30B 파라미터이지만, 각 토큰을 처리할 때 3B만 활성화됩니다.

MoE (Qwen3-30B-A3B)

총 파라미터30B
활성 파라미터3B
레이어 수48
Expert 수/레이어128
활성 Expert8/128

이론적 장점: 30B 수준의 지식 + 3B 수준의 연산

Dense (Qwen3-14B)

총 파라미터14B
활성 파라미터14B (전체)
레이어 수40
Expert 수/레이어없음 (단일)
활성 Expert해당 없음

모든 파라미터가 매 토큰마다 활성화

MoE의 이론적 매력은 분명합니다. 30B의 지식 용량에 3B의 연산 비용이라면 꿈의 조합입니다. 하지만 현실에서는 30B 전체 가중치를 메모리에 올려야 합니다. 활성화가 3B여도 나머지 27B가 VRAM에 상주해야 라우팅이 가능하기 때문입니다. 이것이 실측에서 MoE가 불리한 근본 이유입니다.

실측 비교 — VRAM, 속도, KV 캐시

동일 GPU(RTX PRO 6000, 96GB)에서 두 모델을 BF16 전정밀도로 로드하고, 동일 프롬프트로 생성 속도를 측정했습니다.

항목Qwen3-30B-A3B (MoE)Qwen3-14B (Dense)차이
VRAM 사용량56.9GB27.5GBMoE 2.1배
생성 속도 (tok/s)22.041.4Dense 1.9배 빠름
KV 캐시 여유39.1GB68.5GBDense 1.8배 여유
최대 동시 사용자 (추정)~8명~20명Dense 2.5배
활성 파라미터3B14BDense 4.7배 많음

모든 지표에서 14B Dense가 압도적으로 우세합니다. MoE는 활성 파라미터가 3B뿐이라 연산은 가볍지만, 30B 전체를 VRAM에 올리므로 메모리 대역폭 병목이 생깁니다. GPU의 HBM 대역폭으로 30B를 읽고 3B만 연산하니, 14B 전체를 읽고 14B를 연산하는 Dense보다 오히려 비효율적입니다.

AWQ 양자화 적용 시: AWQ 양자화를 적용하면 14B-AWQ는 9.4GB VRAM에 135tok/s를 달성합니다. 30B MoE의 BF16(56.9GB, 22tok/s)과 비교하면 VRAM 6배 절약, 속도 6배 향상입니다. SGLang 서빙까지 더하면 격차는 더 벌어집니다.

하이브리드 추론 시도

MoE의 VRAM 문제를 해결하기 위해 KTransformers를 시도했습니다. KTransformers는 Expert 가중치를 CPU 메모리에 두고, 활성화된 Expert만 GPU로 전송하는 하이브리드(CPU+GPU) 추론 프레임워크입니다. 이론적으로 30B MoE를 16GB GPU에서도 돌릴 수 있습니다.

시도한 설정

프레임워크KTransformers v0.3
모델 포맷GGUF (Q4_K_M, Q6_K, Q8_0)
GPU 레이어어텐션 + 라우터 (GPU)
CPU 레이어Expert 가중치 128개 × 48레이어 (CPU → GPU 스트리밍)
시스템 RAM128GB DDR5

결과: 완전한 실패

Q4_K_M, Q6_K, Q8_0 — 모든 GGUF 양자화 포맷에서 의미 없는 텍스트(garbage output)가 생성되었습니다. 한국어 프롬프트에 대해 깨진 토큰, 반복된 특수문자, 문맥과 무관한 단어 나열이 출력됩니다. 동일 모델을 llama-cpp-python으로 로드하면 정상 동작하므로, 모델 자체의 문제가 아닙니다.

KTransformers 출력 예시:

```△◇▽ 하 하하 ====== 제품 제품 제품... [2048 토큰까지 반복]```

llama-cpp-python은 동일 GGUF를 정상적으로 추론합니다. 차이점은 연산 방식입니다. llama-cpp-python은 인라인 dequantize + f32 누적 matmul로 높은 수치 정밀도를 유지하지만, KTransformers는 bf16으로 dequantize 후 GPU에서 bf16 matmul을 수행합니다. 이 정밀도 차이가 문제의 핵심입니다. 왜 bf16이 문제가 되는지, 가중치를 하나하나 조사해봤습니다.

실패 디버깅 — 18,432개 가중치 전수 조사

MoE 모델의 Expert 가중치는 48레이어 × 128 Expert × 3 projection(gate/up/down) = 18,432개입니다. 각 가중치에 대해 GGUF 양자화 값을 bf16으로 dequantize한 후, 원본 bf16 값과의 cosine similarity를 측정했습니다.

조사 방법

1

원본 bf16 가중치와 GGUF Q4_K_M 양자화 가중치를 각각 로드

2

GGUF 가중치를 bf16으로 dequantize (KTransformers와 동일한 방식)

3

18,432개 가중치 각각에 대해 원본과의 cosine similarity 계산

4

cosine similarity가 0.95 미만인 가중치를 이상치로 분류

5

이상치 가중치를 포함한 레이어의 hidden state를 순전파로 추적

18,432개 중 대부분은 cosine similarity 0.98 이상으로 양호했습니다. 하지만 Layer 2의 Expert 92, down_proj에서 cosine similarity가 0.78까지 하락했습니다. 이 하나의 가중치가 전체 모델을 망가뜨린 원인입니다.

레이어위치Cosine Sim영향
Layer 2Expert 92, down_proj0.78hidden state 왜곡 시작점
Layer 5Expert 41, gate_proj0.91라우팅 오류 유발
Layer 12Expert 103, up_proj0.93중간 레이어 오류 누적 가속
나머지18,429개 가중치≥ 0.98정상 범위

Layer 2에서 발생한 hidden state 왜곡이 나머지 46개 레이어를 통과하면서 기하급수적으로 누적됩니다. 초기 레이어의 작은 오류가 순전파(forward pass)를 거치며 증폭되어, 최종 출력에서는 완전히 의미 없는 토큰이 생성됩니다. Dense 모델에서는 이런 문제가 발생하지 않는데, Expert가 128개씩 분리되지 않으므로 개별 가중치의 양자화 오류가 전체에 분산되기 때문입니다.

근본 원인 — GGUF 양자화 정밀도 손실

문제의 체인은 이렇습니다:

1

GGUF 양자화

bf16 원본 → Q4_K_M/Q6_K 양자화 시, 특정 Expert의 가중치 분포가 양자화 격자(grid)에 잘 맞지 않아 큰 오차 발생

2

bf16 dequantize

KTransformers가 GGUF를 bf16으로 복원할 때, 양자화 오차 + bf16 정밀도 한계(유효 7비트)가 결합되어 오차 증폭

3

Expert 격리 효과

MoE는 Expert가 독립적이므로, 하나의 Expert 오류가 다른 Expert로 보정되지 않음. Dense는 전체 가중치가 연결되어 오류가 분산됨

4

순전파 누적

48레이어를 통과하며 초기 레이어의 오류가 기하급수적으로 누적. Layer 2의 cosine sim 0.78 → Layer 48에서 출력 완전 붕괴

llama-cpp-python은 왜 정상인가?

llama-cpp-python은 인라인 dequantize + f32 누적 matmul을 사용합니다. 양자화된 가중치를 f32(유효 23비트)로 복원하고, 행렬곱도 f32로 누적합니다. bf16(유효 7비트) 대비 정밀도가 3배 이상 높으므로, 동일한 양자화 오차가 있어도 순전파 과정에서 오류가 상쇄됩니다. 대신 속도는 느립니다 — 정밀도와 속도의 트레이드오프입니다.

정리하면, GGUF 양자화 자체가 문제가 아니라 "GGUF + bf16 dequantize + MoE의 Expert 격리"라는 세 가지 조건이 동시에 만족될 때 발생하는 문제입니다. Dense 모델에서는 Expert 격리가 없으므로 같은 GGUF + bf16 조합이어도 정상 동작합니다. MoE 특유의 구조적 취약점입니다.

결론

MoE vs Dense의 결론은 현 시점에서 명확합니다.

선택 가이드

상황추천이유
VRAM 충분 (24GB+)Dense + AWQ14B-AWQ 9.4GB, 135tok/s. MoE 대비 모든 지표 우위
VRAM 제한 (16GB)작은 Dense (8B-AWQ)5.2GB VRAM, 208tok/s. MoE보다 빠르고 안정적
VRAM 극소 (8GB)Dense 8B-AWQMoE는 GGUF 하이브리드 추론 시 정밀도 문제 위험
최고 품질 필요Dense 14B-AWQ종합 3.86점 1위. MoE 30B보다 품질·속도 모두 우수

현재 로컬 LLM 환경에서 MoE를 선택할 이유가 없습니다. VRAM이 충분하면 Dense + AWQ가 모든 면에서 우수하고, VRAM이 부족하면 작은 Dense 모델이 MoE의 하이브리드 추론보다 안정적입니다. MoE는 클라우드 환경에서 수백 GPU로 분산 추론할 때 진가를 발휘하는 구조이지, 단일 GPU 로컬 환경에서는 구조적 오버헤드만 남습니다.

다만 이 결론은 현재 시점의 양자화 기술과 추론 프레임워크 한계에 기반합니다. KTransformers가 f32 dequantize를 지원하거나, MoE 전용 양자화 포맷이 등장하면 상황이 바뀔 수 있습니다. 그때까지는 Qwen3-14B-AWQ가 로컬 LLM의 최적 선택입니다.

참고: 이 디버깅 결과는 Qwen3-30B-A3B + KTransformers 조합에서 확인된 것입니다. 다른 MoE 모델(Mixtral, DBRX 등)에서는 Expert 수와 양자화 특성이 다르므로 결과가 다를 수 있습니다. 하지만 "MoE + GGUF + bf16 dequantize"의 구조적 위험은 동일하게 존재합니다.

T

Treeru

웹 개발, IT 인프라, AI 솔루션 분야의 실무 인사이트를 공유합니다. 기업의 디지털 전환을 돕는 IT 파트너, Treeru입니다.

공유

댓글

(4개)
4.85/ 5

로그인하면 댓글을 작성할 수 있습니다.

2026-03-04
555.0

18,432개 가중치 전수 조사는 인터넷에서 본 적 없는 수준의 디버깅입니다. KTransformers garbage output으로 며칠째 고생하고 있었는데, GGUF 양자화 + bf16 dequantize 조합이 원인이었군요.

2026-03-04
4.954.9

MoE가 이론상 VRAM 효율적이라는 통념을 실측으로 깨트리는 글입니다. 30B 전체 가중치를 로드하면서 3B만 활성화하면, VRAM 대비 실효 성능이 Dense보다 낮을 수밖에 없죠.

2026-03-04
4.854.8

Layer 2 Expert 92 down_proj에서 cosine similarity 0.78이라는 구체적인 수치가 인상적입니다. 레이어별 hidden state 추적으로 오류 누적 패턴을 시각화한 부분도 좋습니다.

관련 글

© 2026 TreeRU. All rights reserved.

본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.