Tensorflow Lite Core ML-Delegate

Der TensorFlow Lite Core ML-Delegate ermöglicht die Ausführung von TensorFlow Lite-Modellen im 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 wird der Core ML-Delegierung automatisch auf die CPU zurückgesetzt.
  • Standardmäßig wird der Core ML-Delegat nur auf Geräten mit SoC (A12) und höher (iPhone Xs und höher) aktiviert, um Neural Engine für eine schnellere Inferenz zu verwenden. Wenn Sie Core ML Delegate auch auf den älteren Geräten verwenden möchten, lesen Sie die Best Practices.

Unterstützte Modelle

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

Core ML-Delegaten an Ihrem eigenen Modell testen

Der Core ML-Delegat ist bereits im nächtlichen Release von TensorFlow Lite CocoaPods enthalten. Wenn Sie den Core ML-Delegaten verwenden möchten, ändern Sie Ihren TensorFlow Lite-Pod so, dass der Podfile die Unterspezifikation CoreML enthält.

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']

Swift

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

Objective-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);
      

Best Practices

Core ML-Delegaten auf Geräten ohne Neural Engine verwenden

Standardmäßig wird der Core ML-Delegate nur erstellt, wenn das Gerät über Neural Engine verfügt. Wenn der Bevollmächtigte nicht erstellt wurde, wird null zurückgegeben. Wenn Sie den Core ML-Delegaten in anderen Umgebungen (z. B. im Simulator) ausführen möchten, übergeben Sie beim Erstellen des Delegaten in Swift .all als Option. In C++ (und Objective-C) können Sie TfLiteCoreMlDelegateAllDevices übergeben. Das folgende Beispiel zeigt, wie das funktioniert:

Swift

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

Objective-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
      

Verwendung des Metal-Delegaten(GPU) als Fallback.

Wenn der Core ML-Delegate nicht erstellt wird, können Sie alternativ immer noch den Metal-Delegaten verwenden, um Leistungsvorteile zu erzielen. Das folgende Beispiel zeigt, wie das funktioniert:

Swift

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

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

Objective-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 Logik zur Erstellung des Bevollmächtigten liest die Maschinen-ID des Geräts (z.B. iPhone11,1), um die Verfügbarkeit der Neural Engine zu ermitteln. Weitere Informationen finden Sie im Code. Alternativ können Sie mithilfe anderer Bibliotheken wie DeviceKit eigene Sperrlistengeräte implementieren.

Ältere Core ML-Version verwenden

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 Ziel-Konvertierungsversion ist 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 Delegierungsoption auf eine ältere Version festlegen.

Unterstützte Vorgänge

Die folgenden Vorgänge werden vom Core ML-Delegaten unterstützt.

  • Hinzufügen
    • Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout können die folgenden Tensorformen übertragen werden. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Durchschnittlicher Pool (2D)
  • Verkettung
    • Die Verkettung sollte entlang der Kanalachse erfolgen.
  • Conv2D
    • Gewichtungen und Verzerrungen sollten konstant sein.
  • DepthwiseConv2D
    • Gewichtungen und Verzerrungen sollten konstant sein.
  • Vollständig verbunden (auch „Dense“ oder „InnerProduct“)
    • Gewichtungen und Verzerrungen (falls vorhanden) sollten konstant sein.
    • Unterstützt nur Groß-/Kleinschreibung mit einem einzelnen Batch. Die Eingabedimensionen sollten mit Ausnahme der letzten Dimension den Wert 1 haben.
  • Hardwish
  • Logistisch (auch Sigmoid genannt)
  • Max. Pool 2D
  • MirrorPad
    • Es wird nur die 4D-Eingabe im REFLECT-Modus unterstützt. Der Abstand sollte konstant sein und ist nur für die Abmessungen H und B zulässig.
  • Mul.
    • Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout können die folgenden Tensorformen übertragen werden. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Pad und Pad V2
    • Es wird nur die 4D-Eingabe unterstützt. Der Abstand sollte konstant sein und ist nur bei den Abmessungen H und B zulässig.
  • Logo: Relu
  • ReluN1To1
  • Relu6
  • Form ändern
    • Wird nur unterstützt, wenn die Core ML-Zielversion 2 ist, und nicht beim Targeting auf Core ML 3.
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv
    • Die Gewichtung sollte konstant sein.

Feedback

Erstellen Sie bei Problemen ein GitHub mit allen erforderlichen Details, um es zu reproduzieren.

Häufig gestellte Fragen

  • Unterstützt CoreML-Delegierung die Unterstützung von Fallbacks auf die CPU, wenn ein Graph nicht unterstützte Vorgänge enthält?
    • Ja
  • Funktioniert der CoreML-Delegierung im iOS Simulator?
    • Ja. Die Bibliothek enthält x86- und x86_64-Ziele, sodass sie in einem Simulator ausgeführt werden kann, aber Sie werden keine Leistungssteigerung über die CPU feststellen.
  • Unterstützen TensorFlow Lite und CoreML-Delegaten macOS?
    • TensorFlow Lite wird nur unter iOS getestet, aber nicht unter macOS.
  • Werden benutzerdefinierte TF Lite-Vorgänge unterstützt?
    • Nein, der CoreML-Delegaten unterstützt keine benutzerdefinierten Vorgänge und greift auf CPU zurück.

APIs