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

MLX가 진짜 뭐야

~14 min · mlx, introduction, philosophy

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

마케팅 말고, 설계로 설명해봐

흔한 소개문은 이래. "MLX는 Apple Silicon에 최적화된 Apple의 머신러닝 프레임워크이며, NumPy와 비슷한 API와 지연 실행을 제공한다." 틀린 말은 아니야. 다만 웬만한 프레임워크 소개문도 비슷해서, 정작 MLX가 왜 따로 존재하는지는 안 보여줘. 설계의 출발점부터 잡자.

MLX는 통합 메모리를 기본 전제로 삼고, GPU 메모리가 따로 떨어진 구조를 오히려 예외로 보는 배열 라이브러리야. 차이는 여기서 생겨. 지연 실행 그래프, 함수 변환, NumPy와 닮은 API도 결국 이 선택에서 뻗어나와.

지루하지만 필요한 사실

MLX는 2023년 12월에 공개됐어. 이 레슨을 검증한 2026-05-03 기준 버전은 이래.

  • mlx 0.31.x — 핵심 배열 라이브러리, MIT 라이선스
  • mlx-lm 0.31.x — 그 위에 얹힌 언어 모델 실행·서빙 도구
  • 그 밖에 mlx-vlm, mlx-audio, Hugging Face의 mlx-community 조직, 예제 기준 저장소인 mlx-examples가 있어

MLX는 Apple의 연구 프로젝트야. 오픈 소스지만 Apple 머신러닝 연구팀이 이끌어. Python, Swift, C++, C 바인딩을 모두 제공하고, 이 퀘스트에서는 처음부터 끝까지 Python을 써. 앞으로 만날 다른 AI 도구도 대부분 Python에 모여 있으니까.

그저 배열 라이브러리 하나가 더 생긴 게 아냐

NumPy는 배열을 익숙하게 만들었고, PyTorch는 배열에 기울기를 붙였고, JAX는 배열에 함수 변환을 붙였어. MLX가 들고 온 건 GPU와 CPU가 같은 바이트를 동시에 읽는 배열이야. device='cuda:0'도, tensor.to(device)도 없어. "이 데이터를 GPU로 옮겼던가?"를 추적하는 디버깅도 사라져.

사소한 차이처럼 보여도 전혀 아니야. 다음 레슨 하나를 통째로 써야 할 만큼 핵심이거든. 지금은 이 그림만 잡아둬. 배열은 두 프로세서가 함께 보는 메모리에 살고, 그 사실이 MLX 설계의 중심이야. 문서 구석에 붙은 기능 하나가 아니야.

이 퀘스트가 데려갈 곳

8개 트랙, 51개 레슨이야. 설치 상태를 확인하는 데서 시작해, Mac에서 Llama를 파인튜닝하고 OpenAI 호환 엔드포인트로 서빙하는 데까지 가. 모든 코드 블록은 현재 MLX에서 다시 실행해 검증했어. LLM에 MLX 코드를 부탁했다가 그럴듯한 가짜 API를 받는 일까지 물려줄 생각은 없거든. 그 문제는 compare.lesson5에서 레슨 하나로 제대로 다뤄.

먼저 버전을 확인해

import mlx.core as mx를 입력하기 전에 아래 확인부터 돌려봐. 지금 환경이 이 퀘스트를 검증한 MLX와 얼마나 가까운지 바로 보여줘. 많이 뒤처졌다면 그 환경에서 pip install -U mlx mlx-lm을 먼저 실행해. MLX는 일부러 빠르게 움직이는 프로젝트라, 시작할 때는 최신판을 쓰는 편이 맞아.

Code

빠르게 버전 확인하기 (`mlx` Conda 환경에서)·bash
# In a clean conda env on Apple Silicon
conda activate mlx

python -c "import mlx.core as mx; print('mlx:    ', mx.__version__)"
python -c "import mlx_lm;        print('mlx-lm: ', mlx_lm.__version__)"
python -c "import platform;      print('python: ', platform.python_version(), platform.machine())"

# Expected (re-verified 2026-08-07):
#   mlx:     0.32.0
#   mlx-lm:  0.31.3
#   python:  3.11.9 arm64
첫 MLX 배열 — 무엇이 빠졌는지 봐·python
import mlx.core as mx

a = mx.array([1.0, 2.0, 3.0, 4.0])
print(a)
print("dtype:  ", a.dtype)
print("shape:  ", a.shape)

# No device argument. No .to('cuda') / .to('mps').
# The default device IS the unified memory the GPU and CPU share.
print("device: ", mx.default_device())   # → Device(gpu, 0)  on Apple Silicon

External links

Exercise

mlx 환경에서 Python REPL을 열고 세 질문에 두 문장씩 답해봐. 적을 필요는 없고, 자기 말로 설명할 수 있으면 돼. (1) mx.default_device()는 Mac에서 무엇을 돌려주며, 그 결과는 CPU와 GPU의 분리에 관해 무엇을 알려줘? (2) pip show mlx mlx-lm을 실행하면 어떤 버전이 나오고, 이 퀘스트의 meta.json에 적힌 검증 시점과 얼마나 차이가 나? (3) Rosetta x86 Python 환경에 MLX를 pip install하면 어떤 오류가 날 것 같아? 실제로 설치하지 말고 이유까지 추측해봐. 레슨 2에서 답을 확인하게 될 거야.

Progress

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

댓글 0

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

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