Der LiteRT Core ML-Delegate ermöglicht die Ausführung von LiteRT-Modellen auf Core ML Framework, die schnellere Modellinferenzen auf iOS-Geräten.
Unterstützte iOS-Versionen und -Geräte:
- iOS 12 und höher. In den älteren iOS-Versionen wird der Core ML-Delegaten automatisch auf die CPU aus.
- Standardmäßig ist Core ML Delegate nur auf Geräten mit A12-SoC aktiviert und neuer (iPhone Xs und höher), um Neural Engine für schnellere Inferenzen zu verwenden. Wenn Sie Core ML Delegate auch auf älteren Geräten verwenden möchten, lesen Sie den Abschnitt Best Practices
Unterstützte Modelle
Der Core ML-Delegate unterstützt derzeit Float-Modelle (FP32 und FP16).
Core ML-Delegate für eigenes Modell testen
Der Core ML-Delegate ist bereits im nächtlichen Release von LiteRT enthalten
CocoaPods Um Core ML Delegate zu verwenden, ändern Sie Ihren LiteRT-Pod so, dass
Unterspezifikation CoreML
in Podfile
.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
ODER
# 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 (bis Version 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 Practices
Core ML Delegate auf Geräten ohne Neural Engine verwenden
Standardmäßig wird der Core ML-Delegaten nur erstellt, wenn das Gerät eine Neural-Version hat.
und gibt null
zurück, wenn der Bevollmächtigte nicht erstellt wird. Wenn Sie
Core ML Delegate in anderen Umgebungen (z. B. Simulator) ausführen und .all
übergeben
als Option beim Erstellen eines Bevollmächtigten in Swift. In C++ (und Objective-C) können Sie
TfLiteCoreMlDelegateAllDevices
übergeben. Das folgende Beispiel zeigt, wie dies funktioniert:
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
Metal(GPU)-Delegierung wird als Fallback verwendet.
Wenn der Core ML-Delegaten nicht erstellt wird, können Sie auch Metal-Delegierte Leistungsvorteile. Das folgende Beispiel zeigt, wie dies funktioniert:
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
Die Logik für die Erstellung von Bevollmächtigten liest die Maschinen-ID des Geräts (z.B. iPhone11,1) auf die Verfügbarkeit von Neural Engine zu ermitteln. Weitere Informationen finden Sie in der Code . Alternativ können Sie eine eigene Sperrliste implementieren Geräte mit anderen Bibliotheken wie DeviceKit.
Ältere Core ML-Version wird verwendet
Core ML 3 wird zwar von iOS 13 unterstützt, das Modell funktioniert aber möglicherweise besser, wenn es
mit der Core ML 2-Modellspezifikation konvertiert. Die Ziel-Conversion-Version ist
ist standardmäßig die neueste Version. Sie können dies jedoch ändern, indem Sie
coreMLVersion
(in Swift, coreml_version
in der C API) in der Option zum Delegieren von
ältere Version.
Unterstützte Operationen
Folgende Vorgänge werden vom Core ML-Delegate unterstützt.
- Hinzufügen
<ph type="x-smartling-placeholder">
- </ph>
- Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout
folgenden Tensorformen sind übertragbar.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout
folgenden Tensorformen sind übertragbar.
- DurchschnittPool2D
- Verkettung
<ph type="x-smartling-placeholder">
- </ph>
- Die Verkettung sollte entlang der Kanalachse erfolgen.
- Conv2D
<ph type="x-smartling-placeholder">
- </ph>
- Gewichtungen und Verzerrungen sollten konstant sein.
- DepthwiseConv2D
<ph type="x-smartling-placeholder">
- </ph>
- Gewichtungen und Verzerrungen sollten konstant sein.
- Vollständig verbunden (auch als „Dicht“ oder „InnerProduct“ bezeichnet)
<ph type="x-smartling-placeholder">
- </ph>
- Gewichtungen und Verzerrungen (falls vorhanden) sollten konstant sein.
- Unterstützt nur Groß- und Kleinschreibung in einem Batch. Die Eingabedimensionen müssen 1 sein, außer der letzten Dimension.
- Hartnäckig
- Logistik (auch Sigmoid genannt)
- MaxPool2D
- MirrorPad
<ph type="x-smartling-placeholder">
- </ph>
- Es werden nur 4D-Eingaben im
REFLECT
-Modus unterstützt. Der Abstand sollte konstant und ist nur für die Dimensionen H und B zulässig.
- Es werden nur 4D-Eingaben im
- Mül
<ph type="x-smartling-placeholder">
- </ph>
- Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout
folgenden Tensorformen sind übertragbar.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Nur bestimmte Formen können übertragen werden. Im Core ML-Tensor-Layout
folgenden Tensorformen sind übertragbar.
- Pad und PadV2
<ph type="x-smartling-placeholder">
- </ph>
- Es werden nur 4D-Eingaben unterstützt. Das Padding sollte konstant sein H und B zulässig.
- Relu
- ReluN1To1 (ReluN1To1)
- Relu6
- Form ändern
<ph type="x-smartling-placeholder">
- </ph>
- Wird nur unterstützt, wenn die Core ML-Zielversion 2 ist, wird nicht unterstützt, die auf Core ML 3 ausgerichtet sind.
- ResizeBilinear
- SoftMax
- Tanh
- TransposeConv
<ph type="x-smartling-placeholder">
- </ph>
- Gewichtungen müssen konstant sein.
Feedback
Bei Problemen erstellen Sie eine GitHub mit allen notwendigen Details, um sich zu reproduzieren.
FAQ
- Unterstützt der CoreML-Delegaten das Fallback auf die CPU, wenn ein Diagramm nicht unterstützte
Ops?
- Ja
- Funktioniert der CoreML-Delegaten im iOS-Simulator?
- Ja. Die Bibliothek enthält x86- und x86_64-Ziele, sodass sie auf einen Simulator ein. Sie werden jedoch keine Leistungssteigerung gegenüber der CPU feststellen.
- Unterstützt LiteRT und CoreML-Delegate MacOS?
- LiteRT wird nur unter iOS, aber nicht unter macOS getestet.
- Werden benutzerdefinierte LiteRT-Operationen unterstützt?
- Nein, der CoreML-Delegate unterstützt keine benutzerdefinierten Vorgänge und dieser greift auf CPU