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]
.
- È possibile trasmettere solo alcune forme. Nel layout del tensore di Core ML,
è possibile trasmettere le seguenti forme di tensore.
- 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.
- È supportato soltanto l'input 4D con la modalità
- 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]
.
- È possibile trasmettere solo alcune forme. Nel layout del tensore di Core ML,
è possibile trasmettere le seguenti forme di tensore.
- 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?
- Sì
- 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.