[CoreML] 간단한 정리와 ONNX에 대해
ONNX -> CoreML
[CoreML] 모델 선택 여정기
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로 가는 것이 정석이다.
참고
메타데이터
- 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