AI 연구EN

Paper of the Week #3 — FLOP이 절반이라고 시간이 절반은 아닙니다

정수 하나로 MoE expert 연산을 절반으로 줄이는 논문(arXiv 2609.04575)의 표 5를 A100 한 장에서 1점 안쪽으로 재현했습니다. 논문에 없는 속도를 쟀더니 HF transformers에서는 0, 지금 쓰는 순정 vLLM의 batch 1에서도 0, batch 8에서 1.35배였습니다. 재정규화 없이 학습된 OLMoE 대조군과 2호가 약속한 iso-cost 정산도 실었습니다.

Paper of the Week #3 — FLOP이 절반이라고 시간이 절반은 아닙니다

Paper of the Week #3 — FLOP이 절반이라고 시간이 절반은 아닙니다

정수 하나로 fine-grained MoE의 expert 연산을 절반으로 줄이는 논문이 나왔습니다. 학습도 없고, 정확도 표는 우리 A100에서 1점 안쪽으로 재현됩니다. 그런데 논문에는 시간이 없습니다. 직접 쟀더니 HF transformers에서는 0, 지금 쓰는 순정 vLLM의 batch 1에서도 0, batch 8에서 1.35배였습니다.

2026년 9월 3일 – 9월 9일 · Training-Free Halving of Activated Experts · Don't Drop Dropout · Repo-To-Skill · Scale-QLoRA

The Claim

FLOP 수는 모델에 대한 주장입니다. 청구서는 런타임이 씁니다.

효율화 논문은 구조에서 계산할 수 있는 숫자를 보고합니다. 아낀 FLOP, 건너뛴 파라미터, 안 켠 expert. 그 숫자는 진짜입니다. 그런데 우리가 내는 값은 그게 아닙니다. 우리가 내는 값은 특정 런타임의 wall-clock이고, 아꼈다는 연산이 애초에 병목이 아니었을 수도 있습니다. 지난 호에서는 하네스 논문이 분모 없이 점수를 낸다고 했습니다. 이번 호는 그 반대입니다. 효율화 논문은 점수 없이 분모만 냅니다. 이번 주 리드 논문이 제가 본 것 중 가장 깨끗한 사례입니다. 보고한 것은 전부 맞는데, 빼놓은 숫자 하나가 결과의 가치를 몇 배로 바꾸고, 그 배율은 어떤 서빙 스택을 쓰느냐에 따라 달라집니다.

The Receipt: 논문의 표, 그리고 논문에 없는 열

Xing Chen과 Hengshuai Yao(arXiv:2609.04575, 9월 4일 제출, 코드 없음)의 주장은 작고 정확합니다. fine-grained MoE 라우터는 상위 k개 expert를 고른 뒤 확률을 합이 1이 되도록 다시 나눕니다. 그 재정규화 아래에서 학습하면 expert 브랜치의 세기가 학습 k에 맞춰 굳어지고, 추론 때 k를 줄이면 누가 켜지는지만이 아니라 브랜치가 얼마나 큰 소리를 내는지도 바뀝니다. 처방은 둘을 분리하는 것입니다. 상위 k₁개를 켜고, 상위 k₂개의 확률 합으로 나눕니다. Eq. 2를 그대로 쓰면 i ∈ Top-k₁에 대해 w_i = p_i / Σ_{j ∈ Top-k₂} p_j 이고, 보통의 재정규화는 k₂ = k₁인 특수한 경우, k₂ = E(expert 전부)는 재정규화를 아예 안 하는 경우입니다. Qwen3.6-35B-A3B에서 8개 중 4개만 켜면 보통 재정규화로는 MMLU 4.65점이 빠지고 k₂=16이면 0.35점이 빠진다는 것이 헤드라인입니다.

패치를 직접 썼습니다. HF 라우터의 메서드 하나이고, k₁=k₂=8에서는 원본과 비트 단위로 같습니다. 모델을 bf16으로 A100 80GB 한 장에 올리고, 시드를 고정한 MMLU 5-shot 2,000문항을 문항별로 채점해서 저자들과 같은 paired McNemar 검정을 돌렸습니다.

k₁:k₂저자(표 5)우리8:8 대비McNemar p
8:881.6582.45
4:477.0076.30−6.152.5e-16
4:878.5580.15−2.309.9e-05
4:1681.3082.15−0.300.73
4:256 (재정규화 없음)52.40−30.053.0e-119
3:370.00−12.452.4e-37
3:1681.25−1.200.13
2:253.00−29.459.1e-119
2:1678.50−3.956.2e-06

표는 재현됩니다. k₂=16의 회복은 우리 문항에서 0.30점, 저자 보고는 0.35점이고, 검정은 원본과 구분하지 못합니다(저자 p=0.66, 우리 p=0.73). 논문에 없는 행이 넷 있습니다. expert 3개에 k₂=16이면 원본보다 1.2점 아래로 아직 노이즈 안이고, 같은 3개를 보통 재정규화(3:3)로 돌리면 12.45점이 빠집니다. 2개에 k₂=16이면 3.95점 아래입니다. 분명한 손실이지만 모델은 돌아갑니다. 같은 2개를 보통 재정규화(2:2)로 돌리면 53점으로 무너집니다. 여기까지 논문은 잰 것에 대해 전부 옳고, 자기에게 관대한 구석이 없습니다.

이제 논문에 없는 열입니다. "routed-expert 연산 절반"은 FLOP 문장이고, 논문에는 처리량도 지연도 추론 하드웨어도 없습니다. batch 1 디코딩을 런타임 두 곳에서 쟀습니다.

HF transformers 5.16.1에서는(조건은 아래 vLLM과 같이 512토큰 랜덤 프롬프트, 128토큰 생성, 5회 중앙값) expert를 절반으로 줄여도 아무것도 안 바뀝니다. k=8에서 14.9 tok/s, k₁=4에서 15.4 tok/s, 모든 조건이 14.5에서 15.4 사이입니다. GPU가 기다리는 것은 eager expert 루프가 아닙니다. 대부분의 연구자가 방법을 평가하는 바로 그 환경에서 이 방법을 평가하면, 지연에는 효과가 없다는 결론이 나옵니다.

vLLM 0.28에서는 같은 규칙을 fused 라우터에 몽키패치하고, 모델을 num_experts_per_tok=k₁로 만들어 커널 버퍼도 같이 줄였습니다.

k1이 4, 3, 2이고 k2가 16일 때 batch 1, 8, 32에서 순정 vLLM 대비 디코딩 처리량 배율. 파이썬 라우팅 오버헤드 포함
k₁:k₂batch 1batch 8batch 32순정 대비 배율 (b1 / b8 / b32)
순정 vLLM, k=8 (tok/s)148.65231,3871.00 / 1.00 / 1.00
8:8을 파이썬 패치로134.54871,3420.90 / 0.93 / 0.97
4:4149.06721,6511.00 / 1.29 / 1.19
4:16147.77061,9380.99 / 1.35 / 1.40
3:16149.97852,1891.01 / 1.50 / 1.58
2:16153.28472,1311.03 / 1.62 / 1.54

기준이 둘이고, 둘 사이의 간격이 이번 호의 요점입니다. 패치를 건 8:8(같은 파이썬 라우팅, k만 그대로) 기준으로는 4:16이 batch 1에서 1.10배, batch 8에서 1.45배입니다. 구현 비용을 뺀 방법 자체의 효과입니다. 그런데 지금 실제로 돌리는 순정 vLLM 기준으로는 batch 1이 0.99배입니다. 파이썬 임시 코드가 거기서 9.5%를 잃고, expert 절반으로 버는 것이 딱 그만큼입니다. 8개 중 2개만 켜서 routed FLOP의 4분의 3을 없애도 1.03배입니다. 임시 코드의 오버헤드는 배치가 커질수록 줄어(9.5%, 7.0%, 3.2%) 큰 배치의 이득은 남습니다. 순정 대비 4:16은 batch 8에서 1.35배, batch 32에서 1.40배입니다.

batch 1이 평평한 이유는 디코딩이 메모리 대역폭에 묶여 있고, 이 하이브리드 Gated-DeltaNet 모델이 토큰마다 읽는 것 중 expert 가중치가 일부이기 때문입니다. batch 8과 32는 정확한 값이 아니라 대략의 범위로 보셔야 합니다. k₂는 가중치만 바꾸고 어떤 expert가 뽑히는지는 바꾸지 않으니 같은 입력이면 라우팅도 같고 prefill 시간도 일치하는데(638 대 639 ms), batch 32에서 4:4와 4:16은 같은 커널로 17% 차이가 납니다(1,651 대 1,938 tok/s). 조건마다 생성 텍스트가 갈라지고, fused MoE 커널의 비용은 배치가 expert에 어떻게 퍼지느냐에 달려 있기 때문입니다. 이 교란은 batch 8에도 있고 크기만 작으며, batch 32에서는 expert 2개가 3개보다 느리게까지 나옵니다(1.54배 대 1.58배). 모든 조건에 같은 토큰 열을 강제로 먹이는 것이 해결이고, 4호 목록에 올렸습니다.

"expert 연산 절반"을 이 모델에서 정직하게 요약하면 이렇습니다. transformers에서 1.0배. vLLM에서는 구현 비용을 뺀 기준으로 batch 1에 1.10배, 지금 쓰는 순정 vLLM 기준으로 1.00배. batch 8에서는 순정 대비 1.35배, 임시 코드 대비 1.45배. 제목은 FLOP이 절반이라고 시간이 절반은 아니라고 말합니다. 표는 batch 1에서 FLOP 4분의 1이 시간 3%라고 말합니다. 어느 것도 논문에 없습니다.

대조군을 하나 더 돌렸습니다. 저자들이 Qwen 체크포인트 둘로는 할 수 없었던 메커니즘 시험입니다. OLMoE-1B-7B는 재정규화 없이 학습된 모델입니다. 논문의 설명이 맞다면 여기서는 k₂로 고칠 것이 없어야 합니다. 실제로 없었습니다. 원래 OLMoE는 같은 MMLU 문항에서 55.0점인데, 재정규화를 강제로 붙이면 24.6점(우연 수준)으로 떨어지고, k₁을 얼마로 줄이든 가장 넓은 분모가 가장 좋았습니다. 이 비대칭 자체가 증거입니다. 상위 k개의 확률 합은 1보다 작으니, 그 합으로 나누면 브랜치가 증폭되고 나눗셈을 빼면 감쇠됩니다. Qwen은 재정규화를 빼서 30점을 잃었고, OLMoE는 재정규화를 붙여서 더 낮은 출발점에서 30점을 잃고 우연 수준에 닿았습니다. 모델이 한 번도 배운 적 없는 증폭이 둘 중 더 파괴적인데, 세기 보정 이야기가 예측하는 그대로입니다. 이 기법은 진짜이고, 정확히 재정규화 학습을 바로잡는 기법입니다.

The Contrast

Don't Drop Dropout — 같은 주장, 우리 GPU에서 한 걸음 더 먼 곳

Elhoushi 외(Cerebras, arXiv:2609.05275)는 layer dropout을 LLM 사전학습에 다시 넣자고 합니다. 층별 분포와 스케줄을 맞추면 같은 validation loss에 학습 FLOP을 최대 25% 아끼고, 그 모델은 early exit과 self-speculative decoding으로 "정확도 손실이 무시할 수준인 채로 최대 1.5배 추론 가속"이 난다고 합니다. 271M에서 8.2B까지 2,400회 실험, 초록 기준 사전학습은 전부 Cerebras CS-3, 코드 언급 없음. loss 곡선은 의심하지 않습니다. 그런데 "1.5배 추론 가속"이 바로 이번 호가 다루는 종류의 숫자입니다. 건너뛴 층은 아낀 FLOP이지만, 그게 아낀 밀리초인지는 그 층이 여러분 런타임의 병목에 있었느냐에 달렸습니다. 271M 규모로 GPU에서 재현하려면 하루가 아니라 며칠이 걸립니다.

Repo-To-Skill — 분모를 반대쪽으로 숨긴 경우

Chen 외(BAAI, arXiv:2609.02749)는 ML 리포 1,000개를 5,000개 넘는 "스킬"로 증류해 리서치 에이전트에 장착합니다. 백본과 예산을 고정하면 "MLE-bench에서 134.3%, PaperBench에서 34.4% 더 높은 점수"라고 합니다. 상대 향상이고 초록에는 어느 쪽 절대 점수도 없습니다. 기준 4점에서 134%와 기준 40점에서 134%는 다른 결과입니다. FLOP 수와 같은 수법을 반대편에서 쓴 것으로, 참인 숫자인데 무엇을 얻는지는 말해 주지 않습니다. 헤드라인을 옮기기 전에 절대값 표를 먼저 읽겠습니다.

Scale-QLoRA — 아직 쓸 수 없는 것

arXiv:2609.04526은 네이티브 NVFP4/MXFP4 체크포인트에 LoRA를 순진하게 머지하면 양자화 코드가 다시 유도되면서 적응이 최대 39점까지 지워질 수 있고, 블록 스케일만 학습하면 그 문제를 피하면서 8B 모델에서 스텝당 3.9배 학습 가속이 난다고 합니다. 실패 사례 하나만으로도 글 한 편감입니다. 그런데 제가 가진 것은 초록뿐입니다. 이번 주 HTML 본문이 열리지 않았고, 코드 공개를 확인하지 못했고, 가속은 하드웨어 없이 보고됐습니다. 증거가 아니라 재현 후보입니다.

제가 틀렸다고 판정될 조건

두 결과가 이번 호의 해석을 뒤집습니다. 첫째, fused k₂ 커널입니다. 제대로 된 커널 구현이 이 모델의 batch 1에서 1.5배 이상을 낸다면, expert 가중치가 토큰당 트래픽의 일부라는 제 주장이 틀린 것이고 "대역폭에 묶였다"는 설명도 틀린 것입니다. fused 구현이 나오면, 제 것이든 남의 것이든, 채점하겠습니다. 둘째, DeepSeek-V2-Lite입니다. 이 모델도 norm_topk_prob: false입니다. k₁을 줄였을 때 k₂가 도움이 되면, OLMoE 대조군에서 얻은 "재정규화 학습이 아니면 고칠 게 없다"는 해석이 틀린 것입니다. 이건 제가 돌릴 수 있고, 4호에서 돌립니다.

Ship It · 이번 주의 코드

방법 전체가 이겁니다. HF transformers 5.16에서 클래스 이름이 TopKRouter로 끝나는 라우터(Qwen3_5MoeTopKRouter, OlmoeTopKRouter)라면 어디든 붙습니다. MIT이고, 전체 스크립트는 각주에 링크했습니다.

python
def forward(self, hidden_states):                     # k1 = 실제로 돌리는 expert 수, k2 = 분모의 기준 질량
    k1, k2 = self.k1, self.k2                          # k2 >= k1; k2 == num_experts 면 재정규화 없음
    hidden_states = hidden_states.reshape(-1, self.hidden_dim)
    logits = F.linear(hidden_states, self.weight)
    probs = torch.softmax(logits, dtype=torch.float, dim=-1)
    top_vals, top_idx = torch.topk(probs, min(k2, self.num_experts), dim=-1)
    scores = top_vals[:, :k1] if k2 >= self.num_experts else top_vals[:, :k1] / top_vals.sum(-1, keepdim=True)
    return logits, scores.to(logits.dtype), top_idx[:, :k1]

Qwen3_5MoeTopKRouter.forward = forward               # OlmoeTopKRouter 도 같음
for m in model.modules():                            # 학습 k=8 이면 논문 설정은 k1=4, k2=16
    if type(m).__name__.endswith("TopKRouter"):
        m.k1, m.k2 = 4, 16

월요일 아침에 할 일 둘입니다. 재정규화 학습된 fine-grained MoE를 서빙하면서 처리량에 묶여 있다면, k₁을 학습 k의 절반, k₂를 학습 k의 두 배로 두고 돌려 보십시오. Qwen3.6-35B-A3B에서는 paired 검정이 보지 못하는 변경으로 순정 vLLM 대비 batch 8에서 1.35배가 나오고, batch 1에서는 아무것도 안 나옵니다. 그리고 다음에 어떤 효율화 방법을 평가하든, 초당 토큰은 연구하는 런타임이 아니라 서빙하는 런타임에서 재십시오. 제 숫자도 예외가 아닙니다. 위 수치는 커널이 아니라 파이썬 패치에서 나온 것이고, 바로 그래서 패치 없는 엔진 기준으로 함께 적었습니다. 이번 주에 두 런타임은 효과 전체만큼 어긋났습니다.

정산

2호는 두 가지를 약속했습니다. iso-cost 대조군은 돌렸습니다. 단일 에이전트에 래핑과 같은 예산을 주되, 같은 8개 숨긴 테스트 과제에서 독립 시도 3회로 줬습니다. 결과는 pass@3 8/8로 래핑의 8/8과 같고, 비용은 $6.53 대 래핑 $5.98(1.09배), 입출력 토큰은 191,584 대 177,100(1.08배)이었습니다. 시도별로는 단일 에이전트가 24회 중 22회(92%)를 통과했고, 2호의 단일 실행은 8과제 중 7이었습니다. 지난 호에서 래핑이 "이긴" 유일한 과제 rest-api는 이번에 단일 시도 3회 중 2회를 통과했으니, 능력 차이가 아니라 동전 던지기에서 진 것이었습니다. 주의할 점이 둘 있습니다. pass@3는 best-of-3의 상한이고(실제 선택기는 숨긴 테스트 없이 골라야 합니다), 과제는 약속했던 레포 수준이 아니라 같은 8개 카타입니다. 비용 조건은 지켰고 과제 규모는 못 지켰습니다. 부분 이행으로 셉니다. 두 번째 약속인 HoH 10회 반복의 매칭 예산 채점은 돌리지 않았습니다. 그쪽 산출물이 아직 매칭 예산으로 읽을 수 있는 형태가 아니고, 남의 곡선을 채점하려고 10회 반복 하네스 스윕에 돈을 쓰지는 않겠습니다. 이행하지 않았고, 그렇게 셉니다. 산출물이 바뀔 때까지 원장에 남습니다.

2호의 주장, 래핑의 이득이 토큰 3배에 재실행 노이즈 안이라는 것은 그대로 성립하고 더 날카로워졌습니다. 같은 지출에서 단순 시도 3회가 래핑의 통과율과 정확히 같으니, 래핑은 재실행으로 살 수 없는 것을 하나도 사지 못했습니다.

재현 연속 3주. 다음 호에는 재정규화 없이 학습된 두 번째 대조군 DeepSeek-V2-Lite, 그리고 본문과 코드가 나오면 Scale-QLoRA의 순진한 머지 실패를 다룹니다.

패치와 평가: moe-k2-exp.py(HF, 원본 k에서 비트 단위 동일 자체 검사), moe-k2-vllm.py(vLLM 0.28, 조건당 프로세스 하나), 모든 칸의 원시 JSONL. Qwen3.6-35B-A3B bf16, A100 80GB 한 장, 65.4 GiB 상주. MMLU 2,000문항, 시드 0. 속도는 512토큰 랜덤 프롬프트, 128토큰 생성, vLLM 7회·transformers 5회 중앙값, 기계는 그 외 유휴. 한계: GPU 한 장, 속도는 모델 한 계열, 커널이 아닌 파이썬 라우팅 임시 코드, batch 8·32에서 조건별 생성 텍스트 발산. 이번 호의 바탕이 된 실측 글 두 편: 재현과 속도, 4분의 1과 OLMoE 대조군.

iso-cost 대조군: potw3-isocost.py, 8과제 × 단일 호출 3회, Claude Code 2.1.266의 sonnet, 숨긴 공식 pytest로 러너가 채점, 총 $6.53.

소요: 모델 다운로드 약 2시간, 정확도 스윕 GPU 약 6시간, vLLM 약 30분, iso-cost 약 35분. 검증일: 2026-09-08 (MoE), 2026-09-09 (iso-cost).

참고

더 많은 콘텐츠를 받아보세요

SNS에서 새로운 글과 튜토리얼 소식을 가장 먼저 받아보세요

이메일로 받아보기

관련 포스트