M4급 체크리스트입니다. 연관 글: llama.cpp·Ollama·다중 모델 라우팅·GenAI 관측성·로컬 RAG 쿼터. 운영 전에는 동일 스크립트로 원격 노드를 한 번 더 돌리세요.
선택 시나리오 · 배치 크기와 메모리 대조표 · 검수 절차와 모니터링 지표 · FAQ
리스크. 선행·디코드 피크가 다르고 KV는 길이·레이어에 민감하며 배치는 활성화와 캐시를 동시에 키워 꼬리 지연을 부풀립니다.
선택 시나리오
워크로드 기하부터 고르세요. 대화형은 첫 토큰·꼬리, 오프라인은 처리량, 파인튜닝은 Trainer·PEFT면 HF 우선. 표는 출발점이며 실측으로 확인합니다.
| 시나리오 | MLX-LM | Transformers+MPS |
|---|---|---|
| 추론 배포 | MLX 그래프·양자 경로가 스윕에 유리 | MPS 배치·dtype·패딩 명시 후 E2E 측정 |
| HF 학습 스택 | 변환·서빙 병행 | Trainer·PEFT 주간 루틴이면 척추 유지 |
| 긴 컨텍스트·동시 세션 | KV·캐시 재사용 정책 스트레스 | 프로세스 분리·대화·배치 상한 분리 |
| Ollama·llama.cpp 공존 | MLX 가중치 트랙 분리 | 파이썬 평가 트랙·라우팅은 다중 모델 글 |
KV는 길이·레이어에 민감하고 선행은 스파이크를 만듭니다. RAG는 검색·임베딩과 경합하니 쿼터 글을 병행하세요.
배치 크기와 메모리 대조표
출발점이며 보장은 아닙니다. 압력 색·스왑·십 분 안정 구간을 게이트로 삼고 24GB급은 여유 8~12GB를 두는 팀이 많습니다.
| 워크로드 | 출발 배치·컨텍스트 | 통합 메모리에서 볼 것 |
|---|---|---|
| 대화형 | 배치 1·최단 컨텍스트 |
RSS·압력·스왑·첫 토큰 회귀 |
| 오프라인 평가 | 배치·max_tokens 단계 상향 |
선행 스파이크·인덱싱과 분리 |
| RAG 합성 | 청크 토큰 상한·임베딩 배치 분리 | 리트리버+생성 피크·쿼터 정합 |
MLX-LM. 경로·프롬프트·온도로 치환. 지원 시 --max-kv-size로 캐시 상한.
python -m mlx_lm.generate --model MODEL --prompt P.txt --max-tokens 512 --temp 0.7
python -m mlx_lm.server --model MODEL --port 8080Transformers+MPS. 폴백·dtype·패딩·마스크 명시.
export PYTORCH_ENABLE_MPS_FALLBACK=1
# AutoModelForCausalLM.from_pretrained(..., device_map="mps") 후 generate검수 절차와 모니터링 지표
절차. 리비전·토크나이저 고정→대화·오프라인 분리·p50·p95→요청별 토큰·배치·캐시·오류 로그→피크 메모리·스왑→필드를 GenAI 관측성에 맞춤→전용 호스트에서 2~4시간 재생.
지표. time_to_first_token·tokens_per_sec_decode·kv_cache_bytes·mem_pressure_peak·oom_or_fallback_count로 기준선 대비 회귀만 판단.
- 통과: 안정 처리량·스왑 없음·SLO·저오류
- 조사: 디코드 정지·유휴 갭·배치 오설정
- 실패: 지속 압축·스왑·MPS 폴백 반복·무한 큐
FAQ
둘 다 같은 M4에? 프로세스 분리·상한 명시로 대역 경합을 막으세요.
표와 실측이 왜 다르죠? 선행·디코드 병목이 다르고 KV 재사용이 곡선을 바꿉니다.
다음 단계? 런북에 스크립트·메트릭을 커밋한 뒤 원격 mini M4에서 장시간 재검증 후 트래픽을 붙이세요.
요약: 시나리오→스택, 배치·KV→통합 메모리, 스크립트·관측→배포 가능성.