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

Apple Silicon Unified Memory가 왜 게임 체인저인가

~14 min · metal, unified-memory, apple-silicon, architecture

Level 0Beginner
0 XP0/38 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

RAM 풀 하나, 프로세서 둘이 주소 매김

NVIDIA discrete GPU랑 Apple Silicon 사이 가장 중요한 architectural 차이는 peak FLOPs도 vendor 충성도도 아니야. 데이터가 어디 사느냐야.

시스템CPU 메모리GPU 메모리전송
RTX 4090 데스크탑64 GB DDR524 GB GDDR6XPCIe 4.0 ×16, ~32 GB/s
Mac Studio M3 Ultra (512 GB)512 GB LPDDR5X (공유)0 — 같은 RAM

데스크탑은 cudaMalloc으로 GPU에 할당하고 PCIe로 데이터 복사. CPU랑 GPU가 자기 DRAM 따로 가지고 32 GB/s 파이프로 만나는데, inference 병목 자주 여기서 나.

Apple Silicon은 SoC가 CPU 코어 + GPU 코어 + DRAM 컨트롤러를 하나의 메모리 서브시스템 뒤에 통합해. device.makeBuffer(length:options:)storageModeShared로 부르면 CPU가 직접 read/write 가능하고 GPU가 같은 물리 주소로 보는 buffer 돌아와. 복사 0. PCIe 0.

실제 결과:

  • 24 GB VRAM에 안 들어가는 모델도 192–512 GB unified memory엔 자주 들어가. Llama 70B FP16 (~140 GB)은 4090에선 offload 없이 불가능, Mac Studio 192 GB에선 trivial.
  • cudaMemcpy 사라져. Track 5에서 볼 9단계 GPU 워크플로우가 Apple Silicon에선 7단계로 줄어 — step 4랑 7이 no-op.
  • Bandwidth 차이. 4090의 GDDR6X = ~1.0 TB/s, M3 Ultra LPDDR5X = ~820 GB/s. Apple은 byte당 약간 느린데 PCIe 통째 스킵. 순 throughput 자주 이김.
  • 진짜 trade-off 하나: 그 bandwidth가 CPU랑 GPU 공유. 둘 다 동시에 두들기면 effective bandwidth 손해. discrete GPU에선 CPU 트래픽이 다른 파이프.

MLX (Apple의 PyTorch 모양 framework)가 다르게 느껴지는 이유도 이거야. mlx.array(np_array)는 byte 안 옮겨 — numpy array가 이미 사는 같은 RAM에 대한 view야.

Code

CPU + GPU 둘 다 보는 buffer 할당·swift
import Metal

let device = MTLCreateSystemDefaultDevice()!
let n = 1024
let bytes = n * MemoryLayout<Float>.stride

// storageModeShared: 같은 물리 RAM, CPU + GPU 둘 다 주소 매김.
let buf = device.makeBuffer(length: bytes, options: .storageModeShared)!

// CPU가 바로 write — staging 없음, copy 없음.
let ptr = buf.contents().bindMemory(to: Float.self, capacity: n)
for i in 0..<n { ptr[i] = Float(i) }

// GPU가 같은 buffer에 커널 launch.
// (encoder.setBuffer(buf, offset: 0, index: 0) ... )
// 4090에선 같은 게 malloc + cudaMalloc + cudaMemcpy.
Storage mode — Metal의 옵션 셋·swift
// shared    — CPU + GPU 같은 RAM, 복사 없음, compute 기본.
.storageModeShared

// private   — GPU-only 메모리 (여전히 unified RAM 안인데 CPU
//             안 보임). 일부 모양에선 GPU access 더 빠름.
.storageModePrivate

// managed   — discrete GPU 박힌 Intel Mac 전용. Apple Silicon은
//             무시 — shared처럼 동작.
.storageModeManaged

External links

Exercise

SSH 가능한 Mac 아무거나에서 system_profiler SPHardwareDataType | grep Memory (unified RAM 사이즈 보여줌)랑 system_profiler SPDisplaysDataType | grep VRAM (Apple Silicon에선 'Built-In' + 같은 숫자) 돌려. 그 다음 이전 트랙 lesson 2에서 저장한 nvidia-smi --query-gpu=memory.total --format=csv 출력이랑 비교. 격차 내재화: 24 GB siloed VRAM vs 192-512 GB unified — 같은 워크로드, 다른 물리.

Progress

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

댓글 0

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

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