MoE는 일부 전문가만 활성화하는데 왜 배포 시 메모리를 많이 먹나
← 전체 목차 · 이전: 메모리를 삼키는 주범 — KV Cache · 다음: 배치 처리로 처리량을 올렸는데 왜 P99 꼬리 지연은 나빠지나
이 문제의 핵심은 계산 희소성(Compute Sparsity)과 저장 희소성(Storage Dense)을 분리해서 말할 수 있는가이다.
각 Token이 소수의 전문가만 거치는 것은 1회 순전파의 계산량을 확실히 줄인다. 그러나 언제든 임의의 전문가로 라우팅할 수 있어야 하므로 배포 노드 또는 전문가 병렬 집합 전체는 여전히 대량의 전문가 가중치를 상주시켜야 한다. 그 위에 주의력 층, 라우터, 활성화, 통신 버퍼, KV Cache의 메모리 비용도 함께 치러야 한다.
즉 "활성화 파라미터가 적다"에서 "단일 카드 메모리가 작다"는 도출되지 않는다.
순전파: 계산 희소 (Compute Sparsity)
각 Token이 소수의 전문가만 거침 → 이번 순전파의 계산량 감소
모델 저장: 저장은 희소하지 않음 (Storage Dense)
언제든 다른 전문가로 라우팅할 수 있어야 하므로
→ 배포 노드 / 전문가 병렬 집합 전체가 여전히 대량의 전문가 가중치를 보관
답변의 출발점은 결론이 아니라 "범위 정의"다
결론을 곧바로 던지는 대신 먼저 범위를 정의하고 네 종류의 점유를 나눠서 계산한다.
| 나눠서 계산할 네 종류 점유 | 설명 |
|---|
| 가중치 메모리 | 전문가 가중치 등 상주 부분 (+ 주의력 층 + 라우터) |
| 활성화 메모리 / 활성화 피크 | 순전파 과정의 중간 텐서. 평균이 아니라 피크를 취할 것 |
| KV Cache | 컨텍스트 길이·동시성과 직결 |
| 통신 버퍼 | 카드 간 통신에 필요한 buffer |
평가할 때 대입해야 할 세 입력 차원: 전문가 병렬, 배치(batch), 컨텍스트 길이 (그리고 전문가 분포).
결론: 활성화 파라미터만으로 추산해서는 안 된다.
입력 조건을 말할 수 있는 예시
예컨대 각 Token이 두 전문가만 고르더라도, 서로 다른 요청이 서로 다른 전문가에 적중하면 **카드 간 이동(cross-card transfer)**과 메모리 피크가 발생한다.
이것이 합격 답안의 형태다 — 입력 조건과 검증 가능한 결과를 설명해야지, 결론 한 줄로 때우면 안 된다.
가장 밟기 쉬운 함정과 원인 규명 순서
- 함정: 활성화 파라미터가 적다는 것으로 메모리 요구가 작다고 곧바로 추론한다.
- 결과: 멀티테넌트, 롱컨텍스트 시나리오에서 OOM이 발생한다.
- 원인 규명 순서:
- 입력, 설정 또는 모델 버전, 중간 결과를 보존한다.
- 처음으로 예상에서 벗어난 노드를 먼저 찾는다.
- 그다음에 파라미터 조정, 재시도, 다운그레이드 중 무엇을 할지 결정한다.
- 금지 동작: 모델에게 한 번 더 추측하게 하는 것. 어떤 입력 조건도 바꾸지 않으므로 복구 전략이 아니다.
통신 병목과 메모리 절감 수단의 대가
| 리스크 | 표현 |
|---|
| 부하 불균형 | 인기 전문가가 과부하될 수 있다 |
| 통신 | 카드 간 All-to-All이 병목이 될 수 있다 |
메모리 절감 수단은 공짜가 아니다.
- 양자화, 전문가 오프로딩 → 메모리를 절약할 수 있다.
- 대가 → 정밀도 손실 또는 지연 증가.
"매번 전문가 몇 개"만 외우지 말 것
암기식 답변 대신 세 가지를 설명해야 한다.
- 가중치가 어디에 놓이는가 (가중치 저장 토폴로지)
- Token이 어떻게 라우팅되는가 (Token 라우팅 전략)
- 동시성이 올라가면 어느 부분이 먼저 상한에 닿는가 (동시성 병목 분석)
검증 가능한 결과로 수렴시키기
0. 먼저 고정
모델 설정 / 입력 길이 / 데이터 버전
1. 대조 실험 1조
방안 수정 전후 각각 1회 실행
2. 네 가지 변화 비교
정확성 / 경계 샘플 / 지연 / 메모리 또는 Token 비용
어떤 최적화든 대조가 있어야 한다 — 입력·데이터·버전을 고정하고 주요 변수를 하나만 바꾼 뒤 정확성·지연·비용·리스크 지표를 비교한다.
핵심 통찰
- 희소성은 차원별로 나뉜다 — 연산력은 희소해질 수 있지만 저장은 그렇지 않다 — MoE의 Top-k 라우팅은 "이번에 얼마나 계산할까"만 압축했지 "이 기계가 언제든 준비해 두어야 할 양"은 압축하지 않았다. 라우팅이 임의의 전문가를 가리킬 수 있는 한 가중치는 상주해야 하며, 희소성은 저장 차원에서 실효한다.
- "활성화 파라미터가 적다"는 계산 측 지표인데 이를 배포 측 지표로 오인하는 것이 이 문제의 함정 전부다 — 묻는 것은 MoE 원리가 아니라 학습/논문 시각을 배포 시각으로 전환할 수 있는가이다. 판단 기준은 시나리오를 먼저 다중 카드 추론으로 복원하는 것이다.
- 메모리는 하나의 숫자가 아니라 하나의 구성표다 — 가중치, 활성화 피크, KV Cache, 통신 버퍼는 각각 증가 인자(전문가 수, 배치, 컨텍스트 길이, 병렬도)가 다르다. 하나의 총합으로 뭉개면 OOM이 어느 차원에서 났는지 설명할 수 없다.
- MoE는 메모리 압박의 일부를 통신 압박으로 바꾼다 — 전문가가 여러 카드에 분산된 뒤 Token이 서로 다른 전문가에 적중하면 카드 간 이동이 생기고, All-to-All과 인기 전문가 과부하가 병목을 메모리에서 통신으로 옮긴다. 절약한 자원이 장소만 바꿔 다시 나타나는 경우가 많다.
- 메모리를 절약하는 모든 수단은 대가와 함께 견적을 내야 한다 — 양자화와 전문가 오프로딩은 메모리를 압축하지만 정밀도 손실과 지연 증가가 동시에 발생한다. 수익만 보고하고 대가를 보고하지 않는 방안은 엔지니어링 리뷰에서 성립하지 않는다.
- 답변의 신뢰도는 결론의 화려함이 아니라 입력 조건에서 온다 — "각 Token이 두 전문가만 고르지만 서로 다른 요청이 서로 다른 전문가에 적중한다"처럼 조건이 붙은 예시라야 "카드 간 이동 + 메모리 피크" 같은 검증 가능한 결과를 도출할 수 있다.
- 엔지니어링 답변의 완전한 형태 = 판단 + 메커니즘 + 실패 경계 + 검증과 백스톱 — 실패 경로가 없는 방안은 출시할 수 없고, 검증 지표가 없는 방안은 효과를 증명할 수 없다.
엔지니어링 실전 Tips
- 범위를 먼저 정하고 그다음에 계산할 것: 어떤 용량 문제든(MoE만이 아니라) 첫 단계는 "총 점유"를 서로 겹치지 않는 몇 항목으로 쪼갠 뒤 각각의 증가 인자를 찾는 것이다. 섞어서 계산한 결과로는 위치를 특정할 수 없다.
- 원인 규명은 첫 번째 이탈 지점에서 시작할 것: 입력·설정·모델 버전·중간 결과를 보존하고, 처음으로 예상에서 벗어난 노드를 찾은 뒤에 손을 댈 것. 최종 실패 지점에서 거꾸로 추측하지 말 것.
- 실패에 합법적 출구를 남길 것: 예상 이탈 시의 동작은 파라미터 조정·재시도·다운그레이드뿐이다. "모델에게 한 번 더 추측하게 하기"는 복구 전략이 아니다.
- 한 번에 주요 변수 하나만 바꿀 것: 입력·데이터·버전을 고정하지 않으면 정확성·지연·비용의 변화를 특정 변경에 귀인시킬 수 없다.
- "먼저 상한에 닿는 부분"을 설계 산출물로 삼을 것: 동시성이 올라가면 메모리가 먼저 터지는지, 통신이 먼저 차는지, 인기 전문가가 먼저 과부하되는지는 평가 시점에 답할 수 있어야 한다.
- 회귀는 고친 그 지점만 테스트하는 것이 아니다: 수정 후 인접 작업도 검사해 한 지점만 좋아지고 다른 시나리오가 퇴화하는 것을 막을 것.
- 지표와 버전을 같은 축에: 핵심 지표와 버전 배포를 같은 타임라인에 그려야 이상을 입력 분포 변화·설정 조정·모델 업그레이드·외부 의존 중 하나로 귀인할 수 있다.