Memory가 진짜 제약
어떤 모델을 돌릴 수 있냐의 hard ceiling은 memory야 — compute 아니고. Weight가 들어가야 해. 안 들어가면 느린 path로 흘러내리거나 아예 로드 거부. 토큰/초를 주로 정하는 건 메모리 대역폭이야. 아래 decode 절에서 계산해 볼 거고. 토큰을 받을지 말지를 정하는 건 메모리 용량이야.
Memory 아키텍처 두 종류
- Discrete GPU. NVIDIA RTX 4090 (24 GB), RTX 5090 (32 GB), 데이터센터급 H100 / H200 / B200 (80–192 GB). Weight는 system RAM과 분리된 VRAM에 살아. 대역폭 빠름 (1+ TB/s). GB당 비싸.
- Apple Silicon unified memory. CPU랑 GPU가 같은 풀 공유. Mac에 달린 16 GB / 64 GB / 128 GB / 192 GB / 512 GB 전부 weight에 사용 가능. 대역폭은 데이터센터 GPU보다 낮고, 칩마다 차이도 커. 기본형 M2나 M3가 100 GB/s 안팎, M4가 120, M5가 153, M4 Pro가 273이고, 맨 위의 M3 Ultra가 819 GB/s야 (M5 Ultra는 2026년 8월에 1.2 TB/s로 발표됐어). 가격 대비 capacity는 압도적인데, 속도는 어떤 칩을 샀느냐에 달렸어.
Sizing 어림셈
Q4 quantization (daily-driver default)에서 weight는 1B 파라미터당 0.6 GB쯤 차지해. 계산만 하면 4 bit가 반 바이트니까 0.5인데, Q4_K_M은 일부 텐서를 더 높은 정밀도로 남겨 둬서 weight 하나에 평균 4.9 bit쯤 들어. llama.cpp가 Llama 3.1로 정리한 표를 보면 8B가 4.9 GB, 70B가 43 GB, 405B가 249 GB야. 여기에 context, KV cache, runtime overhead 몫으로 10–20% 더 얹어. 빡빡하면 quant 한 단계 내리고, 여유 있으면 더 큰 quant 가져와.
Bandwidth가 속도 결정
Decode 속도는 대역폭에 묶여 있어. 토큰을 하나 새로 뽑을 때마다 칩은 그 토큰이 거쳐 가는 weight를 전부 읽고, 지금까지 쌓인 KV cache도 읽어야 하거든. 그래서 스트림 하나가 한 번에 토큰 하나씩 뽑는 경우라면, 천장은 나눗셈 한 번으로 구할 수 있어. 초당 토큰 ≲ 메모리 대역폭 ÷ 토큰 하나에 읽는 바이트. Dense 70B를 Q4_K_M으로 돌리면 토큰마다 43 GB를 통째로 읽으니까, 819 GB/s짜리 M3 Ultra도 KV cache를 빼고 쳐서 19 tok/s 근처가 한계야. 64 GB M4 Pro도 같은 파일을 올리긴 하는데, 273 GB/s라서 천장이 6 tok/s 근처로 내려가. 모델이 올라가느냐는 capacity가 정하고, 얼마나 빨리 말하느냐는 대역폭이 정하는 거지. Mixture-of-experts 모델도 메모리에 통째로 들어가야 하는 건 똑같아. 대신 토큰마다 라우팅된 expert만 읽으니까, 전체 30B에 활성 3B인 모델은 토큰당 3B 모델만큼만 읽고 dense 30B보다 훨씬 빨리 decode해.
천장은 벤치마크 숫자가 아니야. Compute, kernel, 소프트웨어 overhead가 저마다 몫을 떼 가니까 평범한 decode의 실측은 늘 그 아래로 떨어져. llama.cpp의 Apple Silicon 벤치마크에서 Llama 2 7B Q4_0은 M3 Ultra로 92 tok/s가 나와. 파일이 3.56 GiB라 천장은 210 tok/s 안팎이니까, 절반도 못 채운 거지. 이 선을 넘는 방법이 알려져 있긴 한데, 물리를 이기는 게 아니라 weight를 한 번 읽어서 토큰을 몇 개 얻느냐를 바꾸는 거야. Speculative decoding은 작은 draft 모델이 토큰 여러 개를 먼저 내놓고 큰 모델이 한 번에 검사해. 그래서 weight를 한 번 읽고도 토큰을 여러 개 확정할 수 있어. Batching은 한 번 읽은 걸 여러 사용자의 스트림에 나눠 써. 전체 처리량은 올라가도 스트림 하나하나는 여전히 자기 천장 아래야.