~14 min · cuda, vram, pcie, nvlink, multi-gpu, physics
Level 0스펙 시트 훑는 사람
0 XP0/91 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"카드의 메모리는 숫자가 적힌 절벽이야. 24, 32, 96. 그 아래에선 카드가 앞 레슨의 모든 나눗셈을 이겨. 그 위에선 버스가 메모리고 세금은 토큰당이야."
벽
앞 레슨의 사다리엔 대역폭 숫자로 못 고치는 칸이 있었어. "안 들어감". RTX 4090은 24 GB, 5090은 32, 워크스테이션 RTX PRO 6000은 96, H100은 80을 담아. 4비트 27B는 토큰당 14.4 GB에 캐시를 더한 거고 전부에 들어가. 가중치당 4.5비트 70B는 39.7 GB고 소비자 카드엔 하나도 안 들어가. 235B 혼합 모델은 상주 132 GB고, 책상 위에선 96 GB 워크스테이션 카드 둘이나 Studio 말곤 아무것에도 안 들어가. Mac Studio의 512 GB는 235B를 여유 있게 담고, 활성 파라미터 22B가 토큰당 읽는 12.4 GB 기준으로 상한 초당 66토큰 근처야(132 전부로 나누면 6인데, 그게 물리 트랙이 막으려고 있는 밀집 모델식 실수야). 405B 밀집은 4. 벽은 성능 숫자가 아니야. 불리언이고, 맥에 대한 물리 트랙의 논증 전체는 그 불리언이 카드에선 거짓이고 Studio에선 참인 모델들로 환원돼.
넘침: 버스가 메모리가 돼
가중치가 카드를 넘으면 런타임이 하는 건 넘친 몫을 호스트 메모리에 두고 토큰마다 PCI Express 너머로 흘려보내는 거야. 그러면 여정 트랙의 2단계를 토큰마다 밟고, 상한은 버스의 것이야. Gen 5 열여섯 레인의 63 GB/s면 27B에 초당 4.4토큰, 70B에 1.6. 27B에서 Air의 6.1보다 낮아. 메모리가 Air의 풀보다 열여덟 배 빠른 카드에서. 인터페이스 레슨의 값을 한 번 대신 토큰마다 치르는 거야. 큰 모델을 초당 몇 토큰으로 보여 주는 모든 소비자 카드 벤치마크가 이 산수고, 정직한 판은 그렇게 말해. 카드가 느린 게 아니라 빨대로 읽고 있는 거야.
나눔: 세금
다른 답은 카드를 더 쓰는 거야. 70B를 5090 둘에 나누면 각각이 가중치 절반을 병렬로 읽어. 대역폭이 더해져. 하지만 모든 레이어의 활성값이 한 카드에서 다른 카드로 건너야 하고, 그 횡단은 카드들이 가진 어떤 링크로든 이뤄져. 5090 자체의 사양 페이지는 "NVIDIA NVLink (SLI-Ready): No"라고 적어. GeForce 카드는 호스트를 거쳐 PCIe로 서로 얘기해. 넘침이 쓴 것과 같은 63 GB/s로, 토큰마다 레이어마다 한 번, 홉마다 동기화하면서. 데이터센터 부품엔 NVLink가 있어. NVLink 5에서 GPU당 1.8 TB/s. 그래서 나눔은 되는 랙 규모 기법이고 실망시키는 데스크톱 기법이야. 세금엔 줄이 셋이야. 링크의 지연 곱하기 레이어 수, 토큰당. 두 번째 575와트 전력 예산과 카드 하나에 벤더가 1,000 W로 적은 전원 공급. 그리고 샤딩하는 소프트웨어. 플랫폼의 20년 안에 있고, 세금을 아예 낼 수 있는 이유야. 가중치당 4.5비트 235B엔 5090 다섯, 그래픽 전력 2,875와트, 레이어마다 카드 다섯에 걸친 all-reduce 한 번이 필요해. Studio는 활성 바이트 기준 최대 초당 66토큰으로(전문가 레슨이 말하듯 런타임은 그 일부에 닿아) 270와트에 돌리고, 함대 트랙은 이 집이 그걸로 뭘 하는지에 대한 거야.
모델, 가중치당 4.5비트(27B 행은 실측한 4비트 체크포인트)
토큰당 바이트
RTX 5090, 32 GB
RTX PRO 6000, 96 GB
Mac Studio, 512 GB
증거
27B
14.4 GB
들어감: 상한 124 tok/s
들어감: 124
들어감: 57
벤더 대역폭에서 유도
70B
39.7 GB
카드 2, 아니면 넘쳐서 1.6 tok/s
들어감: 45
들어감: 21
유도
235B 혼합, 활성 22B(모든 전문가 상주)
상주 132 GB, 토큰당 읽기 12.4
카드 5
카드 2
들어감: 66
유도
405B
228 GB
카드 8
카드 3
들어감: 4
유도
Code
spill_math.py — 들어감, 넘침, 나눔: 산수로 본 벽·python
#!/usr/bin/env python3
"""The VRAM wall and the multi-GPU tax, as arithmetic. A model either fits one card,
spills to the host over PCIe, or is split across cards -- and each split adds a
per-token exchange over whatever links the cards. Vendor bandwidths; bytes per
token at 4.5 bits per weight; KV at 64 KB per token (the lab's 27B figure)."""
PCIE5_X16 = 63e9 # GB/s per direction, one card's slot
CARDS = [("RTX 5090", 32, 1792), ("RTX PRO 6000", 96, 1792), ("H100 SXM", 80, 3350)]
MODELS = [("27B", 25.6e9), ("70B", 70.6e9), ("120B", 120e9), ("235B", 235e9), ("405B", 405e9)]
def bytes_per_token(params): return params * 4.5 / 8
print(f"{'model':6} {'GB/tok':>7} |" + "".join(f" {c[0]:>14}" for c in CARDS) + " | spilled over PCIe 5 x16")
for name, params in MODELS:
bpt = bytes_per_token(params)
cells = []
for cname, mem, bw in CARDS:
need = bpt / 1e9 + 4 # weights + a few GB of context and buffers
if need <= mem:
cells.append(f"{bw*1e9/bpt:10.0f} tok/s")
else:
n = -(-need // mem) # cards needed, ceiling division
cells.append(f"{int(n):3d} cards ")
print(f"{name:6} {bpt/1e9:7.1f} |" + "".join(f" {c:>14}" for c in cells) + f" | {PCIE5_X16/bpt:6.1f} tok/s")
print("\nsplit across N cards: each token still reads 1/N of the weights on each card in parallel,")
print("then exchanges activations between cards once per layer -- over PCIe (63 GB/s) on GeForce,")
print("which lists 'NVLink (SLI-Ready): No', or over NVLink (1.8 TB/s per GPU, NVLink 5) on data-center parts.")
# model GB/tok | RTX 5090 RTX PRO 6000 H100 SXM | spilled over PCIe 5 x16
# 27B 14.4 | 124 tok/s 124 tok/s 233 tok/s | 4.4 tok/s
# 70B 39.7 | 2 cards 45 tok/s 84 tok/s | 1.6 tok/s
# 120B 67.5 | 3 cards 27 tok/s 50 tok/s | 0.9 tok/s
# 235B 132.2 | 5 cards 2 cards 2 cards | 0.5 tok/s
# 405B 227.8 | 8 cards 3 cards 3 cards | 0.3 tok/s