안녕하세요! 피피아노입니다 🎵
WWDC 24 세션 중 "Deploying Machine Learning Models on Device with Core ML" 세션에서 머신 러닝 모델을 실제 iOS 앱에 통합하고, 성능 최적화를 이루는 방법에 대해서 소개를 하고 있습니다. 이번 포스팅에서는 해당 세션의 주요 내용을 정리를 해보려고 합니다.
그럼 바로 시작하겠습니다!
온디바이스 ML의 의미와 중요성
Apple의 모든 플랫폼(iOS, iPadOS, watchOS, macOS, visionOS)은 수많은 온디바이스 AI 기능으로 구동되고 있습니다. 대표적으로는 아래와 같은 예시가 있습니다.
- Vision Pro의 손 제스처 인식
- iPhone의 인물 사진 모드
- Apple Watch의 심전도 분석
- Siri의 자연어 이해 개선
iOS에서 머신 러닝은 주로 Core ML을 사용하게 되는데 Apple은 이 Core ML을 온디바이스에서 처리를 할 수 있도록 제작하였습니다. 온디바이스 머신 러닝의 장점은 아래처럼 정리를 해볼 수 있습니다.
- 오프라인 환경에서도 사용 가능
- 데이터가 클라우드에 전송되지 않기 때문에 개인정보 보호 강화
- Apple Silicon의 CPU, GPU, Neral Engine을 모두 활용하는 고성능 추론
Core ML 아키텍처와 핵심 개념
MLModel 객체
Core ML 모델의 중심이 되는 클래스로, .mlmodel -> .mlmodelc 형식으로 컴파일된 모델을 로딩하여 사용할 수 있습니다.
let model = try MyModel(configuration: MLModelConfiguration())
모델 입출력: MLFeatureValue, MLDictionaryFeatureProvider
Core ML은 입력 데이터를 텐서(Tensor) 형식으로 처리합니다. 예를 들어 이미지, 오디오, 숫자 배열 등과 같은 데이터는 모두 텐서로 변환되어야 모델이 이해할 수 있습니다.
텐서(Tensor)란?
텐서란 간단히 말하면, 다차원 배열입니다.
- 1D 텐서 → 벡터 (e.g. [1, 2, 3])
- 2D 텐서 → 행렬 (e.g. [[1, 2], [3, 4]])
- 3D 이상 → 이미지, 오디오 등 고차원 데이터
Core ML은 이를 위해 MLMultiArray, MLShapedArray, MLTensor 등의 구조를 제공합니다.
모델 변환 및 최적화 with CoreMLTools
모델을 학습한 뒤 iOS/macOS 앱에서 실행하려면, 반드시 Core ML 포맷으로 변환해야 합니다. Apple은 이를 위해 Python 기반의 도구인 coremltools를 제공합니다.
변환이 필요한 이유
딥러닝 모델은 대부분 PyTorch, TensorFlow, JAX 등의 포맷으로 학습됩니다. 그러나 Core ML은 Apple 기기에서 고성능 추론을 위해 .mlmodel이라는 자체 모델 포맷을 사용합니다.
coremltools는 이러한 모델을 Core ML 포맷으로 변환해주는 브릿지 역할을 합니다.
import coremltools as ct
import torch
# 예시 PyTorch 모델
model = torch.jit.load("MyModel.pt")
model.eval()
# 입력 텐서 형태 명시
example_input = torch.rand(1, 3, 224, 224)
# 변환
mlmodel = ct.convert(
model,
inputs=[ct.TensorType(shape=example_input.shape)]
)
mlmodel.save("MyModel.mlmodel")
위 코드를 통해 .mlmodel 파일을 생성하면, Xcode에 추가 시 자동으로 .mlmodelc로 컴파일되어 앱에 통합할 수 있습니다.
변환 시 주요 옵션 및 최적화 전략
Core ML은 단순히 변환하는 데 그치지 않고, 아래와 같은 다양한 최적화 옵션을 제공하고 있습니다.
옵션 | 설명 |
compute_units | .cpuOnly, .cpuAndGPU, .all (Neural Engine까지) 선택 |
minimum_deployment_target | 지원할 최소 OS 버전 (예: iOS 15, macOS 12) 지정 |
precision | float32 → float16 변환으로 모델 크기와 메모리 최적화 |
predicted_probabilities_output | 출력 노드 설정 시 softmax 등의 레이블 포함 여부 |
압축 및 경량화 기법
coremltools.optimize 모듈을 통해 다음과 같은 압축을 수행할 수 있습니다.
Float16 변환 (정밀도 절반 -> 크기 절반)
from coremltools.optimize import convert_neural_network_weights_to_fp16
mlmodel_fp16 = convert_neural_network_weights_to_fp16(mlmodel)
mlmodel_fp16.save("MyModel_fp16.mlmodel")
정적 리튬 분석 (Constant folding)
계산 그래프 상의 불필요한 연산을 사전에 정리하여 추론 속도 향상
Layer Fusion
BatchNorm + ReLU 등을 하나의 연산으로 합쳐 연산 속도 개선
실전에서는 float16 + layer fusion 조합이 가장 효과적인 경량화 전략입니다.
Core ML 최신 기능 요약 (WWDC 2024 기준)
- Transformer 최적화: attention, layer norm 연산이 Metal 기반으로 고속화됨
- 상태 유지 모델 지원: LLM 실행 시 key-value 캐시를 통한 디코딩 성능 향상
- 멀티 input/output 처리 강화: 복잡한 모델 구조도 이제 안전하게 지원
- MLTensor 도입: 그래프 연결 최적화 및 유연한 tensor 구성 가능
Apple의 오픈소스 연구 생태계
Apple은 최근 ML 연구를 오픈소스로도 공유하고 있다고 합니다.
- MLX: Swift / Python 기반 고성능 ML 연구 프레임워크
- CoreNet: 새로운 모델 아키텍처 실험을 위한 툴킷
- OpenELM: Core ML 형식으로도 실행 가능한 경량 LLM 모델
모두 Apple Silicon에 최적화되어 있어 iOS 앱에 직접 배포 가능합니다.
이제 변환된 모델을 Xcode 프로젝트에 추가하고, MLModel 클래스를 사용해 실제 앱에서 모델을 로딩하고 추론을 실행할 수 있습니다.
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!
'Apple > iOS' 카테고리의 다른 글
[iOS] CocoaPods 알아보기 (7) | 2024.08.13 |
---|---|
[iOS] Live Activity 알아보기 (0) | 2024.08.09 |
[iOS] RESTful API 완벽 이해하기 (0) | 2024.07.22 |
[iOS] Core Data는 뭘까? (0) | 2024.05.24 |
[iOS] Open API 연결하는 방법 (0) | 2024.05.19 |