LiteRT Core ML-Delegate

Der LiteRT Core ML-Delegate ermöglicht die Ausführung von LiteRT-Modellen auf Core ML Framework, die schnellere Modellinferenzen auf iOS-Geräten.

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

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

Unterstützte Modelle

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

Core ML-Delegate für eigenes Modell testen

Der Core ML-Delegate ist bereits im nächtlichen Release von LiteRT enthalten CocoaPods Um Core ML Delegate zu verwenden, ändern Sie Ihren LiteRT-Pod so, dass Unterspezifikation CoreML in 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']

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 Version 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 Delegate auf Geräten ohne Neural Engine verwenden

Standardmäßig wird der Core ML-Delegaten nur erstellt, wenn das Gerät eine Neural-Version hat. und gibt null zurück, wenn der Bevollmächtigte nicht erstellt wird. Wenn Sie Core ML Delegate in anderen Umgebungen (z. B. Simulator) ausführen und .all übergeben als Option beim Erstellen eines Bevollmächtigten in Swift. In C++ (und Objective-C) können Sie TfLiteCoreMlDelegateAllDevices übergeben. Das folgende Beispiel zeigt, wie dies 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
      

Metal(GPU)-Delegierung wird als Fallback verwendet.

Wenn der Core ML-Delegaten nicht erstellt wird, können Sie auch Metal-Delegierte Leistungsvorteile. Das folgende Beispiel zeigt, wie dies 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 für die Erstellung von Bevollmächtigten liest die Maschinen-ID des Geräts (z.B. iPhone11,1) auf die Verfügbarkeit von Neural Engine zu ermitteln. Weitere Informationen finden Sie in der Code . Alternativ können Sie eine eigene Sperrliste implementieren Geräte mit anderen Bibliotheken wie DeviceKit.

Ältere Core ML-Version wird verwendet

Core ML 3 wird zwar von iOS 13 unterstützt, das Modell funktioniert aber möglicherweise besser, wenn es mit der Core ML 2-Modellspezifikation konvertiert. Die Ziel-Conversion-Version ist ist standardmäßig die neueste Version. Sie können dies jedoch ändern, indem Sie coreMLVersion (in Swift, coreml_version in der C API) in der Option zum Delegieren von ältere Version.

Unterstützte Operationen

Folgende Vorgänge werden vom Core ML-Delegate unterstützt.

  • Hinzufügen <ph type="x-smartling-placeholder">
      </ph>
    • Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout folgenden Tensorformen sind übertragbar. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • DurchschnittPool2D
  • Verkettung <ph type="x-smartling-placeholder">
      </ph>
    • Die Verkettung sollte entlang der Kanalachse erfolgen.
  • Conv2D <ph type="x-smartling-placeholder">
      </ph>
    • Gewichtungen und Verzerrungen sollten konstant sein.
  • DepthwiseConv2D <ph type="x-smartling-placeholder">
      </ph>
    • Gewichtungen und Verzerrungen sollten konstant sein.
  • Vollständig verbunden (auch als „Dicht“ oder „InnerProduct“ bezeichnet) <ph type="x-smartling-placeholder">
      </ph>
    • Gewichtungen und Verzerrungen (falls vorhanden) sollten konstant sein.
    • Unterstützt nur Groß- und Kleinschreibung in einem Batch. Die Eingabedimensionen müssen 1 sein, außer der letzten Dimension.
  • Hartnäckig
  • Logistik (auch Sigmoid genannt)
  • MaxPool2D
  • MirrorPad <ph type="x-smartling-placeholder">
      </ph>
    • Es werden nur 4D-Eingaben im REFLECT-Modus unterstützt. Der Abstand sollte konstant und ist nur für die Dimensionen H und B zulässig.
  • Mül <ph type="x-smartling-placeholder">
      </ph>
    • Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout folgenden Tensorformen sind übertragbar. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Pad und PadV2 <ph type="x-smartling-placeholder">
      </ph>
    • Es werden nur 4D-Eingaben unterstützt. Das Padding sollte konstant sein H und B zulässig.
  • Relu
  • ReluN1To1 (ReluN1To1)
  • Relu6
  • Form ändern <ph type="x-smartling-placeholder">
      </ph>
    • Wird nur unterstützt, wenn die Core ML-Zielversion 2 ist, wird nicht unterstützt, die auf Core ML 3 ausgerichtet sind.
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv <ph type="x-smartling-placeholder">
      </ph>
    • Gewichtungen müssen konstant sein.

Feedback

Bei Problemen erstellen Sie eine GitHub mit allen notwendigen Details, um sich zu reproduzieren.

FAQ

  • Unterstützt der CoreML-Delegaten das Fallback auf die CPU, wenn ein Diagramm nicht unterstützte Ops?
    • Ja
  • Funktioniert der CoreML-Delegaten im iOS-Simulator?
    • Ja. Die Bibliothek enthält x86- und x86_64-Ziele, sodass sie auf einen Simulator ein. Sie werden jedoch keine Leistungssteigerung gegenüber der CPU feststellen.
  • Unterstützt LiteRT und CoreML-Delegate MacOS?
    • LiteRT wird nur unter iOS, aber nicht unter macOS getestet.
  • Werden benutzerdefinierte LiteRT-Operationen unterstützt?
    • Nein, der CoreML-Delegate unterstützt keine benutzerdefinierten Vorgänge und dieser greift auf CPU

APIs