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

핵심은 와트당 성능이었어

~14 min · cpu-soc, power, performance-per-watt, powermetrics, thermal, energy-per-token

Level 0스펙 시트 훑는 사람
0 XP0/91 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"이 트랙의 모든 설계 결정은 제약 하나 아래서 내려졌어. 속도도 아니고. 비용도 아니고. 열이야."

트랙 전체를 설명하는 제약

앞의 다섯 레슨을 질문 하나 들고 다시 읽어봐. 왜? 왜 사 온 코어 대신 아키텍처 라이선스인가. 코어를 전력 예산에 맞춰 튜닝할 수 있게. 왜 빠른 대신 넓은가. 마지막 1기가헤르츠가 첫 1기가헤르츠보다 에너지를 더 먹으니까. 왜 코어가 두 종류인가. 백그라운드 작업이 싼 쪽에서 돌게. 왜 CPU에 행렬 유닛이 있고 뉴럴 엔진과 미디어 엔진이 있는가. 전문가는 범용 코어 에너지의 몇 분의 일로 제 일을 하니까. 모든 답이 같은 답이야. 이 칩은 배터리가 있고 팬이 없는 기기를 위해 설계됐고, 거기서 와트당 성능은 마케팅 문구가 아니라 제품이 존재할 수 있게 하는 유일한 지표야.

설계가 맥으로 옮겨오면서 제약은 느슨해졌고 모양은 남았어. Mac Studio는 폰보다 훨씬 많이 끌어다 쓸 수 있고, 애플 규격은 '최대 연속 전력'을 480 W로 잡아. 하지만 안의 칩은 그걸 쓰라고 만들어진 적이 없고, 애플 자체 측정이 안 쓴다고 말해. 512 GB M3 Ultra 구성은 애플 테스트에서 유휴 9 W, 최대 270 W야. 나머지 전력 예산은 설계가 안 쓰는 여유야.

하루 종일 추론을 돌리는 기계한테 이게 뜻하는 것

이 집의 맥들은 하루 24시간 켜져 있어. 몇 대는 추론을 계속 서빙해. 애플 전력 페이지의 숫자 둘이 그 규모를 정해줘.

기계 (애플이 테스트한 구성)유휴최대증거
Mac Studio (2025), M3 Ultra 32C/80G, 512 GB9 W270 W벤더 (support.apple.com/102027)
Mac Studio (2025), M4 Max 14C/32G, 36 GB6 W145 W벤더 (같은 페이지)
Mac Studio, 최대 연속 전력 (규격)480 W벤더 (기술 사양)
GeForce RTX 5090 (카드 단독)575 W벤더 (NVIDIA)
RTX PRO 6000 Blackwell (카드 단독)600 W벤더 (NVIDIA 데이터시트)
DGX Spark (GB10 SoC TDP. 본체엔 240 W 전원 공급 장치가 딸려 나와)140 W벤더 (NVIDIA 하드웨어 페이지)

27B 모델을 초당 32.6토큰으로 디코드하는 M3 Ultra(실측, office, 실험 트랙)는 그러는 동안 270 W보다 많이 끌어다 쓸 수 없고, 거의 확실히 훨씬 적게 써. 애플의 최대치는 기계 전체 스트레스 수치니까. 그러면 토큰당 에너지 상한이 8줄쯤이고, 진짜 값은 그 아래야. 코드 블록이 그 산수를 하고, 상한을 측정값으로 바꾸는 방법을 보여줘. 애플 자체 샘플러인 powermetrics는 CPU, GPU, 뉴럴 엔진 전력을 밀리와트로 보고하고, 필요한 건 루트 권한이랑 돌릴 모델뿐이야. 이 퀘스트의 세션은 그걸 못 돌렸어. 실험실 기계들은 루트 비밀번호 없이 ssh로 닿거든. 그래서 이 레슨은 명령어랑 상한을 주고, 상한을 상한이라고 라벨 붙여.

정직한 비교

외장 카드는 자기 메모리에 들어가는 모델이면 절대 디코드 경주를 이겨(CUDA 트랙). 맥이 근처에도 못 가는 전력 예산으로. 자기 프로세서랑 메모리가 따로 있는 기계 안의 575 W 카드는 킬로와트급 컴퓨터고, 시끄러워. 맥의 자리는 곡선 위의 다른 점이야. 카드의 절반도 안 되는 전력으로 초당 토큰은 적게, 조용하게, 유휴 9 W로, 그리고 카드가 못 담는 모델을 담을 수 있게. 이 상한들이 맥한테 주지 않는 게 토큰당 줄이야. 벤더 최대치끼리 놓으면 카드의 토큰당 4.6 J가 Studio의 8.3 J 상한을 이기고, 맥이 실제로 상한 아래 어디 있는지는 이 퀘스트가 못 잰 powermetrics 값이야. 어느 점도 모두한테 맞는 점은 아니야. 어떤 워크로드가 어느 점에 속하는지는 엣지 시대 트랙이 논증해. 이 레슨의 일은 두 점이 존재하는 건 서로 다른 두 제약이 그렸기 때문이고, 맥의 제약은 열이었다는 걸 보여주는 것뿐이야.

Code

energy_per_token.py — 벤더 전력 수치와 실측 디코드로 구한 상한·python
#!/usr/bin/env python3
"""Joules per token, bounded. Power figures are vendor maxima (Apple's tested
maximum for the exact office configuration; NVIDIA board power). Decode rates
are measured (office) or ceiling arithmetic (the card) — the labels say which."""

rows = [
    # machine,                        watts, tok/s,  power label,           rate label
    ("office M3 Ultra, Qwen3.5-27B 4-bit", 270, 32.6, "vendor max (Apple)",   "measured 2026-09-15"),
    ("office M3 Ultra, Qwen3.5-9B 4-bit",  270, 95.1, "vendor max (Apple)",   "measured 2026-09-15"),
    ("RTX 5090, 14.4 GB model (fits)",     575, 1792 / 14.4, "vendor board power", "ceiling = 1792 GB/s ÷ 14.4 GB (physics, not measured)"),
]

print(f"{'machine / model':38} {'W':>4} {'tok/s':>6} {'J/token (upper bound)':>22}")
for name, w, tps, plabel, rlabel in rows:
    print(f"{name:38} {w:4d} {tps:6.1f} {w / tps:22.2f}   [{plabel}; {rlabel}]")

print("\nA bound is not a measurement. Replace the watts with a powermetrics sample:")
print("  sudo powermetrics --samplers cpu_power,gpu_power,ane_power -i 1000 -n 30")
print("while a model decodes; add CPU + GPU power, divide by tokens per second.")
직접 재기: 모델이 디코드하는 동안 powermetrics (루트 필요)·bash
# terminal 1: decode something for ~30 s in your MLX env
python -m mlx_lm generate --model mlx-community/Qwen3.5-9B-4bit \
  --prompt "Explain unified memory in 400 words." --max-tokens 300

# terminal 2: sample power once a second for 30 s
sudo powermetrics --samplers cpu_power,gpu_power,ane_power -i 1000 -n 30 \
  | grep -E "CPU Power|GPU Power|ANE Power"
# CPU Power: 1234 mW
# GPU Power: 45678 mW      <- the number that matters for decode
# ANE Power: 0 mW          <- the Neural Engine is idle; MLX runs on the GPU

# joules per token = (CPU mW + GPU mW) / 1000 / tokens-per-second

External links

Exercise

모델이 30초 동안 디코드하는 사이에 네 맥에서 powermetrics 레시피를 돌려. 평균 GPU와 CPU 전력이랑 디코드 속도를 기록하고, 토큰당 줄을 계산해서 완전한 도장을 단 실측 줄로 카드에 추가해. 그다음 energy_per_token.py의 상한이랑 비교하고, 네 맥이 애플 최대치보다 실제로 얼마나 아래서 돌았는지 한 문장으로 써.
Hint
GPU 레일이 거의 전부를 지고 ANE 레일은 0을 읽을 거야. 노트북이면 전원을 꽂고 돌려. 배터리에선 스케줄러가 GPU를 제한할 수 있어서, 칩이 아니라 정책을 재게 돼.

Progress

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

댓글 0

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

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