본문 바로가기
C.W.K.
Lesson 03 of 06 · published

VRAM 벽과 멀티 GPU 세금

~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 GBRTX PRO 6000, 96 GBMac Studio, 512 GB증거
27B14.4 GB들어감: 상한 124 tok/s들어감: 124들어감: 57벤더 대역폭에서 유도
70B39.7 GB카드 2, 아니면 넘쳐서 1.6 tok/s들어감: 45들어감: 21유도
235B 혼합, 활성 22B(모든 전문가 상주)상주 132 GB, 토큰당 읽기 12.4카드 5카드 2들어감: 66유도
405B228 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

External links

Exercise

돌리고 싶은 가장 큰 모델 셋을 가져와. 각각에 대해, 살 수 있는 카드 하나와 맥 하나에 대해, 어느 체제에 떨어지는지(들어감, 넘침, 나눔)와 spill_math.py의 상한이나 카드 수를 써. 그다음 기계들이 자리를 바꾸는 행 하나에 동그라미를 쳐.
Hint
자리 바꾸는 행은 맥엔 들어가고 카드엔 안 들어가는 모델이야. 그 행 하나가 구매를 정해. 다른 모든 행은 카드로 가니까. 실제로 원하는 모델에 그런 행이 없으면 카드가 맞는 구매고 이 퀘스트는 그렇게 말해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.