C.W.K.
Stream
Lesson 02 of 06 · published

Memory optimization — Mac 의 진짜 벽이 어디인가

~14 min · memory, wired-memory, vm-pressure

Level 0Curious
0 XP0/51 lessons0/15 achievements
0/100 XP to next level100 XP to go0% complete

Mac 의 진짜 벽이 어디인가

foundations.lesson4 의 냅킨 계산이 모델이 대략 얼마나 메모리 필요한지 말해줘. 현실은 macOS 가 GPU 가 unified memory 의 100% lock 하게 안 둬 — Mac SKU 에 따라 다른 wired-memory 천장 있음, 전형적으로 OS 사용과 다른 앱 위해 총 RAM 의 ~25% 예약. 512 GB M3 Ultra Studio 에서 실용 GPU 천장이 380 GB 에 더 가까움; 64 GB MacBook Pro 에서 48 GB 에 더 가까움.

이 레슨은 네 벽이 어디인지와 hit 했을 때 뭐 할지 알아내는 진단 도구.

진단 명령

세 sysctl 값이 wired-memory 상황에 대해 알아야 할 모든 거 말해줘:

  • hw.memsize — 총 물리 unified memory (byte).
  • iogpu.wired_limit_mb — 명시적 GPU wired-memory cap (MB). 0 은 "system default" 의미 (전형적으로 ~총의 75%).
  • vm.memory_pressure (memory_pressure 도구 통해) — 현재 압력 상태 (normal, warn, critical).

천장 올리기 — 안전할 때

sudo sysctl iogpu.wired_limit_mb=N 통해 iogpu.wired_limit_mb 올려서 GPU 에 기본보다 더 많은 메모리 줄 수 있어. 안전한지는 다른 뭐 돌리느냐에 달림:

  • ML 작업에 dedicate 된 192-512 GB Mac Studio, 다른 무거운 앱 없음 — 총의 90% 까지 올리는 거 합리적.
  • 에디터, 브라우저, 다른 앱 돌리는 16-64 GB MacBook — 올리지 마. OS 가 자기 몫 못 받으면 macOS 가 swap 또는 프로세스 kill 시작.
  • 한 큰 작업 위해 임시로 올렸으면, 끝나면 다시 설정 — 값이 세션에 걸쳐 persist 하지만 reboot 에 reset.

벽 hit 했을 때 뭐 하나

  1. 양자화 떨어뜨림 — Q4 → 더 작은 group_size 의 Q4, 또는 Q4 → mixed_3_4 (Track 3). 각 step 이 진짜 메모리 깎음.
  2. Context 줄임 — KV cache 가 시퀀스 길이로 선형 scale. 긴-context generation 중 OOM 보면 max_tokens cap 또는 더 작은-context 모델 사용.
  3. 모델 줄임 — OS-레벨 메모리 한계와 싸우기 전에 한 tier 떨어뜨림 (70B → 13B). sysctl 올리는 것보다 싸.
  4. full precision 의 더 큰 모델 대신 더 작은 base 모델 + LoRA. Track 4 의 레슨이 여기에도 적용.

Peak-memory 측정 워크플로

모델 + 워크로드를 production 에 commit 할 때마다 peak 메모리 한 번 측정. 대표적 추론 run 끝의 mx.get_peak_memory() 가 실제 천장 줘. 20% 안전 margin 추가, 그게 여전히 wired-memory cap 아래인지 확인, 그러면 calibrate 됨.

Code

네 Mac 의 unified-memory 상태 진단·bash
# Total unified memory
sysctl -n hw.memsize | awk '{ printf "Total RAM         : %.1f GB\n", $1/1024/1024/1024 }'

# GPU wired-memory cap (0 = system default ~ 75% of total)
sysctl iogpu.wired_limit_mb

# Current pressure state
memory_pressure

# Sample (M3 Ultra Studio):
#   Total RAM         : 512.0 GB
#   iogpu.wired_limit_mb: 0
#   The system has X% of memory free.
추론 run 의 peak 메모리 측정·python
import mlx.core as mx
from mlx_lm import load, generate

mx.reset_peak_memory()
model, tok = load("mlx-community/Llama-3.2-1B-Instruct-4bit")
print(f"After load             : peak {mx.get_peak_memory()/1024/1024:.1f} MB")

generate(model, tok, prompt="Tell a long story:", max_tokens=200, verbose=False)
print(f"After 200-tok generate : peak {mx.get_peak_memory()/1024/1024:.1f} MB")

# Add a 20% safety margin to the peak before declaring "this fits".
# Verified (M3 Ultra Studio):
#   After load             : peak ~675 MB
#   After 200-tok generate : peak ~685 MB
천장 임시 올리기 (전용 ML Mac 에서만)·bash
# Raise GPU wired memory to 460 GB (only on a 512 GB Studio used for ML work)
sudo sysctl iogpu.wired_limit_mb=460000

# Verify
sysctl iogpu.wired_limit_mb

# Reset to system default when done (or just reboot)
sudo sysctl iogpu.wired_limit_mb=0

# WARNING: Do NOT do this on a MacBook you also use for daily work.
# macOS needs its share for the OS itself, kernel buffers, and other apps.

External links

Exercise

네 Mac 에서 진단 블록 돌려. 총 RAM, 현재 wired_limit, memory_pressure 상태 알아채. 그 다음 실제로 쓰는 모델에 peak-메모리 측정. (peak + 20%) / wired_cap 계산 — 그게 헤드룸 활용. 80% 위면 벽에 가깝고 다음 더 큰 모델이 fit 안 됨. 안전한지 천장 가까운지 두 문장.

Progress

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

댓글 0

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

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