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

MLX Swift — Python이 맞지 않는 배포

~14 min · swift, mlx-swift, ios-app

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

Python이 배포 도구가 될 수 없을 때

머신러닝 작업 대부분이 Python에서 이뤄지므로 이 퀘스트도 주로 Python을 써. 하지만 App Store 앱이나 iOS·macOS 앱 실행 파일 안에 넣어야 하는 기능, Swift 기반 Apple 앱 프레임워크와 깊이 엮여야 하는 기능에는 Python이 맞지 않아. 이때 mlx-swift를 쓰면 같은 MLX 프레임워크를 Swift API로 다룰 수 있어.

Python MLX에서 익힌 생각은 거의 그대로 이어져. 배열에는 자료형이 있고, 지연 실행이 기본이며, 함수 변환도 있어. 문법은 let과 자료형 추론, 값의 메서드를 쓰는 Swift 모양이지만 개념상 API는 나란히 대응해.

MLX Swift가 주는 것

  • 내부의 같은 MLX 커널 — 같은 하드웨어라면 성능도 Python MLX와 비슷해.
  • 앱 배포 경로 — MLX를 iOS·macOS 앱 안에 넣어 App Store로 내보낼 수 있어. Python은 이 역할을 할 수 없어.
  • Apple 프레임워크와 긴밀한 연동 — SwiftUI, Combine을 비롯한 Apple 앱 기술과 바로 연결돼.
  • 더 작은 배포 구성 — Python 인터프리터와 pip 의존성, 함께 내보낼 가상 환경이 필요 없어.

대신 포기하는 것

  • 라이브러리 생태계 — Hugging Face Transformers와 여러 편의 기능을 갖춘 mlx-lm 등 대부분의 머신러닝 라이브러리는 Python이 중심이야. mlx-swift는 핵심 기능을 다루지만 폭이 같지는 않아.
  • 반복 속도 — Swift의 편집·컴파일·실행 과정은 Python REPL보다 느려. Python에서 반복하고 Swift에서 배포해.
  • 커뮤니티 크기 — Python MLX 쪽에 사용자와 질의응답, 예제 코드가 더 많아.

권장 작업 흐름

  1. Python MLX에서 학습하고 반복해. 실험 단계에는 mlx-lm이나 mlx-vlm을 써.
  2. 결과를 변환하거나 합쳐. LoRA로 파인튜닝했다면 배포할 수 있는 모델로 합쳐(트랙 5 레슨 5).
  3. mlx-swift로 앱에 넣어. 2단계에서 만든 모델 디렉터리를 그대로 불러와. 디스크 형식은 같아.
  4. 앱을 내보내. 이후에는 표준 iOS·macOS 배포 절차를 따르면 돼.

Mac의 Ollama도 이와 같은 경로를 사용해. 배포 끝단의 언어가 Swift라고 해서 MLX 작업 흐름 자체가 달라지는 건 아니야.

Code

MLX Swift — 같은 배열 연산을 Swift 문법으로·swift
// Add mlx-swift via Swift Package Manager:
//   https://github.com/ml-explore/mlx-swift
import MLX

// Create arrays — same shape as Python MLX
let a = MLXArray([1.0, 2.0, 3.0, 4.0])
let b = MLXArray([5.0, 6.0, 7.0, 8.0])

// Operations — also same shape
let c = a + b
print(c)   // array([6, 8, 10, 12], dtype=float32)

// Lazy by default; eval to materialize
let d = a * b
d.eval()
print(d)   // array([5, 12, 21, 32], dtype=float32)

// Default device is GPU on Apple Silicon — no .to(device) ritual
print(MLX.defaultDevice())
SwiftUI 앱에 넣기(개요)·swift
// SwiftUI view that runs MLX inference on a button tap.
import SwiftUI
import MLX
import MLXLLM   // mlx-swift's LLM extension package

struct ContentView: View {
    @State private var prompt: String = "Capital of France?"
    @State private var output: String = ""

    var body: some View {
        VStack {
            TextField("Prompt", text: $prompt)
            Button("Generate") {
                Task {
                    // Load model once at app start in production code.
                    let model = try await loadModel(...)
                    output = try await model.generate(prompt: prompt, maxTokens: 50)
                }
            }
            Text(output)
        }
    }
}

// In production, load the model once at app startup, not per tap.

External links

Exercise

Xcode가 설치돼 있다면 최소 Swift Package나 iOS·macOS 앱을 만들고 Swift Package Manager로 mlx-swift를 추가해. 이 레슨의 행렬 곱셈이나 덧셈 같은 기본 배열 연산을 실행해. 빌드 시간과 Python 반복 과정의 차이를 확인하고, 지금 사용 사례에서 Swift 배포가 그 반복 비용을 감수할 가치가 있는지 두 문장으로 적어.

Progress

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

댓글 0

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

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