Core ML Model Conversion은 학습된 머신러닝 모델을 주요 프레임워크에서 Core ML(.mlmodel) 형식으로 변환하는 프로세스로, Apple 기기에서 실행에 최적화되어 있습니다. PyTorch, TensorFlow 및 기타 프레임워크는 Core ML Runtime과 호환되지 않는 자체 형식을 사용하기 때문에 변환이 필요합니다. coremltools 문서(2025)에 따르면, 이 라이브러리는 PyTorch, TensorFlow 1.x 및 2.x, Keras, ONNX, scikit-learn, libsvm에서의 변환을 지원합니다. coremltools는 지원되지 않는 연산을 자동으로 동등한 연산으로 대체하여 모델의 수치 정밀도를 유지합니다.
핵심 요점
Core ML Model Conversion은 학습된 머신러닝 모델을 소스 프레임워크 형식에서 Apple 기기의 Core ML Runtime이 이해하는 .mlmodel 형식으로 변환하는 프로세스입니다. 변환 없이는 PyTorch나 TensorFlow에서 학습된 모델을 iOS나 macOS에서 직접 로드하고 실행할 수 없습니다.
변환 프로세스에는 계산 그래프 변환이 포함됩니다. 소스 프레임워크의 각 연산자(Conv2D, BatchNorm, ReLU)가 해당 Core ML 연산자에 매핑됩니다. 직접적인 대체가 없는 경우 coremltools는 복합 연산이나 사용자 정의 레이어를 사용합니다. Apple ML Research에 따르면, 이 라이브러리는 다양한 프레임워크에서 200개 이상의 연산자를 지원합니다.
변환 후 모델은 .mlmodel 번들 형식으로 저장되며, protobuf 그래프 설명, 바이너리 형식의 가중치 및 메타데이터가 포함됩니다. 이 파일은 대상 기기에서 실행하기 위해 mlmodelc로 컴파일됩니다.
coremltools 버전 7.x는 6가지 소스에서의 변환을 지원합니다. PyTorch — torch.jit.trace 또는 torch.export를 통해, TensorFlow 2.x — SavedModel 및 Keras H5를 통해, TensorFlow 1.x — frozen graph .pb를 통해. ONNX의 경우 중간 표현이 사용된 후 Core ML로 변환됩니다.
| 프레임워크 | 입력 형식 | coremltools API |
|---|---|---|
| PyTorch | TorchScript, torch.export | CTConverter / convert() |
| TensorFlow 2.x | SavedModel, Keras H5 | convert() |
| TensorFlow 1.x | Frozen .pb | convert() |
| ONNX | .onnx | onnx_to_coreml() |
| scikit-learn | .pkl / Pipeline | converters.sklearn.convert() |
| Keras | .h5 / .keras | convert() |
coremltools는 Apple의 공식 오픈소스 Python 라이브러리로, pip install coremltools를 통해 사용할 수 있습니다. 이 라이브러리는 지원되는 모든 프레임워크에서 변환을 위한 통합 API와 후처리 도구(양자화, 정밀도 확인, 그래프 시각화)를 제공합니다.
PyTorch에서 설치 및 기본 모델 변환:
import coremltools as ct
import torch
import torchvision
model = torchvision.models.resnet18(pretrained=True)
model.eval()
example_input = torch.rand(1, 3, 224, 224)
traced_model = torch.jit.trace(model, example_input)
mlmodel = ct.convert(
traced_model,
source="pytorch",
inputs=[ct.ImageType(shape=example_input.shape)]
)
mlmodel.save("ResNet18.mlmodel")
TensorFlow에서 변환하려면 소스로 SavedModel을 사용하세요. coremltools는 signature_def를 기반으로 입력 및 출력 텐서를 자동으로 결정합니다:
import coremltools as ct
mlmodel = ct.convert(
"saved_model_dir",
source="tensorflow",
@minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")
변환 프로세스는 4단계로 구성됩니다. 첫 번째 단계에서 coremltools는 소스 모델을 로드하고 추적 또는 그래프 스캐닝을 수행합니다. PyTorch의 경우 torch.jit.trace가 사용되어 샘플 입력을 모델에 통과시키고 연산 순서를 기록합니다.
두 번째 단계에서는 연산자 매핑이 수행됩니다. 소스 그래프의 각 연산자가 Core ML 연산자에 매핑됩니다. 직접적인 대체가 없는 경우 coremltools는 연산자를 지원되는 연산자 시퀀스로 분할합니다. coremltools 문서에 따르면, 일반적인 아키텍처에서 PyTorch 연산자 커버리지는 95%를 초과합니다.
세 번째 단계는 그래프 최적화입니다. coremltools는 연산 융합(예: conv + batch norm), 불필요한 변환 제거 및 효율성 향상을 위한 연산자 재정렬을 수행합니다. 네 번째 단계는 가중치와 메타데이터를 유지하면서 .mlmodel 형식으로 직렬화하는 것입니다.
가장 흔한 변환 문제는 지원되지 않는 연산입니다. 모델에 Core ML에 없는 연산자가 포함된 경우 coremltools는 연산자 이름과 함께 오류를 보고합니다. 해결 방법은 연산자를 지원되는 연산자의 동등한 조합으로 대체하거나 사용자 정의 레이어 API를 통해 사용자 정의 레이어를 구현하는 것입니다.
두 번째 문제는 차원 불일치입니다. PyTorch는 NCHW 형식을 사용하는 반면 Core ML은 기본적으로 NHWC를 사용합니다. coremltools는 자동으로 전치를 삽입하지만 때로는 축 순서가 잘못 결정됩니다. 변환 로그에서 입력 및 출력 차원을 확인하고 필요한 경우 올바른 이름으로 input_features를 지정하세요.
세 번째 문제는 양자화 후 정밀도 손실입니다. FP16 또는 INT8 팔레트로 변환하면 모델 정밀도가 저하될 수 있습니다. coremltools는 동일한 입력 데이터에서 소스 모델과 변환된 모델의 출력을 비교하기 위한 ct.models.CompiledModel 유틸리티를 제공합니다. 차이가 1%를 초과하는 경우 보정 없이 FP16 팔레트로 양자화를 사용하거나 양자화를 완전히 건너뛰세요.
입력 유형 지정 및 최소 iOS 버전과 함께 PyTorch에서 MobileNetV3 모델을 변환하는 예제입니다. 자동 이미지 정규화에는 ct.ImageType을 사용하세요:
import coremltools as ct
import torchvision
model = torchvision.models.mobilenet_v3_small(
pretrained=True
)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced = torch.jit.trace(model, example)
mlmodel = ct.convert(
traced,
source="pytorch",
inputs=[ct.ImageType(
shape=example.shape,
scale=1.0/255.0,
bias=[0, 0, 0]
)],
@minimum_deployment_target=ct.target.iOS16
)
# 나중에 Xcode에서 컴파일하기 위해 .mlmodel에 저장
mlmodel.save("MobileNetV3.mlmodel")
FP16 양자화를 사용한 TensorFlow Keras 변환 예제입니다. Apple A13 이상 기기에서 FP16 지원을 활성화하려면 minimum_deployment_target을 지정하세요:
import coremltools as ct
from tensorflow import keras
keras_model = keras.applications.EfficientNetB0(
weights="imagenet"
)
mlmodel = ct.convert(
keras_model,
source="tensorflow",
@minimum_deployment_target=ct.target.iOS17
)
# 2배 크기 감소를 위해 가중치를 FP16으로 양자화
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
자주 묻는 질문
네, 모델이 TorchScript, SavedModel 또는 ONNX 형식으로 저장된 경우 가능합니다. coremltools는 이러한 형식을 소스 코드 없이 로드하고 계산 그래프를 기반으로 변환을 수행합니다.
coremltools는 변환 중 로그에 지원되지 않는 연산 목록을 출력합니다. 사용 가능한 Core ML 연산자의 전체 목록을 보려면 ct.utils.get_coreml_operations()를 사용하세요.
양자화 팔레트는 모델 가중치를 압축하기 위한 매개변수 집합입니다: fp16, int8 또는 팔레트화. coremltools는 8비트, 16비트 팔레트 및 다양한 비트 깊이의 LUT 양자화를 지원합니다.
네, 기기에서 실행하기 전에 .mlmodel을 mlmodelc로 컴파일해야 합니다. 컴파일은 빌드 시 Xcode에서 또는 MLModel.compile(at:)을 통해 기기에서 자동으로 수행됩니다.
ct.models.CompiledModel을 사용하여 소스 모델과 변환된 모델의 출력을 비교하세요. 동일한 입력 데이터를 제공하고 MSE 또는 코사인 유사도 메트릭을 사용하여 결과를 비교합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.