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]
.
- Solo alcune forme possono essere trasmesse. Nel layout Core ML,
le seguenti forme di tensori sono trasmesse.
- 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.
- È supportato solo l'input 4D con la modalità
- 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]
.
- Solo alcune forme possono essere trasmesse. Nel layout Core ML,
le seguenti forme di tensori sono trasmesse.
- 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?
- Sì
- 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.