Delegato Tensorflow Lite Core ML

Il delegato TensorFlow Lite Core ML consente di eseguire modelli TensorFlow Lite sul framework Core ML , il che si traduce in un'inferenza del modello più rapida sui dispositivi iOS.

Versioni e dispositivi iOS supportati:

  • iOS 12 e versioni successive. Nelle versioni iOS precedenti, il delegato Core ML eseguirà automaticamente il fallback sulla CPU.
  • Per impostazione predefinita, il delegato Core ML sarà abilitato solo sui dispositivi con SoC A12 e versioni successive (iPhone Xs e versioni successive) per utilizzare Neural Engine per un'inferenza più rapida. Se desideri utilizzare il delegato Core ML anche sui dispositivi meno recenti, consulta le best practice

Modelli supportati

Il delegato Core ML attualmente supporta i modelli float (FP32 e FP16).

Provare il delegato Core ML sul tuo modello

Il delegato Core ML è già incluso nel rilascio notturno di TensorFlow lite CocoaPods. Per utilizzare il delegato Core ML, modifica il tuo pod TensorFlow lite per includere la subspec CoreML nel tuo 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']

Veloce

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

Obiettivo-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 (fino alla 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);
      

Migliori pratiche

Utilizzo del delegato Core ML su dispositivi senza Neural Engine

Per impostazione predefinita, il delegato Core ML verrà creato solo se il dispositivo dispone di Neural Engine e restituirà null se il delegato non viene creato. Se desideri eseguire il delegato Core ML su altri ambienti (ad esempio il simulatore), passa .all come opzione durante la creazione del delegato in Swift. In C++ (e Objective-C), puoi passare TfLiteCoreMlDelegateAllDevices . L'esempio seguente mostra come eseguire questa operazione:

Veloce

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

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

Utilizzo del delegato Metal (GPU) come fallback.

Quando il delegato Core ML non viene creato, in alternativa è comunque possibile utilizzare il delegato Metal per ottenere vantaggi in termini di prestazioni. L'esempio seguente mostra come eseguire questa operazione:

Veloce

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

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

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

La logica di creazione del delegato legge l'ID macchina del dispositivo (ad esempio iPhone11,1) per determinare la disponibilità del motore neurale. Vedi il codice per maggiori dettagli. In alternativa, puoi implementare il tuo set di dispositivi della lista nera utilizzando altre librerie come DeviceKit .

Utilizzo della versione precedente di Core ML

Sebbene iOS 13 supporti Core ML 3, il modello potrebbe funzionare meglio quando viene convertito con la specifica del modello Core ML 2. La versione di conversione di destinazione è impostata sulla versione più recente per impostazione predefinita, ma puoi modificarla impostando coreMLVersion (in Swift, coreml_version nell'API C) nell'opzione delegate sulla versione precedente.

Operazioni supportate

Le operazioni seguenti sono supportate dal delegato Core ML.

  • Aggiungere
    • Solo alcune forme sono trasmissibili. Nel layout del tensore Core ML, è possibile trasmettere le seguenti forme tensoriali. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • MediaPiscina2D
  • Concat
    • La concatenazione dovrebbe essere eseguita lungo l'asse del canale.
  • Conv2D
    • Pesi e bias dovrebbero essere costanti.
  • ProfonditàConv2D
    • Pesi e bias dovrebbero essere costanti.
  • FullyConnected (noto anche come Dense o InnerProduct)
    • Pesi e bias (se presenti) dovrebbero essere costanti.
    • Supporta solo il caso di batch singolo. Le dimensioni di input dovrebbero essere 1, tranne l'ultima dimensione.
  • Duro
  • Logistico (noto anche come Sigmoide)
  • MaxPool2D
  • MirrorPad
    • È supportato solo l'ingresso 4D con la modalità REFLECT . Il riempimento deve essere costante ed è consentito solo per le dimensioni H e L.
  • Mul
    • Solo alcune forme sono trasmissibili. Nel layout del tensore Core ML, è possibile trasmettere le seguenti forme tensoriali. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Pad e PadV2
    • È supportato solo l'input 4D. Il riempimento deve essere costante ed è consentito solo per le dimensioni H e L.
  • Relù
  • ReluN1To1
  • Relu6
  • Rimodellare
    • Supportato solo quando la versione Core ML di destinazione è 2, non supportato quando la versione di destinazione Core ML 3.
  • RidimensionareBilineare
  • SoftMax
  • Va bene
  • TransposeConv
    • I pesi dovrebbero essere costanti.

Feedback

In caso di problemi, crea un problema GitHub con tutti i dettagli necessari per riprodurlo.

FAQ

  • Il delegato CoreML supporta il fallback sulla CPU se un grafico contiene operazioni non supportate?
  • Il delegato CoreML funziona su iOS Simulator?
    • SÌ. La libreria include target x86 e x86_64 quindi può essere eseguita su un simulatore, ma non vedrai un aumento delle prestazioni rispetto alla CPU.
  • Il delegato TensorFlow Lite e CoreML supporta MacOS?
    • TensorFlow Lite è testato solo su iOS ma non su MacOS.
  • Sono supportate le operazioni TF Lite personalizzate?
    • No, il delegato CoreML non supporta le operazioni personalizzate e eseguirà il fallback sulla CPU.

API