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

메모리 최적화 — Mac의 실제 한계 찾기

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

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

Mac에서 부딪히는 진짜 벽

foundations.lesson4의 어림셈은 모델에 필요한 메모리를 대략 알려 줘. 하지만 macOS는 GPU가 통합 메모리 전부를 고정해 쓰게 두지 않아. Mac 기종마다 고정 메모리 한계가 다르고, 보통 운영체제와 다른 앱을 위해 전체 RAM의 약 25%를 남겨 둬. 512GB M3 Ultra Mac Studio의 실용적인 GPU 한계는 380GB에 가깝고, 64GB MacBook Pro는 48GB에 가까워.

이 레슨에서는 내 Mac의 한계가 어디인지 찾고, 그 벽에 닿았을 때 무엇을 바꿀지 진단해.

진단 명령

다음 세 값을 보면 고정 메모리 상태를 파악할 수 있어.

  • hw.memsize — 전체 물리 통합 메모리를 바이트로 보여 줘.
  • iogpu.wired_limit_mb — GPU가 고정해 쓸 수 있는 명시적 한계를 MB로 보여 줘. 0은 시스템 기본값을 뜻하며 보통 전체의 약 75%야.
  • vm.memory_pressurememory_pressure 도구를 통해 현재 압력이 정상, 경고, 위험 중 어디인지 알려 줘.

한계를 올려도 되는 경우

sudo sysctl iogpu.wired_limit_mb=N으로 iogpu.wired_limit_mb를 높이면 GPU에 기본값보다 더 많은 메모리를 줄 수 있어. 안전한지는 같은 Mac에서 무엇을 함께 돌리느냐에 달렸어.

  • 머신러닝에 전용으로 쓰는 192~512GB Mac Studio에 다른 무거운 앱이 없다면 전체의 90%까지 높이는 선택이 합리적일 수 있어.
  • 편집기와 브라우저 등 여러 앱을 함께 쓰는 16~64GB MacBook에서는 올리지 마. 운영체제가 필요한 몫을 얻지 못하면 macOS가 스왑을 늘리거나 프로세스를 종료해.
  • 큰 작업 하나 때문에 잠시 올렸다면 끝난 뒤 되돌려. 값은 현재 부팅 세션 동안 유지되지만 재부팅하면 초기화돼.

벽에 닿았을 때

  1. 양자화를 더 낮춰 — Q4에서 더 큰 group_size의 Q4로 바꾸거나, 평균 비트 수가 더 낮은 mixed_3_4를 써(트랙 4). 그룹이 커지면 축척값·영점의 부가 비용이 줄고, 평균 비트 수를 낮추면 가중치 자체가 더 작아져.
  2. 문맥을 줄여 — KV 캐시는 시퀀스 길이에 비례해 커져. 긴 문맥 생성 중 메모리 부족이 나면 max_tokens를 제한하거나 문맥이 더 짧은 모델을 써.
  3. 모델 크기를 낮춰 — 운영체제의 메모리 한계와 싸우기 전에 70B에서 13B처럼 한 단계 내려가. sysctl을 건드리는 것보다 싸고 안전해.
  4. 완전 정밀도의 큰 모델 대신 작은 기반 모델과 LoRA를 써. 트랙 5의 교훈이 여기에도 적용돼.

최대 메모리 측정 흐름

모델과 작업을 운영에 넣기로 할 때마다 최대 메모리를 한 번 재. 대표적인 추론을 마친 뒤 mx.get_peak_memory()를 보면 실제 최대값을 얻을 수 있어. 여기에 안전 여유 20%를 더하고도 고정 메모리 한계 아래인지 확인하면 판단 근거가 생겨.

Code

Mac의 통합 메모리 상태 진단하기·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.
추론의 최대 메모리 측정하기·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
한계 임시로 올리기(머신러닝 전용 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 상태를 확인해. 실제 사용하는 모델의 최대 메모리도 잰 다음 (최대값 + 20%) / 고정 메모리 한계를 계산해. 이 값이 여유 공간 사용률이며 80%를 넘으면 한계에 가까워 다음 크기의 모델은 들어가기 어려워. 지금 안전한지 한계에 가까운지 두 문장으로 적어.

Progress

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

댓글 0

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

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