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

솔직한 평가 — 지금 MLX가 아닌 것

~16 min · honest, limits, linalg-gap

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

장점만으로는 도구를 제대로 고를 수 없다

앞선 다섯 트랙은 MLX가 잘하는 일을 깊게 다뤘어. 이번에는 균형을 맞춰 MLX가 잘하지 못하는 일과 빠진 기능, 2026년 5월 기준으로 아직 거친 부분을 보자. 버전에 따라 달라지는 항목인 선형 대수 목록과 JACCL의 macOS 최소 버전은 2026-09-15에 다시 확인했어. 현실적인 기대를 세우고, 곧 메워질 빈틈과 구조적인 한계를 구분하는 데 써.

선형 대수의 빈틈

MLX의 mx.linalg 모듈은 NumPy나 PyTorch보다 훨씬 작아. mlx 0.32.x 기준으로 눈에 띄는 부재는 다음과 같아.

  • lstsq — 최소제곱 풀이 함수가 없어. 아래 코드 블록처럼 pinv를 쓰거나, 정규방정식을 solve로 풀어 우회할 수 있어.
  • matrix_rank, matrix_exp, cond — 수치 분석에 유용한 편의 함수가 MLX 핵심 모듈에 없어.
  • cholesky, qr, svd, lu, eig 같은 기본 분해는 MLX에도 있고, 0.32.0부터는 det와 slogdet도 들어왔어. 뼈대는 있지만 편의층은 아직 얇고, 조금씩 채워지는 중이야.

머신러닝 학습을 넘어 무거운 선형 대수까지 해야 한다면 MLX만으로 부족할 수 있어. 파이프라인의 그 부분은 NumPy와 CPU에 맡기는 편이 더 알맞을 수도 있지.

코드보다 늦게 따라오는 문서

MLX 공식 문서는 정확하지만 빠짐없이 최신인 것은 아니야. ml-explore.github.io/mlx/가 API 대부분을 다루지만 최신 버전보다 몇 주에서 몇 달 늦을 수 있어. 새 기능의 기준은 문서가 아니라 mlx-lm GitHub 저장소의 소스와 릴리스 안내야.

아직 초기인 분산 학습

prod.lesson6에서 짧게 다루는 JACCL은 Thunderbolt로 연결한 여러 Mac에서 MLX 분산 학습을 시도하는 활발한 연구 분야야. 2026년 5월 기준 macOS 26.2 이상이 필요하고, PyTorch 분산 학습 기술 묶음을 그대로 대체하지도 못해. 지금 여러 기기에 걸쳐 학습한다면 NVIDIA 환경의 PyTorch와 DeepSpeed가 여전히 현실적인 선택이야.

아직 뒤처진 CUDA 백엔드

mlx는 v0.27부터 Linux에서 여러 플랫폼 추론을 위한 CUDA 백엔드를 제공해. 2026년 5월 기준 실제로 작동하지만 연산 지원과 성능 모두 Apple Silicon 경로보다 뒤처져 있어. MLX식 코드를 Mac 밖에서도 돌려야 할 때는 쓸 수 있지만, Apple Silicon에서와 같은 경험을 기대하지 마.

PyTorch보다 작은 라이브러리 생태계

PyTorch에는 시각, 음성, 강화학습, 로봇공학, 과학 계산을 아우르는 수천 개의 외부 라이브러리가 있어. MLX에는 아직 없는 것들이 많지. mlx-vlm과 mlx-audio 같은 MLX 전용 꾸러미가 일부 빈틈을 채우지만, 다른 부분은 MLX 옆에 NumPy나 PyTorch를 함께 쓰는 혼합 파이프라인이 필요해.

그래도 MLX가 분명히 잘하는 것

정리하면 MLX는 Apple Silicon에서 LLM을 서빙하고 파인튜닝하는 데 가장 좋은 프레임워크이며, 일반 머신러닝 연구에도 믿을 만해. 하지만 무거운 수치 분석과 여러 기기의 분산 학습, PyTorch 생태계의 드문 라이브러리까지 필요한 작업에는 아직 맞지 않아. 경계를 안다는 건 강한 곳에서는 MLX를 쓰고, 아닌 곳에서는 다른 도구를 고를 수 있다는 뜻이야.

믿을 만한 최소제곱 우회

아래 코드 블록은 mx.linalg.pinv로 점 네 개를 지나는 직선을 맞춘 뒤, 그 답을 np.linalg.lstsq와 비교해. 따라 할 만한 점이 두 가지야. 먼저 MLX는 아직 pinv와 det를 GPU에서 돌리지 못해. 오류 메시지가 그렇다고 알려 주면서 CPU 스트림을 넘기라고 하니까, 코드에서도 stream=mx.cpu를 넘겨. 그리고 NumPy와 맞춰 보는 부분은 장식이 아니라 핵심이야. 검증된 구현과 비교하지 않은 우회는 가설 하나가 더 늘었을 뿐이거든.

Code

빠진 lstsq를 pinv로 우회하기·python
# mx.linalg.lstsq doesn't exist in mlx 0.32.x (det and slogdet arrived in 0.32.0).
# Least squares via the pseudoinverse: x = pinv(A) @ b minimizes ||Ax - b||.
import mlx.core as mx
import numpy as np

# Fit y = c0 + c1 * t through four points
A = mx.array([[1.0, 1.0], [1.0, 2.0], [1.0, 3.0], [1.0, 4.0]])
b = mx.array([6.0, 5.0, 7.0, 10.0])

# pinv and det are not yet supported on the GPU in MLX: pass a CPU stream
x = mx.linalg.pinv(A, stream=mx.cpu) @ b
print("mlx   :", x)

# Cross-check against NumPy's reference implementation
x_np, *_ = np.linalg.lstsq(np.array(A), np.array(b), rcond=None)
print("numpy :", x_np)

# And det is no longer a workaround at all
print("det   :", mx.linalg.det(mx.array([[4.0, 2.0], [3.0, 1.0]]), stream=mx.cpu))

# Verified output (2026-09-15, mlx 0.32.2):
#   mlx   : array([3.5, 1.4], dtype=float32)
#   numpy : [3.5 1.4]
#   det   : array(-2, dtype=float32)

External links

Exercise

행렬식, 최소제곱, 비대칭 행렬의 고윳값처럼 이전에 해 본 수치 분석 작업 하나를 골라. 필요한 기본 연산 중 MLX에 있는 것과 우회해야 하는 것을 찾아봐. 그 작업에는 MLX, NumPy, 혼합 방식 중 무엇을 쓸지 두 문장으로 설명해.

Progress

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

댓글 0

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

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