Tensorflow Lite Core ML-Delegierter

Der TensorFlow Lite Core ML-Delegat ermöglicht die Ausführung von TensorFlow Lite-Modellen auf dem Core ML-Framework , was zu einer schnelleren Modellinferenz auf iOS-Geräten führt.

Unterstützte iOS-Versionen und -Geräte:

  • iOS 12 und höher. In den älteren iOS-Versionen greift der Core ML-Delegat automatisch auf die CPU zurück.
  • Standardmäßig wird der Core ML-Delegat nur auf Geräten mit A12 SoC und höher (iPhone Xs und höher) aktiviert, um Neural Engine für schnellere Inferenz zu verwenden. Wenn Sie den Core ML-Delegaten auch auf älteren Geräten verwenden möchten, lesen Sie die Best Practices

Unterstützte Modelle

Der Core ML-Delegat unterstützt derzeit Float-Modelle (FP32 und FP16).

Probieren Sie den Core ML-Delegierten nach Ihrem eigenen Modell aus

Der Core ML-Delegierte ist bereits in der nächtlichen Veröffentlichung von TensorFlow lite CocoaPods enthalten. Um den Core ML-Delegaten zu verwenden, ändern Sie Ihren TensorFlow Lite-Pod so, dass er die Unterart CoreML in Ihre Podfile .

target 'YourProjectName'
  pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0'  # Or TensorFlowLiteObjC/CoreML

ODER

# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
  pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']

Schnell

    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)
    }
      

Ziel c


    // 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 (bis 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);
      

Empfohlene Vorgehensweise

Verwenden des Core ML-Delegaten auf Geräten ohne Neural Engine

Standardmäßig wird der Core ML-Delegat nur erstellt, wenn das Gerät über Neural Engine verfügt, und es wird null wenn der Delegat nicht erstellt wird. Wenn Sie Core ML-Delegate in anderen Umgebungen (z. B. Simulator) .all , übergeben .all beim Erstellen von Delegaten in Swift .all als Option. Unter C ++ (und Objective-C) können Sie TfLiteCoreMlDelegateAllDevices . Das folgende Beispiel zeigt, wie das geht:

Schnell

    var options = CoreMLDelegate.Options()
    options.enabledDevices = .all
    let coreMLDelegate = CoreMLDelegate(options: options)!
    let interpreter = try Interpreter(modelPath: modelPath,
                                      delegates: [coreMLDelegate])
      

Ziel c

    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
      

Verwenden eines GPU-Delegaten (Metal) als Fallback.

Wenn der Core ML-Delegat nicht erstellt wurde, können Sie alternativ weiterhin den Metal-Delegaten verwenden , um Leistungsvorteile zu erzielen. Das folgende Beispiel zeigt, wie das geht:

Schnell

    var delegate = CoreMLDelegate()
    if delegate == nil {
      delegate = MetalDelegate()  // Add Metal delegate options if necessary.
    }

    let interpreter = try Interpreter(modelPath: modelPath,
                                      delegates: [delegate!])
      

Ziel c

    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
      

Die Delegatenerstellungslogik liest die Maschinen-ID des Geräts (z. B. iPhone 11,1), um die Verfügbarkeit der Neural Engine zu ermitteln. Weitere Informationen finden Sie im Code . Alternativ können Sie Ihre eigenen Denylist-Geräte mithilfe anderer Bibliotheken wie DeviceKit implementieren.

Verwendung einer älteren Core ML-Version

Obwohl iOS 13 Core ML 3 unterstützt, funktioniert das Modell möglicherweise besser, wenn es mit der Core ML 2-Modellspezifikation konvertiert wird. Die coreMLVersion standardmäßig auf die neueste Version festgelegt. Sie können dies jedoch ändern, indem Sie coreMLVersion (in Swift coreml_version in der C-API) in der Delegate-Option auf eine ältere Version coreml_version .

Unterstützte Operationen

Die folgenden Operationen werden vom Core ML-Delegierten unterstützt.

  • Hinzufügen
    • Es können nur bestimmte Formen gesendet werden. Im Core ML-Tensorlayout können folgende Tensorformen gesendet werden. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • AveragePool2D
  • Concat
    • Die Verkettung sollte entlang der Kanalachse erfolgen.
  • Conv2D
    • Gewichte und Vorspannung sollten konstant sein.
  • DepthwiseConv2D
    • Gewichte und Vorspannung sollten konstant sein.
  • FullyConnected (auch bekannt als Dense oder InnerProduct)
    • Gewichte und Vorspannung (falls vorhanden) sollten konstant sein.
    • Unterstützt nur Single-Batch-Fälle. Die Eingabedimensionen sollten 1 sein, mit Ausnahme der letzten Dimension.
  • Hardswish
  • Logistik (auch bekannt als Sigmoid)
  • MaxPool2D
  • MirrorPad
    • Es wird nur ein 4D-Eingang mit REFLECT Modus unterstützt. Die Polsterung sollte konstant sein und ist nur für H- und W-Abmessungen zulässig.
  • Mul
    • Es können nur bestimmte Formen gesendet werden. Im Core ML-Tensorlayout können folgende Tensorformen gesendet werden. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Pad und PadV2
    • Es wird nur 4D-Eingang unterstützt. Die Polsterung sollte konstant sein und ist nur für H- und W-Abmessungen zulässig.
  • Relu
  • ReluN1To1
  • Relu6
  • Umformen
    • Wird nur unterstützt, wenn die Core ML-Zielversion 2 ist, nicht unterstützt, wenn Core ML 3 als Ziel ausgewählt wird.
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv
    • Die Gewichte sollten konstant sein.

Feedback

Erstellen Sie bei Problemen ein GitHub- Problem mit allen für die Reproduktion erforderlichen Details.

FAQ

  • Unterstützt der CoreML-Delegat ein Fallback an die CPU, wenn ein Diagramm nicht unterstützte Operationen enthält?
    • Ja
  • Funktioniert der CoreML-Delegat unter iOS Simulator?
    • Ja. Die Bibliothek enthält x86- und x86_64-Ziele, sodass sie auf einem Simulator ausgeführt werden kann. Sie werden jedoch keine Leistungssteigerung gegenüber der CPU feststellen.
  • Unterstützt der TensorFlow Lite- und CoreML-Delegat MacOS?
    • TensorFlow Lite wird nur unter iOS getestet, nicht jedoch unter MacOS.
  • Werden benutzerdefinierte TF Lite-Operationen unterstützt?
    • Nein, der CoreML-Delegat unterstützt keine benutzerdefinierten Operationen und greift auf die CPU zurück.

APIs