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

어떤 일에 어떤 기계

~13 min · cuda, decision, fits, batch, training, our-judgment

Level 0스펙 시트 훑는 사람
0 XP0/91 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"라이벌 관계는 승자가 아니야. 옆에 일들이 적힌 표고, 각 행엔 앞 레슨들이 이미 계산한 답이 있어."

표

다섯 레슨의 산수는 일마다 질문 하나로 환원돼. 각 기계에서 모델이 어디 떨어지나(들어감, 넘침, 나눔), 그리고 그 일이 시간을 보내는 단계는 뭔가. 코드 블록은 그 질문을 함수로 만든 거야. 이 집 자체의 기계 모양들과 빌린 카드 하나로. 그리고 아래 표는 집에 실제로 있는 일들에 대해 그게 돌려주는 것이야. 모든 칸은 벤더 대역폭에서 나온 상한이거나 벤더 용량에서 나온 불리언이야. 순위는 이 퀘스트의 판단이고, 판단 칸이 그렇게 말해.

일결정적 사실답증거
사용자 하나, 카드에 들어가는 모델(4비트 27B 이하)대역폭 비율 Studio의 2.2배, H100에선 4배카드. 상한 124 대 57 tok/s. 여기선 맥이 빠른 선택이 아니야벤더 대역폭에서 유도
사용자 하나, 96 GB 위의 모델(상주 132 GB의 235B 혼합, 228의 405B)512 GB 풀에 들어감. 235B는 96 GB 카드 한 쌍에도 들어가고 405B는 안 들어가Mac Studio. 표에서 둘 다 혼자 돌리는 유일한 기계, 270 W에 들리는 팬 없이유도, 벤더(전력, 애플 자체 테스트)
사용자 하나, 가중치당 4.5비트 70B96 GB 워크스테이션 카드에 45 tok/s로 들어감, Studio 21, Spark 7, 5090에선 넘쳐서 1.6방과 전력이 있으면 워크스테이션 카드, 책상 위에 두고 싶으면 Studio유도
여러 사용자 동시에, 들어가는 어떤 모델이든배치가 디코드를 연산으로 바꾸고, 텐서 코어가 연산을 이겨NVIDIA, 배치가 클수록 더. 배치 레슨은 맥의 합계를 단일 스트림의 7배로 쟀고, 카드는 더 멀리 가실측(맥), 물리
의미 있는 어떤 규모의 학습이나 전체 파인튜닝파라미터당 16바이트, 쉰 배의 텐서 연산NVIDIA, 빌리거나 랙으로. 어댑터와 작은 모델엔 맥물리, 벤더 처리량
이미지 생성, 사용자 하나연산 단계. 맥의 22 TFLOP/s에 대한 카드의 텐서 코어이미지당으론 카드가 빨라. 이 집은 같은 상자가 나머지 전부를 서비스하고 이미지가 급하지 않아서 맥에서 돌려실측(맥), 우리 판단
항상 켜져서, 방 안에서, 몇 년유휴 9 W, 최대 270 W, 무소음. 575–1,000 W와 케이스 팬에 대해맥. 함대 트랙이 이 행이야벤더(애플 지원 문서), 벤더(NVIDIA)
가족을 위한 음성로컬 능력이 아니라 프론티어 클라우드 모델의 품질선택으로 클라우드. 함대 트랙의 선택으로 클라우드 레슨이 집의 결정

이 집은 어떻게 답했나

파트 4의 함대가 이 표를 채운 거야. 추론 허브가 Mac Studio인 건 이 집이 돌리고 싶은 모델들이 둘째 행과 일곱째 행에 앉아 있어서야. 이미지 엔진이 같은 Studio에서 도는 건 여섯째 행의 속도 차이가 가족이 이미지를 쓰는 방식엔 중요하지 않아서야. 집 안의 어느 것도 규모 있게 학습하지 않고, 애플 자체의 모델도 다른 곳에서 학습되니, 다섯째 행엔 로컬 기계가 없고 필요하지도 않아. 음성은 마지막 행의 논리로 클라우드에 갔고, 이 집은 그걸 결정으로 명시했어. 빠진 능력이 아니라 더 좋은 품질. 그리고 집 안의 모든 맥은 사람이 사는 방에서 항상 켜져 있는 기계고, 그게 라이벌이 좀처럼 못 이기는 행이고(140 W Spark가 그걸 위해 만든 유일한 라이벌이야), 퀘스트의 마지막 트랙이 다루는 것이야. 이 중 어느 것도 맥을 더 좋은 컴퓨터로 만들지 않아. 이 집이 있는 행들에 맞는 기계로 만들 뿐이야. 그리고 있지 않은 행들엔 카드가 맞는 기계고, 그래서 애플 실리콘에 대한 퀘스트에 이 표가 인쇄돼 있어.

Code

which_machine.py — 모델, 스트림, 학습, 방의 함수로서의 결정·python
#!/usr/bin/env python3
"""Which machine for which job -- the decision the physics track licenses, as a function.
Inputs: the bytes a token READS (GB, at your bits), the bytes that must be RESIDENT (GB;
the same number for a dense model, the whole file for a mixture), how many streams at
once, the parameter count if you train, and whether the box must sit in a room with people.
Every rule below is arithmetic from earlier lessons; the ranking is this quest's judgment."""

MACHINES = {  # name: (memory GB, GB/s, watts max, quiet in a room?)
    "MacBook Pro M5 Max 128 GB":      (128,  614,  140, True),
    "Mac Studio M3 Ultra 512 GB":     (512,  819,  270, True),
    "RTX 5090 workstation":           (32,   1792, 1000, False),
    "RTX PRO 6000 workstation":       (96,   1792, 1000, False),
    "DGX Spark":                      (128,  273,  140, True),
    "rented H100 (cloud)":            (80,   3350, 700, True),      # quiet because it is elsewhere
}


def decide(read_gb, resident_gb=None, streams=1, train_params_b=None, in_room=True):
    resident_gb = read_gb if resident_gb is None else resident_gb
    rows = []
    for name, (mem, bw, watts, quiet) in MACHINES.items():
        fits = resident_gb + 4 <= mem * 0.9
        ceiling = bw / read_gb if fits else 63 / read_gb          # spill: PCIe 5 x16 carries the spilled bytes
        note = []
        if not fits: note.append("spills over PCIe" if "RTX" in name else "does not fit")
        if train_params_b and mem < train_params_b * 16:          # 16 bytes per parameter before activations
            note.append(f"no full fine-tune ({train_params_b}B x 16 B/param = {train_params_b * 16:.0f} GB)")
        if in_room and not quiet: note.append("loud/hot in a room")
        if streams > 1: note.append(f"batch x{streams}: compute-bound, favours tensor cores")
        rows.append((name, fits, ceiling, note))
    rows.sort(key=lambda r: (r[1], r[2]), reverse=True)
    print(f"reads {read_gb:.1f} GB/token, resident {resident_gb:.0f} GB, streams {streams}, "
          f"train={train_params_b or '-'}, in a room={in_room}")
    for name, fits, ceiling, note in rows:
        print(f"  {name:30} {'fits ' if fits else 'NO   '} ceiling {ceiling:6.1f} tok/s   {'; '.join(note)}")
    print()


decide(14.4)                                   # a 27B at 4 bits, one user
decide(39.7)                                   # a 70B at 4.5 bits/weight, one user
decide(12.4, resident_gb=132)                  # a 235B mixture, 22B active, at 4.5 bits: all experts resident, 22B read
decide(14.4, streams=32)                       # serving 32 users a 27B
decide(4.5, train_params_b=9)                  # fine-tuning a 9B for real

# reads 39.7 GB/token (a 70B at 4.5 bits/weight), one stream, in a room:
#   rented H100 (cloud)            fits  ceiling   84.4 tok/s
#   RTX PRO 6000 workstation       fits  ceiling   45.1 tok/s   loud/hot in a room
#   Mac Studio M3 Ultra 512 GB     fits  ceiling   20.6 tok/s
#   MacBook Pro M5 Max 128 GB      fits  ceiling   15.5 tok/s
#   DGX Spark                      fits  ceiling    6.9 tok/s
#   RTX 5090 workstation           NO    ceiling    1.6 tok/s   spills over PCIe; loud/hot in a room
# reads 12.4 GB/token, resident 132 GB (a 235B mixture, 22B active): only the 512 GB Studio fits, ceiling 66 tok/s
#   by the bytes a token reads -- dividing by the whole 132 GB would say 6, and that is the dense mistake
# reads 4.5 GB/token, train 9B: every card, the Spark and the 128 GB laptop say 'no full fine-tune (144 GB)'; the Studio does not

External links

Exercise

표를 네 것으로 채워. 네 진짜 일 셋, 각각에 대해 이 트랙 레슨들에서 나온 결정적 사실, 그리고 답. 네 숫자로 which_machine.py를 돌리고 그 첫 행을 네 답과 비교해. 어긋나는 곳에서 함수가 적용하지 않은 어느 가중치(방, 전력, 소음, 용량, 속도)를 네가 적용했는지 쓰고, 그 가중치를 네 것으로 카드에 올려.
Hint
함수는 바이트, 대역폭, 용량, 와트를 알아. 기계가 침대 옆에 놓일 거라는 것, 원하는 모델이 다음 달에 나온다는 것, 절대 학습을 안 할 거라는 건 몰라. 그것들이 표를 구매로 바꾸는 인자들이고, 카드가 그것들이 있을 자리야.

Progress

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

댓글 0

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

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