Delegato Core ML TensorFlow Lite

Il delegato TensorFlow Lite Core ML consente l'esecuzione di modelli TensorFlow Lite sul framework ML principale, in modo da velocizzare l'inferenza del modello sui dispositivi iOS.

Versioni e dispositivi iOS supportati:

  • iOS 12 e versioni successive. Nelle versioni iOS precedenti, il delegato Core ML farà 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 vuoi 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).

Prova del delegato Core ML sul tuo modello

Il delegato Core ML è già incluso nella release notturna di TensorFlow Lite CocoaPods. Per utilizzare il delegato Core ML, modifica il pod TensorFlow Lite in modo da includere la sottospecifica CoreML in Podfile.

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

OR

# 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 (fino alla versione 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 practice

Utilizzo del delegato Core ML sui dispositivi senza Neural Engine

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

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
      

Utilizzo del delegato Metal(GPU) come riserva.

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

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
      

La logica di creazione delegata legge l'ID macchina del dispositivo (ad es. iPhone11,1) per determinare la sua disponibilità di Neural Engine. Per ulteriori dettagli, consulta il codice. In alternativa, puoi implementare il tuo set di dispositivi della lista bloccata utilizzando altre librerie come DeviceKit.

Utilizzo della versione precedente di Core ML

Anche se iOS 13 supporta Core ML 3, il modello potrebbe funzionare meglio se viene convertito con le specifiche del modello Core ML 2. Per impostazione predefinita, la versione di destinazione della conversione è impostata sulla versione più recente, ma puoi modificare questa impostazione impostando coreMLVersion (in Swift, coreml_version nell'API C) nell'opzione delegata alla versione precedente.

Operazioni supportate

Le operazioni seguenti sono supportate dal delegato Core ML.

  • Aggiungi
    • È possibile trasmettere solo alcune forme. Nel layout del tensore di Core ML, è possibile trasmettere le seguenti forme di tensore. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Media pool 2 D
  • Concat
    • La concatenazione deve essere eseguita lungo l'asse del canale.
  • Conv.2D
    • Le ponderazioni e i bias devono essere costanti.
  • DepthwiseConv2D
    • Le ponderazioni e i bias devono essere costanti.
  • Completamente connesso (noto anche come Dense o InnerProduct)
    • Le ponderazioni e i bias (se presenti) devono essere costanti.
    • Supporta solo maiuscole e minuscole in un singolo batch. Le dimensioni di input devono essere 1, tranne l'ultima.
  • Hardswish
  • Logistica (nota anche come sigmoidale)
  • Pool Max 2D
  • MirrorPad
    • È supportato soltanto l'input 4D con la modalità REFLECT. La spaziatura interna deve essere costante ed è consentita solo per le dimensioni H e W.
  • Mul
    • È possibile trasmettere solo alcune forme. Nel layout del tensore di Core ML, è possibile trasmettere le seguenti forme di tensore. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • Pad e PadV2
    • È supportato solo l'input 4D. La spaziatura interna deve essere costante ed è consentita solo per le dimensioni H e W.
  • Relu
  • ReluN1To1
  • Relu6
  • Rimodella
    • Funzionalità supportata solo se la versione Core ML di destinazione è 2, non supportata quando si ha come target Core ML 3.
  • ResizeBilinear
  • SoftMax
  • Tan
  • TransposeConv
    • Le ponderazioni devono essere costanti.

Feedback

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

Domande frequenti

  • Il delegato CoreML supporta il fallback sulla CPU se un grafico contiene operazioni non supportate?
  • Il delegato CoreML funziona sul simulatore iOS?
    • Sì. La libreria include target x86 e x86_64 per l'esecuzione su un simulatore, ma non noterai un miglioramento delle prestazioni rispetto alla CPU.
  • TensorFlow Lite e delegati CoreML supportano MacOS?
    • TensorFlow Lite è testato solo su iOS, ma non su MacOS.
  • Le operazioni TF Lite personalizzate sono supportate?
    • No, il delegato CoreML non supporta le operazioni personalizzate e ricorrerà alla CPU.

API