Delegato LiteRT Core ML

Il delegato LiteRT Core ML consente l'esecuzione di modelli LiteRT su Core ML, 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 precedenti di iOS, il delegato Core ML il fallback automatico alla CPU.
  • Per impostazione predefinita, il delegato Core ML sarà abilitato solo sui dispositivi con SoC A12 e successivi (iPhone X e successivi) per utilizzare Neural Engine per un'inferenza più rapida. Se vuoi utilizzare il delegato Core ML anche sui dispositivi meno recenti, consulta best practice

Modelli supportati

Il delegato Core ML attualmente supporta i modelli in virgola mobile (FP32 e FP16).

Prova il delegato Core ML sul tuo modello

Il delegato Core ML è già incluso nella release notturna di LiteRT CocoaPods. Per utilizzare il delegato Core ML, modifica il pod LiteRT in modo da includere la specifica secondaria CoreML nel tuo Podfile.

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

OPPURE

# 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 su dispositivi senza Neural Engine

Per impostazione predefinita, il delegato Core ML verrà creato solo se il dispositivo ha un sistema neurale Engine e restituirà null se il delegato non viene creato. Se vuoi esegui il delegato Core ML su altri ambienti (ad esempio, simulatore), passa .all come opzione durante la creazione del delegato in Swift. In C++ (e Objective-C), puoi superato TfLiteCoreMlDelegateAllDevices. L'esempio seguente mostra come procedere:

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 il delegato Core ML non viene creato, puoi comunque utilizzare Metal delegata per ottenere in termini di prestazioni. L'esempio seguente mostra come procedere:

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 del delegato legge l'ID macchina del dispositivo (ad es. iPhone11,1) per per determinare la disponibilità di Neural Engine. Consulta le codice per ulteriori dettagli. In alternativa, puoi implementare il tuo insieme di liste bloccate. di dispositivi mobili che usano altre librerie, DeviceKit.

Utilizzo di una versione precedente di Core ML

Sebbene iOS 13 supporti Core ML 3, il modello potrebbe funzionare meglio quando con la specifica del modello Core ML 2. La versione della conversione target è l'ultima versione per impostazione predefinita, ma puoi modificare questa opzione impostando coreMLVersion (in Swift, coreml_version nell'API C) nell'opzione delega per precedente.

Operazioni supportate

Le seguenti operazioni sono supportate dal delegato Core ML.

  • Aggiungi
    • Solo alcune forme possono essere trasmesse. Nel layout Core ML, le seguenti forme di tensori sono trasmesse. [B, C, H, W], [B, C, 1, 1], [B, 1, H, W], [B, 1, 1, 1].
  • MediaPool2D
  • Conca
    • La concatenazione deve essere eseguita lungo l'asse del canale.
  • Conv.2D
    • Ponderazioni e bias devono essere costanti.
  • DepthwiseConv2D
    • Ponderazioni e bias devono essere costanti.
  • Completamente connesso (noto anche come Dense o InnerProduct)
    • Ponderazioni e bias (se presenti) devono essere costanti.
    • Supporta solo casi di singoli batch. Le dimensioni di input devono essere 1, ad eccezione di l'ultima dimensione.
  • Difficile
  • Logistica (nota anche come sigmoidea)
  • MaxPool2D
  • MirrorPad
    • È supportato solo l'input 4D con la modalità REFLECT. La spaziatura interna deve essere ed è consentita solo per le dimensioni H e W.
  • Mul
    • Solo alcune forme possono essere trasmesse. Nel layout Core ML, le seguenti forme di tensori sono trasmesse. [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 e può essere consentito per le dimensioni H e W.
  • Relu
  • ReLuN1To1
  • Relu6
  • Rimodella
    • Supportata solo quando la versione Core ML di destinazione è 2, non supportata quando che hanno come target Core ML 3.
  • ResizeBilinear
  • SoftMax
  • Tana
  • TransposeConv
    • Le ponderazioni devono essere costanti.

Feedback

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

Domande frequenti

  • CoreML delega il supporto alla CPU se un grafico contiene elementi non supportati operazioni?
  • La delega di CoreML funziona sul simulatore iOS?
    • Sì. La libreria include destinazioni x86 e x86_64 in modo che possa essere eseguita ma non noterai un aumento delle prestazioni rispetto alla CPU.
  • Le deleghe LiteRT e CoreML supportano macOS?
    • LiteRT viene testato solo su iOS, non su MacOS.
  • Le operazioni LiteRT personalizzate sono supportate?
    • No, il delegato CoreML non supporta le operazioni personalizzate e farà affidamento su per la CPU.

API