El delegado de TensorFlow Lite Core ML permite ejecutar modelos de TensorFlow Lite en el marco Core ML , lo que da como resultado una inferencia de modelos más rápida en dispositivos iOS.
Versiones y dispositivos de iOS compatibles:
- iOS 12 y 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 estará habilitado en dispositivos con SoC A12 y posteriores (iPhone Xs y posteriores) para usar Neural Engine para una inferencia más rápida. Si desea utilizar el delegado de Core ML también en dispositivos más antiguos, consulte las mejores prácticas.
Modelos compatibles
El delegado de Core ML actualmente admite modelos flotantes (FP32 y FP16).
Probar el delegado Core ML en su propio modelo
El delegado de Core ML ya está incluido en el lanzamiento nocturno de TensorFlow lite CocoaPods. Para usar el delegado de Core ML, cambie su pod TensorFlow lite para incluir la 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']
Rápido
let coreMLDelegate = CoreMLDelegate() var interpreter: Interpreter // Core ML delegate will only be created for devices with Neural Engine if coreMLDelegate != nil { interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate!]) } else { interpreter = try Interpreter(modelPath: modelPath) }
C objetivo
// Import module when using CocoaPods with module support @import TFLTensorFlowLite; // Or import following headers manually # import "tensorflow/lite/objc/apis/TFLCoreMLDelegate.h" # import "tensorflow/lite/objc/apis/TFLTensorFlowLite.h" // Initialize Core ML delegate TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] init]; // Initialize interpreter with model path and Core ML delegate TFLInterpreterOptions* options = [[TFLInterpreterOptions alloc] init]; NSError* error = nil; TFLInterpreter* interpreter = [[TFLInterpreter alloc] initWithModelPath:modelPath options:options delegates:@[ coreMLDelegate ] error:&error]; if (error != nil) { /* Error handling... */ } if (![interpreter allocateTensorsWithError:&error]) { /* Error handling... */ } if (error != nil) { /* Error handling... */ } // Run inference ...
C (Hasta 2.3.0)
#include "tensorflow/lite/delegates/coreml/coreml_delegate.h" // Initialize interpreter with model TfLiteModel* model = TfLiteModelCreateFromFile(model_path); // Initialize interpreter with Core ML delegate TfLiteInterpreterOptions* options = TfLiteInterpreterOptionsCreate(); TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(NULL); // default config TfLiteInterpreterOptionsAddDelegate(options, delegate); TfLiteInterpreterOptionsDelete(options); TfLiteInterpreter* interpreter = TfLiteInterpreterCreate(model, options); TfLiteInterpreterAllocateTensors(interpreter); // Run inference ... /* ... */ // Dispose resources when it is no longer used. // Add following code to the section where you dispose of the delegate // (e.g. `dealloc` of class). TfLiteInterpreterDelete(interpreter); TfLiteCoreMlDelegateDelete(delegate); TfLiteModelDelete(model);
Mejores prácticas
Uso del delegado de Core ML en dispositivos sin Neural Engine
De forma predeterminada, el delegado de Core ML solo se creará si el dispositivo tiene Neural Engine y devolverá null
si no se crea el delegado. Si desea ejecutar el delegado de Core ML en otros entornos (por ejemplo, un simulador), pase .all
como opción al crear el delegado en Swift. En C++ (y Objective-C), puede pasar TfLiteCoreMlDelegateAllDevices
. El siguiente ejemplo muestra cómo hacer esto:
Rápido
var options = CoreMLDelegate.Options() options.enabledDevices = .all let coreMLDelegate = CoreMLDelegate(options: options)! let interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate])
C objetivo
TFLCoreMLDelegateOptions* coreMLOptions = [[TFLCoreMLDelegateOptions alloc] init]; coreMLOptions.enabledDevices = TFLCoreMLDelegateEnabledDevicesAll; TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] initWithOptions:coreMLOptions]; // Initialize interpreter with delegate
C
TfLiteCoreMlDelegateOptions options; options.enabled_devices = TfLiteCoreMlDelegateAllDevices; TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(&options); // Initialize interpreter with delegate
Usando el delegado Metal (GPU) como alternativa.
Cuando no se crea el delegado de Core ML, también puede utilizar el delegado de Metal para obtener beneficios de rendimiento. El siguiente ejemplo muestra cómo hacer esto:
Rápido
var delegate = CoreMLDelegate() if delegate == nil { delegate = MetalDelegate() // Add Metal delegate options if necessary. } let interpreter = try Interpreter(modelPath: modelPath, delegates: [delegate!])
C objetivo
TFLDelegate* delegate = [[TFLCoreMLDelegate alloc] init]; if (!delegate) { // Add Metal delegate options if necessary delegate = [[TFLMetalDelegate alloc] init]; } // Initialize interpreter with delegate
C
TfLiteCoreMlDelegateOptions options = {}; delegate = TfLiteCoreMlDelegateCreate(&options); if (delegate == NULL) { // Add Metal delegate options if necessary delegate = TFLGpuDelegateCreate(NULL); } // Initialize interpreter with delegate
La lógica de creación de delegados lee la identificación de la máquina del dispositivo (por ejemplo, iPhone11,1) para determinar la disponibilidad del motor neuronal. Consulte el código para obtener más detalles. Alternativamente, puede implementar su propio conjunto de dispositivos de lista negra utilizando otras bibliotecas como DeviceKit .
Usando una versión anterior de Core ML
Aunque iOS 13 es compatible con Core ML 3, el modelo podría funcionar mejor cuando se convierte con la especificación del modelo Core ML 2. La versión de conversión de destino está configurada en la última versión de forma predeterminada, pero puede cambiar esto configurando coreMLVersion
(en Swift, coreml_version
en C API) en la opción delegar a una versión anterior.
Operaciones soportadas
Las siguientes operaciones cuentan con el apoyo del delegado de Core ML.
- Agregar
- Sólo se pueden transmitir determinadas formas. En el diseño de tensor de Core ML, se pueden transmitir las siguientes formas de tensor.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Sólo se pueden transmitir determinadas formas. En el diseño de tensor de Core ML, se pueden transmitir las siguientes formas de tensor.
- PiscinaPromedio2D
- Concat
- La concatenación debe realizarse a lo largo del eje del canal.
- Conv2D
- Las ponderaciones y el sesgo deben ser constantes.
- ProfundidadConv2D
- Las ponderaciones y el sesgo deben ser constantes.
- Totalmente conectado (también conocido como producto denso o interno)
- Las ponderaciones y el sesgo (si están presentes) deben ser constantes.
- Solo admite casos de un solo lote. Las dimensiones de entrada deben ser 1, excepto la última dimensión.
- deseo duro
- Logística (también conocida como sigmoide)
- MaxPool2D
- Almohadilla de espejo
- Solo se admite la entrada 4D con modo
REFLECT
. El relleno debe ser constante y solo está permitido para las dimensiones H y W.
- Solo se admite la entrada 4D con modo
- Mul
- Sólo se pueden transmitir determinadas formas. En el diseño de tensor de Core ML, se pueden transmitir las siguientes formas de tensor.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Sólo se pueden transmitir determinadas formas. En el diseño de tensor de Core ML, se pueden transmitir las siguientes formas de tensor.
- Almohadilla y PadV2
- Solo se admite la entrada 4D. El relleno debe ser constante y solo está permitido para las dimensiones H y W.
- Relu
- ReluN1To1
- Relu6
- remodelar
- Solo se admite cuando la versión de Core ML de destino es 2, no se admite cuando la versión de Core ML de destino es 3.
- Cambiar tamañoBilineal
- Softmax
- tanh
- TransponerConv
- Los pesos deben ser constantes.
Comentario
Si tiene problemas, cree un problema de GitHub con todos los detalles necesarios para reproducirlo.
Preguntas más frecuentes
- ¿El delegado de CoreML admite el respaldo a la CPU si un gráfico contiene operaciones no compatibles?
- Sí
- ¿El delegado de CoreML funciona en iOS Simulator?
- Sí. La biblioteca incluye objetivos x86 y x86_64 para que pueda ejecutarse en un simulador, pero no verá un aumento de rendimiento con respecto a la CPU.
- ¿Los delegados de TensorFlow Lite y CoreML son compatibles con MacOS?
- TensorFlow Lite solo se prueba en iOS pero no en MacOS.
- ¿Se admiten operaciones TF Lite personalizadas?
- No, el delegado de CoreML no admite operaciones personalizadas y recurrirán a la CPU.
API
- API Swift delegada de ML principal
- API C delegada de ML principal
- Esto se puede utilizar para códigos Objective-C. ~~~