¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Delegado de Tensorflow Lite Core ML

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 iOS compatibles:

  • iOS 12 y posterior. 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 A12 SoC 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 los dispositivos más antiguos, consulte las prácticas recomendadas.

Modelos compatibles

El delegado de Core ML actualmente admite modelos flotantes (FP32 y FP16).

Probar el delegado de 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 de TensorFlow lite para incluir CoreML de 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á un 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 una opción mientras crea 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
      

Uso del delegado de Metal (GPU) como alternativa.

Cuando no se crea el delegado de Core ML, también puede usar 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 de su motor neuronal. Consulte el código para obtener más detalles. Alternativamente, puede implementar su propio conjunto de dispositivos denylist 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 la versión anterior.

Operaciones apoyadas

El delegado de Core ML admite las siguientes operaciones.

  • Agregar
    • Solo determinadas formas son retransmisibles. En el diseño del tensor de Core ML, las siguientes formas de tensor se pueden difundir. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • PromedioPool2D
  • Concat
    • La concatenación debe realizarse a lo largo del eje del canal.
  • Conv2D
    • Los pesos y el sesgo deben ser constantes.
  • DepthwiseConv2D
    • Los pesos y el sesgo deben ser constantes.
  • FullyConnected (también conocido como Producto denso o interno)
    • Los pesos y el sesgo (si están presentes) deben ser constantes.
    • Solo es compatible con estuches de un solo lote. Las dimensiones de entrada deben ser 1, excepto la última dimensión.
  • Hardswish
  • Logística (también conocida como sigmoide)
  • MaxPool2D
  • MirrorPad
    • Solo se admite la entrada 4D con modo REFLECT . El acolchado debe ser constante y solo está permitido para las dimensiones de alto y ancho.
  • Mul
    • Solo ciertas formas son retransmisibles. En el diseño de tensor de Core ML, las siguientes formas de tensor se pueden difundir. [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 acolchado debe ser constante y solo está permitido para las dimensiones de alto y ancho.
  • Relu
  • ReluN1To1
  • Relu6
  • Remodelar
    • Solo se admite cuando la versión de Core ML de destino es 2, no se admite cuando se orienta a Core ML 3.
  • Cambiar tamañoBilineal
  • SoftMax
  • Tanh
  • TransposeConv
    • Los pesos deben ser constantes.

Realimentación

Para problemas, cree un problema de GitHub con todos los detalles necesarios para reproducir.

Preguntas más frecuentes

  • ¿El delegado de CoreML admite el respaldo a la CPU si un gráfico contiene operaciones no admitidas?
  • ¿El delegado de CoreML funciona en iOS Simulator?
    • Si. La biblioteca incluye destinos x86 y x86_64 para que pueda ejecutarse en un simulador, pero no verá un aumento de rendimiento en la CPU.
  • ¿TensorFlow Lite y el delegado de CoreML son compatibles con MacOS?
    • TensorFlow Lite solo se prueba en iOS, pero no en MacOS.
  • ¿Se admiten las operaciones personalizadas de TF Lite?
    • No, el delegado de CoreML no admite operaciones personalizadas y recurrirán a la CPU.

API