1. 문제 분해
Rosetta x86 Python이면 MPS가 꺼질 수 있습니다. batch가 너무 작으면 Metal 활용이 낮고, 너무 크면 통합 메모리가 급등합니다. 일부 커널은 CPU로 떨어지며 AMP 이득은 모델마다 다릅니다. 노트북 루프에서는 epoch 경계에 torch.mps.empty_cache()와 gc.collect()가 필요합니다.
2. 의사결정 표
| 축 | CPU | MPS | MLX | 원격 |
|---|---|---|---|---|
| 강점 | 호환 | torch 자산 | Apple 최적화 | 격리·SLO |
| 리스크 | 상한 | 연산자·수치 | 이중 운영 | 운영 |
3. 5단계 런북
- arm64 Python과 torch 버전을 고정합니다.
- is_built/is_available과 더미 matmul device를 로그합니다.
- batch를 스윕해 처리량·메모리 워터마크를 저장합니다.
- epoch 후 gc와 empty_cache를 실행합니다.
- CPU 대비 가속과 핫 연산자를 검토해 MLX/원격으로 분기합니다.
4. 인용 임계값(실측으로 교체)
- step 시간이 CPU 대비 22% 미만 개선이고 GPU 시간이 18% 미만이면 데이터 파이프라인을 의심합니다.
- 10 epoch 후 메모리가 26% 이상 상승하면 참조 누수·원격 전용 호스트를 검토합니다.
- CUDA와 손실을 bitwise로 맞춰야 하면 훈련 위치를 재정의합니다.
5. 증상 표
| 증상 | 가설 | 조치 |
|---|---|---|
| 초반만 빠름 | 캐시 | batch·해제 |
| 특정 층만 느림 | 커널 갭 | profiler |
6. MLX·원격 전환
LLM 추론이 중심이면 Ollama+MLX 글을 먼저 읽습니다. 화상·IDE·브라우저가 메모리를 나눠 쓰면 원격으로 옮기고 SSH/VNC 가이드로 토폴로지를 잡습니다. 연산자가 2주 안에 수렴하지 않으면 아키텍처를 분할합니다.
7. FAQ
MPS vs MLX는 모델 의존입니다. SLO에는 stable torch를 고정합니다. Docker MPS는 Colima 글에서 VM·I/O 비용을 먼저 계산합니다.
8. 심층: MPS는 호환성 세금
연구 코드를 Metal에 연결하는 다리이지만 CUDA 1:1을 기대하면 안 됩니다. Metal 처리량·작은 batch 오버헤드·통합 메모리 이점을 같은 그래프에 남기세요. torch 버전·커밋·batch·피크 메모리·fallback 플래그 다섯 쌍을 실험 노트에 고정합니다. 엔진 비교 글은 계약(해상도·batch·양자화)을 정의하고, Docker 글은 GPU 가시성 손실을 별 게이트로 둡니다. 원격 Mac 임대는 노트북을 야간 서버로 쓰는 습관을 줄입니다.
9. 관측 미니 표
| 신호 | 우선 | 완화 |
|---|---|---|
| 가속 ~1x | device·동기 | profiler |
| OOM | 동적 그래프 | empty_cache |
10. 마무리
노트북은 탐색, 공유 노드는 약속에 적합합니다. MACGPU는 로그인 없이 공개된 플랜과 도움말로 원격 Apple Silicon을 시험할 수 있습니다. 외부에 지연을 약속하기 전 arm64 증명과 곡선을 첨부하세요.
11. DataLoader·동기: GPU 사용률이 낮다고 MPS 실패는 아닙니다
Activity Monitor에서 GPU 막대만 보면 MPS가 꺼졌다고 단정하기 쉽지만, 실제로는 JPEG 디코딩·색 보정·무거운 augmentation, 혹은 매 스텝 loss.item()과 동기 로그가 CPU 쪽에서 대기점을 늘립니다. 해결은 모델 확장이 아니라, 워밍업 뒤 짧은 구간으로 프로파일을 잡아 데이터 경로와 순전파를 분리 측정하는 일입니다.num_workers를 올릴수록 워커 상주 메모리가 늘어나 16GB급에선 역효과가 나기도 하니, 워커 수·배치·p95를 한 줄에 묶어 기록하세요.
pin_memory는 CUDA 데이터센터 튜토리얼을 그대로 복사하지 말고, 프로파일러로 호스트—디바이스 복사가 과잉인지부터 확인합니다.
12. torch.profiler 읽기
수십 스텝만 잘라 CPU·MPS 활동을 함께 봅니다. 자체 시간은 작은데 대기가 긴 커널은 동기화나 미지원 연산자를 의심합니다. 비전 파이프라인은 전처리만 따로 캡처해 스토리지 지연과 합성곱 본연을 섞지 마세요. 멀티프로세스 DataLoader를 쓰면 시드와 worker_init_fn을 README에 적어 “같은 스크립트인데 결과가 다르다”는 논쟁을 줄입니다.
13. 수치 정합과 제품 지표
CUDA 클러스터와 손실을 비트 단위로 맞추려 하면 갈등이 커집니다. 검증 지표(mAP·top-1 등)로 허용 편차를 정하고 dtype·감쇠 정책을 표로 남기세요. 엄밀 재현이 필요한 구간은 단일 플랫폼으로 고정하거나, 승인된 편차표를 둡니다.
14. 소형 예시: 16GB 노트북에서 ViT-tiny 배치 스윕
클라우드 GPU에서 쓰던 큰 배치를 그대로 가져오면 스왑이 끼어듭니다. 배치를 단계적으로 바꿔 피크 메모리와 처리량을 쌍으로 적습니다. 같은 절차를 64GB 원격 Mac에서 반복해, 최적점이 이동한 이유를 I/O·열 여유로 설명할 수 있게 합니다.
15. 멀티프로세스와 파일 디스크립터
macOS의 포크·스폰 전제는 Linux와 다릅니다. 교착이 나오면 단일 프로세스로 원인을 좁히고 워커를 하나씩 되돌립니다. 사이트의 로컬 LLM 동시 실행 글처럼 통합 메모리 경쟁을 실험 노트에 함께 적으세요.
16. 체크포인트·AMP·누적
MPS에서 AMP는 CUDA와 1:1이 아닙니다. 마이크로배치 누적 시 스케일링과 옵티마이저 스텝을 다시 확인하고, gradient checkpointing을 켜면 프로파일 형태가 바뀌므로 공개 수치에 전략을 명시합니다.
17. 실험 대장의 소박한 칸
데이터셋 샤드 체크섬, 백그라운드 앱 유무, 전원 어댑터 연결, 저전력 모드, 캐시 디렉터리 마운트 종류, 원격으로 옮긴 뒤에는 아티팩트 스토어 RTT까지 한 줄 적습니다. 사소해 보여도 12% 성능 저하가 배터리만으로 돌릴 때의 쓰로틀링이었음을 빠르게 증명합니다.