Le délégué LiteRT Core ML permet d'exécuter des modèles LiteRT sur
Core ML framework, qui
accélère l'inférence de modèle sur les appareils iOS.
Versions et appareils iOS compatibles:
iOS 12 et versions ultérieures. Dans les anciennes versions d'iOS, le délégué Core ML
passer automatiquement au processeur.
Par défaut, le délégué Core ML ne sera activé que sur les appareils dotés d'un SoC A12
et versions ultérieures (iPhone X et versions ultérieures) à utiliser Neural Engine afin d'accélérer l'inférence.
Si vous souhaitez également utiliser le délégué Core ML sur les anciens appareils, consultez
bonnes pratiques
Modèles compatibles
Le délégué Core ML est actuellement compatible avec les modèles à virgule flottante (FP32 et FP16).
Essayer le délégué Core ML sur votre propre modèle
Le délégué Core ML est déjà inclus dans la version nocturne de LiteRT
CocoaPods Pour utiliser le délégué Core ML, modifiez votre pod LiteRT afin d'inclure
sous-spéc CoreML dans votre Podfile.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
OU
# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']
Utiliser le délégué Core ML sur des appareils sans moteur neuronal
Par défaut, le délégué Core ML n'est créé que si l'appareil dispose de
Engine, et renvoie null si le délégué n'est pas créé. Si vous souhaitez
exécuter le délégué Core ML sur d'autres environnements (simulateur, par exemple), puis transmettre .all
comme option lors de la création
d'un délégué dans Swift. Avec C++ (et Objective-C), vous pouvez
transmettre TfLiteCoreMlDelegateAllDevices. L'exemple suivant montre comment procéder:
Utilisation d'un délégué de métal(GPU) en remplacement.
Si le délégué Core ML n'est pas créé, vous pouvez toujours utiliser
Metal délégué (Délégué) pour obtenir
d'amélioration des performances. L'exemple suivant montre comment procéder:
La logique de création du délégué lit l'identifiant machine de l'appareil (par exemple, iPhone11,1) à
pour déterminer la disponibilité
de Neural Engine. Consultez le
code
pour en savoir plus. Vous pouvez aussi implémenter votre propre liste de blocage
appareils utilisant d'autres
bibliothèques telles que
DeviceKit.
Utiliser une ancienne version de Core ML
Bien qu'iOS 13 soit compatible avec Core ML 3, le modèle peut mieux fonctionner lorsqu'il est
avec la spécification de modèle Core ML 2. La version de conversion cible est
définie par défaut sur la dernière version, mais vous pouvez modifier cela en définissant
coreMLVersion (en Swift, coreml_version dans l'API C) dans l'option de délégation pour
l'ancienne version.
Opérations compatibles
Les opérations suivantes sont compatibles avec le délégué Core ML.
Ajouts
Seules certaines formes peuvent être diffusées. Dans la mise en page de Tensor Core ML,
les formes de Tensor suivantes peuvent être diffusées. [B, C, H, W], [B, C, 1,
1], [B, 1, H, W] et [B, 1, 1, 1].
MoyennePool2D
Concat
<ph type="x-smartling-placeholder">
</ph>
La concaténation doit être effectuée le long de l'axe des canaux.
Conv.2D
<ph type="x-smartling-placeholder">
</ph>
Les pondérations et les biais doivent être constants.
Les pondérations et les biais doivent être constants.
Entièrement connecté (Dense ou InnerProduct)
<ph type="x-smartling-placeholder">
</ph>
Les pondérations et les biais (le cas échéant) doivent être constants.
Compatible uniquement avec les demandes à lot unique. Les dimensions d'entrée doivent être de 1, sauf
la dernière dimension.
Hardswish
Logistique (ou sigmoïde)
Pool max. 2D
MirrorPad
<ph type="x-smartling-placeholder">
</ph>
Seule l'entrée 4D en mode REFLECT est compatible. La marge intérieure doit être
et n'est autorisée que pour les dimensions H et L.
UL
<ph type="x-smartling-placeholder">
</ph>
Seules certaines formes peuvent être diffusées. Dans la mise en page de Tensor Core ML,
les formes de Tensor suivantes peuvent être diffusées. [B, C, H, W], [B, C, 1,
1], [B, 1, H, W] et [B, 1, 1, 1].
Pad et PadV2
<ph type="x-smartling-placeholder">
</ph>
Seule l'entrée 4D est compatible. La marge intérieure doit être constante et n'être
pour les dimensions H et L.
Relu
ReluN1To1
Relu6
Remodeler
<ph type="x-smartling-placeholder">
</ph>
Uniquement disponible lorsque la version cible de Core ML est 2, et non compatible lorsque
ciblant Core ML 3.
ResizeBilinear
SoftMax
Tanh
TransposeConv
<ph type="x-smartling-placeholder">
</ph>
Les pondérations doivent être constantes.
Commentaires
En cas de problème, veuillez créer un
GitHub
en fournissant tous les détails
nécessaires à sa reproduction.
Questions fréquentes
CoreML permet-il d'utiliser le processeur de remplacement si un graphique contient
des opérations ?
Oui
Le délégué CoreML fonctionne-t-il sur le simulateur iOS ?
Oui. La bibliothèque inclut des cibles x86 et x86_64 afin de pouvoir s'exécuter sur
un simulateur, mais vous n'observerez pas d'amélioration
des performances par rapport au CPU.
Le délégué LiteRT et CoreML est-il compatible avec macOS ?
LiteRT n'est testé que sur iOS, mais pas sur macOS.
Les opérations LiteRT personnalisées sont-elles prises en charge ?
Non, le délégué Core ML n'est pas compatible avec les opérations personnalisées et elles seront remplacées par
CPU
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/24 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 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)"]]