← Back to list

[CoreML] 간단한 정리와 ONNX에 대해

ONNX -> CoreML

gaeng2y · 2026-03-03 03:26 · 0 claps · 5.4 min read
#swift #ios #coreml #onnx #machine-learning
Open on Medium ↗
Wiki topics: ML · Machine Learning EDU · Education & Learning 📱 · Mobile Development

[CoreML] 모델 선택 여정기

Photo by Markus Winkler on Unsplash

Photo by Markus Winkler on Unsplash

1. 왜 ONNX → CoreML 변환을 고민하게 되었는가

iOS 앱에서 온디바이스 추론을 수행하려면 선택지는 사실상 두 가지다.

  • PyTorch / TensorFlow 모델을 직접 모바일용으로 변환
  • ONNX를 중간 포맷으로 사용
  • Apple 생태계에 최적화된 CoreML로 변환

서버 추론이 아니라 iPhone에서 실시간 추론을 수행해야 한다면, 결국 CoreML은 피할 수 없는 선택지다.

이 글은 다음을 정리한다:

  • CoreML이 무엇인지
  • ONNX는 어떤 역할을 하는지
  • ONNX → CoreML 변환 방법
  • 실제로 겪게 되는 문제들

2. CoreML이란 무엇인가

Apple이 만든 온디바이스 ML 프레임워크다. 핵심 목적은 단 하나다.

iOS / macOS / watchOS / visionOS에서 빠르고 전력 효율적으로 추론하기

CoreML의 특징

  • .mlmodel / .mlpackage 포맷 사용
  • Neural Engine 자동 활용
  • Metal 최적화 자동 처리
  • Vision 프레임워크와 자연스러운 연동
  • Xcode에서 모델 메타데이터 확인 가능

내부 동작 구조

Model (.mlmodel)
   ↓
CoreML Runtime
   ↓
Neural Engine / GPU / CPU 자동 선택

CoreML의 가장 큰 장점은 하드웨어 최적화를 개발자가 직접 고민하지 않아도 된다는 점이다.

3. ONNX란 무엇인가

Open Neural Network Exchange는 모델 교환을 위한 중간 포맷이다.

PyTorch → ONNX TensorFlow → ONNX

처럼, 프레임워크 간 모델을 이동시키는 데 사용된다.

ONNX의 역할

  • 프레임워크 독립성 확보
  • 다양한 런타임에서 실행 가능
  • 추론 서버 환경에서 매우 유용

하지만 iOS에서 직접 ONNX Runtime을 사용하는 것은 현실적으로:

  • 바이너리 크기 증가
  • Neural Engine 미활용
  • 배포 복잡성 증가

라는 단점이 있다. 따라서 iOS 네이티브 앱에서는 ONNX → CoreML 변환이 일반적이다.

4. ONNX → CoreML 변환 개요

변환은 coremltools를 사용한다. coremltools는 Apple이 제공하는 Python 라이브러리다.

기본 흐름

PyTorch → ONNX → CoreML (.mlmodel)

5. 실제 변환 코드

1️⃣ ONNX 모델 로드

import coremltools as ct
model = ct.converters.onnx.convert(
    model="model.onnx",
    minimum_deployment_target=ct.target.iOS15
)
model.save("Model.mlmodel")

최근 버전에서는 ct.convert() API를 더 많이 사용한다.

mlmodel = ct.convert(
    "model.onnx",
    source="onnx",
    minimum_deployment_target=ct.target.iOS15
)
mlmodel.save("Model.mlmodel")

6. 변환 시 반드시 확인해야 할 것들

1. Opset 버전 문제

ONNX 모델의 opset이 너무 최신이면 CoreML 변환이 실패할 수 있다.

권장:

  • opset 11 ~ 13

2. 지원되지 않는 연산자

일부 ONNX 연산자는 CoreML에서 지원되지 않는다.

대표적으로:

  • NonMaxSuppression
  • Dynamic reshape
  • 일부 custom op

이 경우:

  • 모델 수정
  • TorchScript 단계에서 처리
  • 후처리 로직을 Swift로 이동

3. 입력 텐서 타입

CoreML은:

  • Float32
  • Image 타입 (RGB)

을 명확히 지정해야 한다.

예:

mlmodel = ct.convert(
    "model.onnx",
    source="onnx",
    inputs=[
        ct.ImageType(
            name="input",
            shape=(1, 3, 224, 224),
            scale=1/255.0
        )
    ]
)

이미지 전처리를 Swift가 아니라 CoreML 레벨에서 처리하게 만들면 성능이 안정적이다.

7. Precision / Quantization 고려

CoreML은 다음을 지원한다:

  • Float32
  • Float16
  • INT8 (양자화)

양자화 예시:

mlmodel = ct.models.neural_network.quantization_utils.quantize_weights(
    mlmodel,
    nbits=16
)

iPhone의 Neural Engine을 활용하려면 Float16이 일반적으로 유리하다.

8. 변환 후 iOS에서 사용

Xcode에 .mlmodel을 추가하면 자동으로 Swift 클래스가 생성된다.

let model = try Model(configuration: MLModelConfiguration())
let output = try model.prediction(input: input)

Vision과 함께 쓰는 경우:

VNCoreMLModel(for: model.model)

9. ONNX Runtime 대신 CoreML을 선택한 이유

결론은 단순하다.

iOS 네이티브 앱이라면 CoreML이 기본 선택지다.

10. 정리

  • ONNX는 교환 포맷이다.
  • iOS에서 실제 실행은 CoreML이 담당한다.
  • 변환 과정에서 opset, 연산자, 입력 타입을 반드시 점검해야 한다.
  • Neural Engine을 활용하려면 CoreML로 가는 것이 정석이다.

참고

[embed]Core ML - 머신 러닝 - Apple Developer 앱에 최첨단 모델을 통합하고 Core ML을 사용하여 온디바이스 학습을 활용해 보세요.developer.apple.com

[embed]Core ML | Apple Developer Documentation Integrate machine learning models into your app.developer.apple.com

[embed]ONNX | Home Develop in your preferred framework without worrying about downstream inferencing implications. ONNX enables you to use…onnx.ai


메타데이터
post_id
73bd654cf667
slug
coreml-간단한-정리와-onnx에-대해-73bd654cf667
url
https://medium.com/@gaeng2y/coreml-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%A0%95%EB%A6%AC%EC%99%80-onnx%EC%97%90-%EB%8C%80%ED%95%B4-73bd654cf667
canonical_url
https://medium.com/@gaeng2y/coreml-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%A0%95%EB%A6%AC%EC%99%80-onnx%EC%97%90-%EB%8C%80%ED%95%B4-73bd654cf667
author_url
https://medium.com/@gaeng2y
status
ok
fetched_at
2026-06-13 16:00:06