24B가 30B보다 4배 느렸다 — RTX 3060 두 장에서 모델 3개 실측
이 포스팅은 쿠팡 파트너스 및 네이버 쇼핑 커넥트 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
모델을 고를 때 파라미터 수를 봅니다. 24B보다 30B가 무겁고 느릴 것 같습니다.
재보니 반대였습니다. 제 구성에서 24B가 30B보다 4배 느렸습니다. 모델 세 개를 잰 결과이니, 일반 법칙이 아니라 이 세 개에서 그랬다는 이야기입니다.
측정 결과
RTX 3060 12GB 두 장, 전부 GPU에 올라간 조합만 모았습니다. 모델당 3회 반복입니다.
| 모델 | 구조 | 총 파라미터 | 생성 속도 | 편차 |
|---|---|---|---|---|
| Qwen3-Coder 30B-A3B | MoE | 30.5B | 93.9 tok/s | ±0.17 |
| Gemma4 26B | MoE | 25.8B | 73.3 tok/s | ±0.24 |
| Devstral Small 2 24B | Dense | 24.0B | 22.4 tok/s | ±0.01 |
가장 작은 모델이 가장 느립니다. 이 세 개를 파라미터 수로 줄 세우면 순서가 완전히 거꾸로입니다.
갈라놓은 건 구조였다
세 모델의 구조를 확인해 봤습니다. Ollama가 알려줍니다.
$ curl -s localhost:11434/api/show -d '{"model":"gemma4:26b"}' | jq .model_info
"gemma4.expert_count": 128,
"gemma4.expert_used_count": 8,
Gemma4 26B는 전문가 128개 중 8개만 골라 씁니다. MoE입니다. Qwen3-Coder 30B도 같습니다.
Devstral 24B만 전문가가 없습니다. 유일한 dense 모델이고, 유일하게 느립니다.
저도 이 글을 쓰다가 라벨을 고쳤습니다. 원래 측정 기록에 Gemma4 26B를 dense로 적어 뒀는데, 확인해 보니 MoE였습니다. 겉으로 보이는 이름과 파라미터 수만으로는 구분이 안 됩니다.
토큰당 실제로 읽는 양
MoE는 토큰 하나를 만들 때 전체 파라미터를 다 읽지 않습니다. 고른 전문가만 읽습니다.
설정값에서 계산해 봤습니다. 레이어마다 어텐션(Q·K·V·O)과 실제로 쓰는 전문가 8개의 FFN만 더한 값입니다.
| 모델 | 총 파라미터 | 토큰당 읽는 양 | 비율 |
|---|---|---|---|
| Qwen3-Coder 30B-A3B | 30.5B | 2.72B | 9% |
| Gemma4 26B | 25.8B | 2.12B | 8% |
| Devstral 24B | 24.0B | 24.0B | 100% |
Devstral은 매 토큰마다 24B를 전부 읽습니다. 나머지 둘은 2B대만 읽습니다. Devstral 기준으로 Qwen3-Coder의 8.8배, Gemma4의 11.3배입니다.
속도 순서가 뒤집힌 것과 이 차이는 방향이 맞습니다. 다만 읽는 양이 속도를 결정한다고 이 측정으로 증명한 것은 아닙니다. 커널 효율, 전문가 선택 과정, 두 장에 나눠 실은 구성도 함께 달라졌습니다.
그럼 대역폭으로 예측되나
RTX 3060의 메모리 대역폭은 사양상 360 GB/s입니다. 토큰당 읽는 바이트로 나누면 상한이 하나 나옵니다.
Q4_K_M은 파라미터당 약 0.606바이트입니다.
아주 거친 모델입니다. 카드 한 장의 사양값을 두 장 구성에 그대로 썼고, KV 캐시 읽기·활성값·양자화 메타데이터·카드 간 전송은 전부 뺐습니다. 실제 상한이 아니라 비교용 기준선으로 보시면 됩니다.
| 모델 | 토큰당 읽는 양 | 이론 상한 | 실측 | 달성률 |
|---|---|---|---|---|
| Devstral 24B (Dense) | 14.55 GB | 24.7 tok/s | 22.4 | 90% |
| Qwen3-Coder 30B-A3B | 1.65 GB | 218.5 tok/s | 93.9 | 43% |
| Gemma4 26B | 1.28 GB | 280.2 tok/s | 73.3 | 26% |
Dense는 90%가 나왔습니다. 이렇게 거친 나눗셈이 실측에 이만큼 가까운 건 의외였는데, dense 모델이 하나뿐이라 우연인지 아닌지는 모릅니다.
MoE는 26~43%에 그칩니다. 활성 파라미터로 계산한 이론값에 한참 못 미칩니다.
즉 활성 파라미터는 방향을 설명하지만 크기를 설명하지 못합니다. MoE가 왜 이론값에 못 미치는지는 이번 측정으로 알 수 없습니다. 전문가를 고르고 모으는 과정, 메모리 접근이 흩어지는 문제, 두 장에 나눠 실은 구성이 후보이지만 어느 것도 확인하지 않았습니다.
실무에서
모델 이름의 숫자로 속도를 짐작하지 마십시오. 30B가 24B보다 네 배 빨랐습니다.
MoE인지 먼저 확인하십시오. ollama show 나 api/show 의 expert_count 를 보면 됩니다. 이름에 A3B 같은 표기가 있으면 활성 파라미터를 밝힌 것이지만, Gemma4처럼 아무 표기가 없는 경우도 있습니다.
Dense 모델은 대역폭으로 자릿수 정도는 가늠됩니다. 파라미터 × 0.6바이트를 카드 대역폭으로 나눠 보십시오. 제 경우 그 값의 90%가 실측이었는데, dense 모델 하나에서 나온 숫자라 90%라는 비율 자체는 믿지 마십시오.
MoE는 재보는 수밖에 없습니다. 같은 계산이 실측의 두 배에서 네 배를 내놨습니다.
VRAM에 올라가는지는 매칭표와 VRAM 계산기로 미리 확인할 수 있습니다.
이 측정에 쓴 장비
- RTX 3060 12GB 계열 — 쿠팡에서 보기 · 네이버 380,000원
이 사이트의 모든 측정에 쓰는 카드입니다. 두 장을 꽂아 24GB로 씁니다.
측정 방법
- RTX 3060 12GB × 2 (합계 24GB), AMD Ryzen 7 5800X
- Ollama 0.20.0, 드라이버 590.48.01, KV 타입 f16,
num_ctx=32768 - 동일한 한국어 코딩 프롬프트,
num_predict=300,seed=42,temperature=0.7 - 모델당 3회 반복, 매 회 언로드 후 재적재
ollama ps기준100% GPU인 조합만 비교에 넣었습니다- 구조 정보는
POST /api/show의model_info에서 읽었습니다
한계
- 모델 3개, GPU 구성 하나, 프롬프트 한 종류입니다. dense 는 그중 하나뿐이라 90%라는 달성률은 표본 1입니다.
- 모델마다 토크나이저와 생성 결과가 다릅니다. 같은 프롬프트를 넣어도 실제 연산량이 같지 않고,
seed=42도 모델 간 같은 생성 경로를 보장하지 않습니다. - 워밍업을 두지 않았고 조건 순서를 무작위화하지 않았습니다. 프롬프트 길이와 출력 토큰 구성도 통제하지 않았습니다.
- 두 장에 레이어가 어떻게 나뉘었는지 기록하지 않았습니다. 카드 간 전송량도 재지 않았습니다.
- 활성 파라미터는 설정값에서 유도한 근사입니다. 레이어별 어텐션과 사용 전문가의 FFN만 더했고, 임베딩·레이어놈·공유 FFN은 넣지 않았습니다. 실제 읽는 양은 이보다 조금 많습니다.
- 360 GB/s는 카드 한 장의 사양값입니다. 두 장 구성에 그대로 적용할 근거는 없습니다. 실효 대역폭도 측정하지 않았습니다.
- 대역폭 모델에서 KV 캐시 읽기, 활성값, 양자화 메타데이터, 커널 오버헤드, 카드 간 통신을 전부 제외했습니다. 이론값과 달성률은 그만큼 단순화된 값입니다.
- MoE의 낮은 달성률 원인을 분리하지 못했습니다. 커널 효율, 전문가 게이팅, 메모리 지역성, 카드 간 전송 중 무엇이 얼마나인지는 재지 않았습니다.
- 네 번째로 측정한 Qwen3.6 36B-A3B는 뺐습니다. 일부가 CPU로 내려가 같은 조건이 아니었습니다.
- 원본 데이터는 저장소에 공개해 두었습니다. 다른 카드 결과를 알려주시면 출처를 밝히고 반영하겠습니다.