1. 개요
MoE(Mixture of Experts)는 트랜스포머 층 안의 FFN(피드포워드 네트워크)을 전문가(expert) 여러 개로 나누고, 라우터가 토큰마다 점수가 높은 몇 개만 골라 계산하게 한 구조다. 고르지 않은 전문가는 그 토큰에 대해 계산하지 않는다.
한 층 안에서 토큰마다 전문가 몇 개만 계산한다 — 층마다 다시 고른다
| 용어 | 뜻 |
|---|---|
| 전문가 | FFN 하나. 층마다 여러 개가 있다 |
| 라우터(게이트) | 토큰 벡터를 보고 전문가마다 점수를 매기는 작은 층 |
| top-k | 토큰마다 고르는 전문가 수 |
| 활성 파라미터 | 토큰 하나를 처리할 때 실제로 쓰는 파라미터 수 |
2. 전체 파라미터와 활성 파라미터
MoE 모델의 이름에는 두 숫자가 붙는다. Qwen3-30B-A3B 는 전체 30B, 활성(Active) 3B 라는 뜻이다.
연한 막대 = 메모리에 올려야 하는 전체. 진한 막대 = 토큰 하나에 읽고 계산하는 활성
| 모델 | 전체 | 활성 | 전문가 (고르는 수) |
|---|---|---|---|
| Qwen3-8B | 8.2B | 8.2B | dense |
| Qwen3-30B-A3B | 30.5B | 3.3B | 128 (8) |
| gpt-oss-20b | 21B | 3.6B | 32 (4) |
| Mixtral 8x7B | 47B | 13B | 8 (2) |
| 숫자 | 정하는 것 |
|---|---|
| 전체 | GPU 메모리에 올릴 크기. 쓰지 않는 전문가도 다 올려 둔다 |
| 활성 | 토큰 하나에 드는 계산량, 그리고 혼자일 때 읽는 가중치 양 |
3. 왜 decode 가 빠른가
decode 는 토큰 하나를 만들 때마다 가중치를 메모리에서 읽는다. 혼자 쓸 때 토큰 간격은 대략 읽는 바이트 ÷ 메모리 대역폭에 묶인다(KV 캐시 1장).
| 모델 (L40S 864GB/s) | 토큰 하나에 읽는 가중치 | 이론 하한 | 실측 ITL (동시 1) |
|---|---|---|---|
| Qwen3-8B (dense BF16) | 16.4GB | 19ms | 22ms |
| Qwen3-30B-A3B (FP8) | 약 3.3GB | 4ms | 8ms |
전체 크기는 Qwen3-30B-A3B 가 네 배 가까이 크지만, 토큰 하나에 읽는 양이 적어 더 빠르다. 실측이 하한보다 큰 차이는 라우팅, attention, KV 캐시 읽기 같은 고정 비용이다.
4. 동시 요청이 많을 때
여러 요청을 한 번에 묶으면 토큰마다 고르는 전문가가 다르다. 묶은 토큰이 많을수록 거의 모든 전문가를 읽게 된다.
혼자일 때 MoE 가 빠른 이유와, 동시가 커질수록 그 차이가 줄어드는 이유가 같은 그림이다
| 동시 요청 | 읽는 양 | 결과 |
|---|---|---|
| 적음 | 활성 크기에 가깝다 | dense 보다 훨씬 빠르다 |
| 많음 | 전체 크기에 가까워진다 | 읽기 이점은 줄고, 계산량(활성)이 작다는 이점이 남는다 |
학습할 때는 토큰이 일부 전문가에 몰리지 않도록 부하 균형 손실(load balancing loss)을 더한다. 서빙에서도 전문가 쏠림은 GPU 여러 장에 전문가를 나눠 둘 때(expert parallel) 한 장이 늦어지는 원인이 된다.
5. 서빙에서 고를 때
| 상황 | MoE | dense |
|---|---|---|
| GPU 메모리 | 전체 크기만큼 필요 — 큰 편 | 같은 품질이면 작은 편 |
| 혼자일 때 속도 | 활성만큼만 읽어 빠르다 | 전체를 읽는다 |
| 높은 동시 | 이점이 줄지만 계산이 가볍다 | 연산과 대역폭 모두 무겁다 |
| GPU 여러 장 | 전문가를 나눠 둘 수 있다(expert parallel) | 텐서 병렬 |
L40S 한 장 실측에서 MoE 두 모델은 혼자일 때 dense Qwen3-8B 보다 토큰 간격이 2~3배 짧았고, SLA 안 최대 동시는 gpt-oss-20b 32, Qwen3-30B-A3B 16 으로 Qwen3-8B(16)와 같거나 많았다.
6. 관련 문서
- ITL — 토큰 사이 간격
- Concurrency — 동시 요청과 지연이 꺾이는 지점
- KV 캐시 — MoE 여도 줄지 않는 요청마다의 메모리