El delegado de Core ML de LiteRT permite ejecutar modelos LiteRT en
Framework de Core ML, que
da como resultado una inferencia de modelos más rápida en dispositivos iOS.
Versiones y dispositivos iOS compatibles:
iOS 12 y versiones posteriores En las versiones anteriores de iOS, el delegado de Core ML
recurrir automáticamente a la CPU.
De forma predeterminada, el delegado de Core ML solo se habilitará en dispositivos con SoC A12
y posteriores (iPhone Xs y modelos posteriores) para usar Neural Engine para una inferencia más rápida.
Si quieres usar el delegado de Core ML en los dispositivos más antiguos, consulta
prácticas recomendadas
Modelos compatibles
Actualmente, el delegado de Core ML admite modelos de punto flotante (FP32 y FP16).
Prueba el delegado de Core ML en tu propio modelo
El delegado de Core ML ya se incluye en el lanzamiento nocturno de LiteRT
CocoaPods. Si quieres usar el delegado de Core ML, cambia el Pod de LiteRT para incluir
subespecificación CoreML en su Podfile.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
O
# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']
Usa el delegado de Core ML en dispositivos sin Neural Engine
De forma predeterminada, el delegado de Core ML solo se creará si el dispositivo tiene
Engine, y mostrará null si no se crea el delegado. Si deseas
Ejecuta el delegado de Core ML en otros entornos (por ejemplo, un simulador), pasa .all
como opción mientras creas el delegado en Swift. En C++ (y Objective-C), puedes
pasa TfLiteCoreMlDelegateAllDevices. En el siguiente ejemplo, se muestra cómo hacerlo:
Cuando no se crea el delegado de Core ML, puedes seguir usando
Delegado de metal para obtener
beneficios de rendimiento. En el siguiente ejemplo, se muestra cómo hacerlo:
La lógica de creación del delegado lee el ID de máquina del dispositivo (p.ej., iPhone11,1) en
determinar su disponibilidad del motor neuronal. Consulta la
código
para obtener más detalles. También puedes implementar tu propio conjunto de listas de bloqueo
dispositivos que usan otras bibliotecas, como
DeviceKit.
Usa una versión anterior de Core ML
Aunque iOS 13 es compatible con Core ML 3, el modelo puede funcionar mejor si es
se convierten con la especificación del modelo Core ML 2. La versión de conversión objetivo es
está configurada en la versión más reciente de forma predeterminada, pero puedes cambiarla estableciendo
coreMLVersion (en Swift, coreml_version en la API de C) en la opción de delegar a
versión anterior.
Operaciones admitidas
El delegado de Core ML admite las siguientes operaciones.
Se agregó
Solo se pueden transmitir ciertas formas. En el diseño de tensor de Core ML,
las siguientes formas de tensor se pueden transmitir. [B, C, H, W], [B, C, 1,
1], [B, 1, H, W], [B, 1, 1, 1]
PromedioGrupo2D
Concat
La concatenación se debe realizar en el eje del canal.
Conv. 2D
Los pesos y el sesgo deben ser constantes.
DepthwiseConv2D
Los pesos y el sesgo deben ser constantes.
FullyConnected (también conocido como Dense o InnerProduct)
Los pesos y el sesgo (si están presentes) deben ser constantes.
Solo es compatible con casos de lote único. Las dimensiones de entrada deben ser 1, excepto
la última dimensión.
Hardswish
Logística (también conocida como sigmoidea)
GrupoMáximo2D
MirrorPad
Solo se admite la entrada 4D con el modo REFLECT. El relleno debe tener las siguientes características:
constante y solo se permite para las dimensiones H y W.
Mul
Solo se pueden transmitir ciertas formas. En el diseño de tensor de Core ML,
las siguientes formas de tensor se pueden transmitir. [B, C, H, W], [B, C, 1,
1], [B, 1, H, W], [B, 1, 1, 1]
Pad y PadV2
Solo se admite la entrada 4D. El relleno debe ser constante y solo
para las dimensiones H y W.
Relu
ReLUN1To1
Relu6
Cambiar forma
Solo es compatible cuando la versión de destino de Core ML es 2; no se admite cuando
orientadas a Core ML 3.
ResizeBilinear
SoftMax
Tanh
TransposeConv
Los pesos deben ser constantes.
Comentarios
Si tienes problemas, crea un
GitHub
con todos los detalles necesarios para reproducirlo.
Preguntas frecuentes
¿El delegado de CoreML admite el resguardo a la CPU si un gráfico contiene elementos no admitidos?
las operaciones?
Sí
¿El delegado de CoreML funciona en el simulador de iOS?
Sí. La biblioteca incluye destinos x86 y x86_64 para que pueda ejecutarse
pero no verás un aumento del rendimiento con la CPU.
¿Los delegados LiteRT y CoreML son compatibles con MacOS?
LiteRT solo se prueba en iOS, pero no en MacOS.
¿Se admiten operaciones de LiteRT personalizadas?
No, el delegado de CoreML no admite operaciones personalizadas y recurrirá a
CPU.
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 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)"]]