LiteRT Core ML 위임을 사용하면
Core ML 프레임워크에 관해 알아봅니다.
iOS 기기에서 모델 추론 속도가 더 빠릅니다.
지원되는 iOS 버전 및 기기:
iOS 12 이상. 이전 iOS 버전에서는 Core ML 위임이
자동으로 CPU로 대체됩니다.
기본적으로 Core ML 위임은 A12 SoC가 있는 기기에서만 사용 설정됩니다.
이상 (iPhone Xs 이상)에서는 더 빠른 추론을 위해 Neural Engine을 사용합니다.
이전 기기에서도 Core ML 위임을 사용하려면 다음을 참고하세요.
권장사항
지원되는 모델
Core ML 위임은 현재 부동 (FP32 및 FP16) 모델을 지원합니다.
자체 모델에서 Core ML 위임 시도
Core ML 위임은 이미 LiteRT 야간 출시에 포함되어 있습니다.
CocoaPods Core ML 위임을 사용하려면 다음을 포함하도록 LiteRT 포드를 변경하세요.
Podfile의 하위 사양 CoreML.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
또는
# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']
기본적으로 Core ML 위임은 기기에 Neural이 있는 경우에만 생성됩니다.
엔진에 전달되고 위임이 생성되지 않은 경우 null를 반환합니다. 원하는 경우
다른 환경 (예: 시뮬레이터)에서 Core ML 위임을 실행하고 .all를 전달합니다.
Swift에서 델리게이트를 생성할 때 옵션으로 사용할 수 있습니다. C++ 및 Objective-C에서 다음과 같은 작업을 수행할 수 있습니다.
TfLiteCoreMlDelegateAllDevices를 전달합니다. 다음 예는 그 방법을 보여줍니다.
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-24(UTC)"],[],[],null,["# LiteRT Core ML delegate\n\nThe LiteRT Core ML delegate enables running LiteRT models on\n[Core ML framework](https://developer.apple.com/documentation/coreml), which\nresults in faster model inference on iOS devices.\n| **Note:** This delegate is in experimental (beta) phase. It is available from LiteRT 2.4.0 and latest nightly releases.\n| **Note:** Core ML delegate supports Core ML version 2 and later.\n\n**Supported iOS versions and devices:**\n\n- iOS 12 and later. In the older iOS versions, Core ML delegate will automatically fallback to CPU.\n- By default, Core ML delegate will only be enabled on devices with A12 SoC and later (iPhone Xs and later) to use Neural Engine for faster inference. If you want to use Core ML delegate also on the older devices, please see [best practices](#best_practices)\n\n**Supported models**\n\nThe Core ML delegate currently supports float (FP32 and FP16) models.\n\nTrying the Core ML delegate on your own model\n---------------------------------------------\n\nThe Core ML delegate is already included in nightly release of LiteRT\nCocoaPods. To use Core ML delegate, change your LiteRT pod to include\nsubspec `CoreML` in your `Podfile`.\n**Note:** If you want to use C API instead of Objective-C API, you can include `TensorFlowLiteC/CoreML` pod to do so. \n\n target 'YourProjectName'\n pod 'TensorFlowLiteSwift/CoreML', '~\u003e 2.4.0' # Or TensorFlowLiteObjC/CoreML\n\nOR \n\n # Particularily useful when you also want to include 'Metal' subspec.\n target 'YourProjectName'\n pod 'TensorFlowLiteSwift', '~\u003e 2.4.0', :subspecs =\u003e ['CoreML']\n\n**Note:** Core ML delegate can also use C API for Objective-C code. Prior to LiteRT 2.4.0 release, this was the only option. \n\n### Swift\n\n\u003cbr /\u003e\n\n```swift\n let coreMLDelegate = CoreMLDelegate()\n var interpreter: Interpreter\n\n // Core ML delegate will only be created for devices with Neural Engine\n if coreMLDelegate != nil {\n interpreter = try Interpreter(modelPath: modelPath,\n delegates: [coreMLDelegate!])\n } else {\n interpreter = try Interpreter(modelPath: modelPath)\n }\n \n```\n\n\u003cbr /\u003e\n\n### Objective-C\n\n\u003cbr /\u003e\n\n```objective-c\n // Import module when using CocoaPods with module support\n @import TFLTensorFlowLite;\n\n // Or import following headers manually\n # import \"tensorflow/lite/objc/apis/TFLCoreMLDelegate.h\"\n # import \"tensorflow/lite/objc/apis/TFLTensorFlowLite.h\"\n\n // Initialize Core ML delegate\n TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] init];\n\n // Initialize interpreter with model path and Core ML delegate\n TFLInterpreterOptions* options = [[TFLInterpreterOptions alloc] init];\n NSError* error = nil;\n TFLInterpreter* interpreter = [[TFLInterpreter alloc]\n initWithModelPath:modelPath\n options:options\n delegates:@[ coreMLDelegate ]\n error:&error];\n if (error != nil) { /* Error handling... */ }\n\n if (![interpreter allocateTensorsWithError:&error]) { /* Error handling... */ }\n if (error != nil) { /* Error handling... */ }\n\n // Run inference ...\n \n```\n\n\u003cbr /\u003e\n\n### C (Until 2.3.0)\n\n\u003cbr /\u003e\n\n```c\n #include \"tensorflow/lite/delegates/coreml/coreml_delegate.h\"\n\n // Initialize interpreter with model\n TfLiteModel* model = TfLiteModelCreateFromFile(model_path);\n\n // Initialize interpreter with Core ML delegate\n TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate();\n TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(NULL); // default config\n TfLiteInterpreterOptionsAddDelegate(options, delegate);\n TfLiteInterpreterOptionsDelete(options);\n\n TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options);\n\n TfLiteInterpreterAllocateTensors(interpreter);\n\n // Run inference ...\n\n /* ... */\n\n // Dispose resources when it is no longer used.\n // Add following code to the section where you dispose of the delegate\n // (e.g. `dealloc` of class).\n\n TfLiteInterpreterDelete(interpreter);\n TfLiteCoreMlDelegateDelete(delegate);\n TfLiteModelDelete(model);\n \n```\n\n\u003cbr /\u003e\n\nBest practices\n--------------\n\n### Using Core ML delegate on devices without Neural Engine\n\nBy default, Core ML delegate will only be created if the device has Neural\nEngine, and will return `null` if the delegate is not created. If you want to\nrun Core ML delegate on other environments (for example, simulator), pass `.all`\nas an option while creating delegate in Swift. On C++ (and Objective-C), you can\npass `TfLiteCoreMlDelegateAllDevices`. Following example shows how to do this: \n\n### Swift\n\n\u003cbr /\u003e\n\n```swift\n var options = CoreMLDelegate.Options()\n options.enabledDevices = .all\n let coreMLDelegate = CoreMLDelegate(options: options)!\n let interpreter = try Interpreter(modelPath: modelPath,\n delegates: [coreMLDelegate])\n \n```\n\n\u003cbr /\u003e\n\n### Objective-C\n\n\u003cbr /\u003e\n\n```objective-c\n TFLCoreMLDelegateOptions* coreMLOptions = [[TFLCoreMLDelegateOptions alloc] init];\n coreMLOptions.enabledDevices = TFLCoreMLDelegateEnabledDevicesAll;\n TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc]\n initWithOptions:coreMLOptions];\n\n // Initialize interpreter with delegate\n \n```\n\n\u003cbr /\u003e\n\n### C\n\n\u003cbr /\u003e\n\n```c\n TfLiteCoreMlDelegateOptions options;\n options.enabled_devices = TfLiteCoreMlDelegateAllDevices;\n TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(&options);\n // Initialize interpreter with delegate\n \n```\n\n\u003cbr /\u003e\n\n### Using Metal(GPU) delegate as a fallback.\n\nWhen the Core ML delegate is not created, alternatively you can still use\n[Metal delegate](../performance/gpu#ios) to get\nperformance benefits. Following example shows how to do this: \n\n### Swift\n\n\u003cbr /\u003e\n\n```swift\n var delegate = CoreMLDelegate()\n if delegate == nil {\n delegate = MetalDelegate() // Add Metal delegate options if necessary.\n }\n\n let interpreter = try Interpreter(modelPath: modelPath,\n delegates: [delegate!])\n \n```\n\n\u003cbr /\u003e\n\n### Objective-C\n\n\u003cbr /\u003e\n\n```objective-c\n TFLDelegate* delegate = [[TFLCoreMLDelegate alloc] init];\n if (!delegate) {\n // Add Metal delegate options if necessary\n delegate = [[TFLMetalDelegate alloc] init];\n }\n // Initialize interpreter with delegate\n \n```\n\n\u003cbr /\u003e\n\n### C\n\n\u003cbr /\u003e\n\n```c\n TfLiteCoreMlDelegateOptions options = {};\n delegate = TfLiteCoreMlDelegateCreate(&options);\n if (delegate == NULL) {\n // Add Metal delegate options if necessary\n delegate = TFLGpuDelegateCreate(NULL);\n }\n // Initialize interpreter with delegate\n \n```\n\n\u003cbr /\u003e\n\nThe delegate creation logic reads device's machine id (e.g. iPhone11,1) to\ndetermine its Neural Engine availability. See the\n[code](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/coreml/coreml_delegate.mm)\nfor more detail. Alternatively, you can implement your own set of denylist\ndevices using other libraries such as\n[DeviceKit](https://github.com/devicekit/DeviceKit).\n\n### Using older Core ML version\n\nAlthough iOS 13 supports Core ML 3, the model might work better when it is\nconverted with Core ML 2 model specification. The target conversion version is\nset to the latest version by default, but you can change this by setting\n`coreMLVersion` (in Swift, `coreml_version` in C API) in the delegate option to\nolder version.\n\nSupported ops\n-------------\n\nFollowing ops are supported by the Core ML delegate.\n\n- Add\n - Only certain shapes are broadcastable. In Core ML tensor layout, following tensor shapes are broadcastable. `[B, C, H, W]`, `[B, C, 1,\n 1]`, `[B, 1, H, W]`, `[B, 1, 1, 1]`.\n- AveragePool2D\n- Concat\n - Concatenation should be done along the channel axis.\n- Conv2D\n - Weights and bias should be constant.\n- DepthwiseConv2D\n - Weights and bias should be constant.\n- FullyConnected (aka Dense or InnerProduct)\n - Weights and bias (if present) should be constant.\n - Only supports single-batch case. Input dimensions should be 1, except the last dimension.\n- Hardswish\n- Logistic (aka Sigmoid)\n- MaxPool2D\n- MirrorPad\n - Only 4D input with `REFLECT` mode is supported. Padding should be constant, and is only allowed for H and W dimensions.\n- Mul\n - Only certain shapes are broadcastable. In Core ML tensor layout, following tensor shapes are broadcastable. `[B, C, H, W]`, `[B, C, 1,\n 1]`, `[B, 1, H, W]`, `[B, 1, 1, 1]`.\n- Pad and PadV2\n - Only 4D input is supported. Padding should be constant, and is only allowed for H and W dimensions.\n- Relu\n- ReluN1To1\n- Relu6\n- Reshape\n - Only supported when target Core ML version is 2, not supported when targeting Core ML 3.\n- ResizeBilinear\n- SoftMax\n- Tanh\n- TransposeConv\n - Weights should be constant.\n\nFeedback\n--------\n\nFor issues, please create a\n[GitHub](https://github.com/tensorflow/tensorflow/issues/new?template=50-other-issues.md)\nissue with all the necessary details to reproduce.\n\nFAQ\n---\n\n- Does CoreML delegate support fallback to CPU if a graph contains unsupported ops?\n - Yes\n- Does CoreML delegate work on iOS Simulator?\n - Yes. The library includes x86 and x86_64 targets so it can run on a simulator, but you will not see performance boost over CPU.\n- Does LiteRT and CoreML delegate support MacOS?\n - LiteRT is only tested on iOS but not MacOS.\n- Is custom LiteRT ops supported?\n - No, CoreML delegate does not support custom ops and they will fallback to CPU.\n\nAPIs\n----\n\n- [Core ML delegate Swift API](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/swift/Sources/CoreMLDelegate.swift)\n- [Core ML delegate C API](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/coreml/coreml_delegate.h)"]]