밀집(dense) 70B 트랜스포머(Transformer)는 모든 토큰(token)에 대해 모든 파라미터(parameter)를 활성화합니다. 671B MoE는 토큰당 37B만 활성화하면서도 모든 벤치마크(benchmark)에서 앞섭니다. 희소성(sparsity)은 지난 10년간 가장 중요한 스케일링(scaling) 아이디어입니다.
유형: Build
언어: Python
선수 지식: Phase 7 · 05 (Full Transformer), Phase 7 · 07 (GPT)
예상 시간: 약 45분
문제
밀집 트랜스포머(dense transformer)의 추론 시점 FLOPs는 파라미터 수와 같습니다. 순전파(forward pass)까지 고려하면 그 두 배가 됩니다. 밀집 모델을 키우면 모든 토큰이 전체 비용을 그대로 지불해야 합니다. 2024년 무렵 프런티어(frontier) 모델은 연산 벽(compute wall)에 부딪혔습니다. 의미 있게 더 똑똑해지려면 토큰당 FLOPs를 지수적으로 늘려야 했기 때문입니다.
전문가 혼합(Mixture of Experts; MoE)은 이 연결 고리를 끊어냅니다. 각 피드포워드 네트워크(Feed-Forward Network; FFN)를 E개의 독립적인 전문가(expert)와, 토큰마다 k개의 전문가를 고르는 라우터(router)로 대체합니다. 전체 파라미터 수는 E × FFN_size이고, 토큰당 활성 파라미터(active parameter) 수는 k × FFN_size입니다. 2026년의 전형적인 구성은 E=256, k=8입니다. 저장 공간은 E에 비례해 늘어나고, 연산량은 k에 비례해 늘어납니다.
2026년의 프런티어는 거의 전부 MoE입니다. DeepSeek-V3(671B 전체 / 37B 활성), Mixtral 8×22B, Qwen2.5-MoE, Llama 4, Kimi K2, gpt-oss가 대표적입니다. Artificial Analysis의 독립 리더보드(independent leaderboard) 상위 10개 오픈소스 모델은 전부 MoE 계열입니다.
사전 테스트
2문제 · 이 강의를 시작하기 전에 얼마나 알고 있는지 확인해보세요
1.DeepSeek-V3는 전체 파라미터 671B 중 토큰당 37B만 활성화합니다. MoE는 트랜스포머 블록의 어떤 구성 요소를 대체하여 이 희소성(sparsity)을 달성하나요?
2.MoE 학습에서 부하 분산(load balancing)이 핵심 문제인 이유는 무엇인가요?
0/2 답변 완료
개념
FFN 교체(FFN swap)
밀집 트랜스포머 블록(dense transformer block)은 다음과 같습니다.
h = x + attn(norm(x))
h = h + FFN(norm(h))
MoE 블록은 다음과 같이 바뀝니다.
h = x + attn(norm(x))
scores = router(norm(h)) # (N_tokens, E)
top_k = argmax_k(scores) # 토큰마다 E개 중 k개 선택
h = h + sum_{e in top_k}(
gate(scores[e]) * Expert_e(norm(h))
)
각 전문가는 독립적인 FFN이며, 보통 SwiGLU 계열로 만듭니다. 라우터는 단일 선형 계층(single linear layer)입니다. 각 토큰은 자신에게 맞는 k개의 전문가를 직접 고르고, 그 전문가들의 출력에 게이트(gate)를 적용해 가중 평균한 결과를 받습니다.
부하 분산(load balancing) 문제
라우터가 토큰의 90%를 3번 전문가에게만 보낸다면, 나머지 전문가는 학습 신호를 받지 못한 채 굶게 됩니다. 지금까지 다음 세 가지 해결책이 시도되었습니다.
보조 부하 분산 손실(Auxiliary load-balancing loss) (Switch Transformer, Mixtral). 전문가별 사용량 분산(variance)에 비례하는 페널티(penalty)를 손실에 더합니다. 잘 작동하지만 하이퍼파라미터(hyperparameter)가 늘고, 두 번째 그래디언트 신호(gradient signal)가 함께 들어옵니다.
전문가 용량과 토큰 드랍(Expert capacity + token dropping) (초기 Switch). 각 전문가는 최대 C × N/E개의 토큰만 처리하고, 초과한 토큰은 해당 계층을 건너뜁니다. 품질에 손해가 큽니다.
보조 손실 없는 균형(Auxiliary-loss-free balancing) (DeepSeek-V3). 전문가별로 학습되는 편향(learned bias)을 더해 라우터의 top-k 선택을 조정합니다. 이 편향은 학습 손실 밖에서 갱신되므로 본래 목적 함수(main objective)에는 추가 페널티가 붙지 않습니다. 2024년의 큰 돌파구였습니다.
DeepSeek-V3의 방식은 다음과 같습니다. 매 학습 단계 뒤에 전문가별 사용량이 목표치보다 높은지 낮은지를 보고, 편향을 ±γ만큼 미세하게 조정합니다. 선택(selection)에는 scores + bias를 쓰지만, 게이팅(gating)에 사용되는 확률은 손대지 않은 원래의 scores 그대로입니다. 라우팅(routing)과 표현(expression)을 분리한 셈입니다.
공유 전문가(shared expert)
DeepSeek-V2/V3는 전문가를 다시 공유(shared) 전문가와 라우팅(routed) 전문가로 나눕니다. 모든 토큰은 공유 전문가를 반드시 통과하고, 라우팅 전문가는 top-k로 선택됩니다. 공유 전문가는 공통 지식(common knowledge)을 담당하고, 라우팅 전문가는 특정 패턴에 특화(specialize)됩니다. V3는 공유 전문가 1개와 라우팅 전문가 256개 중 top-8을 사용합니다.
세분화된 전문가(fine-grained expert)
고전적 MoE(GShard, Switch)에서는 전문가 하나가 일반 FFN과 동일한 폭(width)을 가집니다. E는 작고(864), k도 작습니다(12).
현대적 세분화 MoE(DeepSeek-V3, Qwen-MoE)는 전문가를 더 좁게 만듭니다. 보통 FFN 크기의 1/8 수준입니다. E는 크고(256개 이상), k도 더 큽니다(8개 이상). 전체 파라미터 수는 비슷하게 유지되지만, 가능한 조합의 수는 훨씬 빠르게 늘어납니다. C(256, 8) = 400조개에 달하는 토큰별 "전문가" 조합이 만들어집니다. 품질은 올라가고 지연 시간(latency)은 거의 그대로입니다.
비용 구조(cost profile)
토큰당, 계층당 비용은 다음과 같이 달라집니다.
구성(Config)
토큰당 활성 파라미터(Active params / token)
전체 파라미터(Total params)
Mixtral 8×22B
~39B
141B
Llama 3 70B (dense)
70B
70B
DeepSeek-V3
37B
671B
Kimi K2 (MoE)
~32B
1T
DeepSeek-V3는 Llama 3 70B 밀집 모델보다 토큰당 활성 FLOPs를 더 적게 쓰면서도 거의 모든 벤치마크에서 앞섭니다. 파라미터가 많다는 것은 더 많은 지식을, 활성 FLOPs가 많다는 것은 토큰당 더 많은 연산을 뜻합니다. MoE는 이 둘을 분리해 줍니다.
단점: 메모리(memory)
실제로 어떤 전문가가 활성화되는지와 무관하게, 모든 전문가의 가중치(weight)는 GPU 메모리에 올라가 있어야 합니다. 671B 모델은 fp16 가중치만으로도 약 1.3 TB의 VRAM을 차지합니다. 프런티어급 MoE 배포에는 전문가 병렬화(expert parallelism)가 필수입니다. 전문가들을 여러 GPU에 분산(shard)하고, 토큰을 네트워크 너머로 라우팅합니다. 이때 지연 시간은 행렬 곱(matmul)이 아니라 전(全) 대 전(all-to-all) 통신에 지배됩니다.
직접 만들기
code/main.py를 함께 봅니다. 순수 표준 라이브러리만으로 작은 MoE 계층을 구현합니다.
n_experts=8개의 SwiGLU 유사 전문가(설명을 위해 선형 계층 하나로 단순화)
top-k=2 라우팅
소프트맥스(softmax)로 정규화한 게이트 가중치
전문가별 편향을 활용한 보조 손실 없는 균형(auxiliary-loss-free balancing)
Step 1: 라우터(router)
defroute(hidden, W_router, top_k, bias):
scores = [sum(h * w for h, w inzip(hidden, W_router[e])) for e inrange(len(W_router))]
biased = [s + b for s, b inzip(scores, bias)]
top_idx = sorted(range(len(biased)), key=lambda i: -biased[i])[:top_k]
# 선택된 전문가의 ORIGINAL scores 위에서 softmax 적용
chosen = [scores[i] for i in top_idx]
m = max(chosen)
exps = [math.exp(c - m) for c in chosen]
s = sum(exps)
gates = [e / s for e in exps]
return top_idx, gates
편향은 선택(selection)에는 영향을 주지만 게이트 가중치에는 영향을 주지 않습니다. 이것이 DeepSeek-V3의 트릭(trick)입니다. 편향은 부하 불균형(load imbalance)을 바로잡되, 모델의 예측 자체를 끌고 가지는 않습니다.
Step 2: 100개 토큰 라우팅하기
100개의 토큰을 라우터에 통과시켜 전문가별 사용량을 추적합니다. 편향이 없으면 사용량이 한쪽으로 치우칩니다(skew). 편향 갱신 루프를 두고, 과도하게 쓰인 전문가에는 -γ, 덜 쓰인 전문가에는 +γ를 더해 주면 사용량은 몇 번의 반복(iteration)만에 균등 분포(uniform distribution)에 가까워집니다.
Step 3: 파라미터 수 비교
MoE 구성의 "밀집 등가(dense equivalent)" 파라미터 수를 출력합니다. DeepSeek-V3 형상은 라우팅 전문가 256개 + 공유 전문가 1개, 활성 8개, d_model=7168 구조입니다. 전체 파라미터 수는 압도적으로 크지만, 활성 파라미터 수는 밀집 Llama 3 70B의 1/7 수준에 불과합니다.
사용해보기
HuggingFace에서 모델을 불러오는 방법은 다음과 같습니다.
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("mistralai/Mixtral-8x22B-v0.1")
2026년의 운영 추론 환경에서는 vLLM이 MoE 라우팅을 기본(native)으로 지원합니다. SGLang은 가장 빠른 전문가 병렬(expert-parallel) 경로를 제공합니다. 두 프레임워크 모두 top-k 선택과 전문가 병렬화를 자동으로 처리해 줍니다.
MoE를 고르는 게 좋은 경우:
토큰당 추론 비용은 낮추면서 프런티어 수준의 품질이 필요할 때.
충분한 VRAM과 전문가 병렬 인프라를 갖추고 있을 때.
워크로드가 긴 문서 처리(context-heavy)보다는 채팅/코드 생성처럼 토큰 중심(token-heavy)일 때.
MoE를 고르지 말아야 할 경우:
엣지(edge) 배포처럼, 활성 FLOPs와 무관하게 전체 저장 비용을 그대로 떠안아야 할 때.
단일 사용자 응답이 중요한 지연 시간 민감(latency-critical) 환경에서 라우팅 오버헤드가 부담이 될 때.
작은 모델(7B 미만)인 경우. MoE의 품질 이점은 활성 파라미터 약 6B 이상의 연산 임계점(compute threshold)을 넘어야 나타납니다.
산출물 만들기
outputs/skill-moe-configurator.md를 참고합니다. 이 스킬(skill)은 새로운 MoE 모델에 대해 파라미터 예산, 학습 토큰 수, 배포 대상을 입력 받아 E, k, 공유 전문가 배치를 골라 줍니다.
연습문제
쉬움.code/main.py를 실행해 봅니다. 보조 손실 없는 편향 갱신이 50회의 반복(iteration) 동안 전문가 사용량을 어떻게 고르게 맞추는지 관찰합니다.
중간. 학습되는 라우터를 해시 기반 라우터(hash-based router; 결정적이고 학습이 없는 형태)로 바꿉니다. 품질과 균형을 비교해 봅니다. 학습 가능한 라우터가 더 나은 이유는 무엇입니까?
어려움. GRPO 스타일의 "롤아웃 일치 라우팅(rollout-matched routing)"을 구현해 봅니다(DeepSeek-V3.2의 트릭). 추론 중 어떤 전문가가 활성화되었는지를 기록하고, 그래디언트 계산 단계에서 같은 라우팅을 강제로 재현합니다. 간단한 정책 경사(policy-gradient) 실습에서 그 효과를 측정합니다.
핵심 용어
용어
흔한 설명
실제 의미
전문가(Expert)
"여러 FFN 중 하나"
FFN 연산의 희소(sparse) 일부분을 전담하는 독립적인 피드포워드 네트워크다.
라우터(Router)
"게이트(gate)"
각 토큰과 각 전문가에 점수를 매기는 작은 선형 계층(linear layer)이며, top-k 선택을 수행한다.
Top-k 라우팅(top-k routing)
"토큰당 k개의 전문가를 활성화"
각 토큰의 FFN 연산이 정확히 k개의 전문가를 거치며, 게이트 가중치로 가중 결합된다.
보조 손실(Auxiliary loss)
"부하 분산 페널티"
한쪽으로 치우친 전문가 사용량을 벌주는 추가 손실 항(extra loss term)이다.
보조 손실 없는 균형(Auxiliary-loss-free)
"DeepSeek-V3의 트릭"
라우터 선택에만 전문가별 편향을 더해 균형을 맞추며, 추가 그래디언트가 따로 흐르지 않는다.
공유 전문가(Shared expert)
"항상 켜져 있는 전문가"
모든 토큰이 통과하는 추가 전문가로, 공통 지식을 담당한다.
전문가 병렬화(Expert parallelism)
"전문가 단위로 분산"
서로 다른 전문가를 서로 다른 GPU에 나누고, 토큰을 네트워크 너머로 라우팅한다.
희소성(Sparsity)
"활성 파라미터 < 전체 파라미터"
k × expert_size / (E × expert_size)의 비율이며, DeepSeek-V3의 경우 37/671 ≈ 5.5%다.