Delegati i LiteRT Core ML mundëson ekzekutimin e modeleve LiteRT në kornizën Core ML , gjë që rezulton në përfundime më të shpejta të modelit në pajisjet iOS.
Versionet dhe pajisjet e mbështetura të iOS:
- iOS 12 dhe më vonë. Në versionet më të vjetra të iOS, delegati Core ML do të kthehet automatikisht në CPU.
- Si parazgjedhje, delegati Core ML do të aktivizohet vetëm në pajisjet me A12 SoC dhe më vonë (iPhone Xs dhe më vonë) për të përdorur Neural Engine për përfundime më të shpejta. Nëse dëshironi të përdorni delegatin Core ML edhe në pajisjet më të vjetra, ju lutemi shikoni praktikat më të mira
Modelet e mbështetura
Delegati Core ML aktualisht mbështet modelet float (FP32 dhe FP16).
Provoni delegatin Core ML sipas modelit tuaj
Delegati Core ML është përfshirë tashmë në lëshimin e natës të LiteRT CocoaPods. Për të përdorur delegatin Core ML, ndryshoni podin tuaj LiteRT për të përfshirë nënspecialin CoreML
në skedarin tuaj Podfile
.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
OSE
# Particularily useful when you also want to include 'Metal' subspec.
target 'YourProjectName'
pod 'TensorFlowLiteSwift', '~> 2.4.0', :subspecs => ['CoreML']
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) }
// 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 ...
#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);
Praktikat më të mira
Përdorimi i delegatit Core ML në pajisjet pa Neural Engine
Si parazgjedhje, delegati Core ML do të krijohet vetëm nëse pajisja ka Neural Engine dhe do të kthehet null
nëse delegati nuk krijohet. Nëse dëshironi të ekzekutoni delegatin Core ML në mjedise të tjera (për shembull, simulator), kaloni .all
si opsion gjatë krijimit të delegatit në Swift. Në C++ (dhe Objective-C), mund të kaloni TfLiteCoreMlDelegateAllDevices
. Shembulli i mëposhtëm tregon se si ta bëni këtë:
var options = CoreMLDelegate.Options() options.enabledDevices = .all let coreMLDelegate = CoreMLDelegate(options: options)! let interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate])
TFLCoreMLDelegateOptions* coreMLOptions = [[TFLCoreMLDelegateOptions alloc] init]; coreMLOptions.enabledDevices = TFLCoreMLDelegateEnabledDevicesAll; TFLCoreMLDelegate* coreMLDelegate = [[TFLCoreMLDelegate alloc] initWithOptions:coreMLOptions]; // Initialize interpreter with delegate
TfLiteCoreMlDelegateOptions options; options.enabled_devices = TfLiteCoreMlDelegateAllDevices; TfLiteDelegate* delegate = TfLiteCoreMlDelegateCreate(&options); // Initialize interpreter with delegate
Përdorimi i delegatit Metal (GPU) si rezervë.
Kur delegati Core ML nuk krijohet, përndryshe mund të përdorni akoma delegatin Metal për të marrë përfitime të performancës. Shembulli i mëposhtëm tregon se si ta bëni këtë:
var delegate = CoreMLDelegate() if delegate == nil { delegate = MetalDelegate() // Add Metal delegate options if necessary. } let interpreter = try Interpreter(modelPath: modelPath, delegates: [delegate!])
TFLDelegate* delegate = [[TFLCoreMLDelegate alloc] init]; if (!delegate) { // Add Metal delegate options if necessary delegate = [[TFLMetalDelegate alloc] init]; } // Initialize interpreter with delegate
TfLiteCoreMlDelegateOptions options = {}; delegate = TfLiteCoreMlDelegateCreate(&options); if (delegate == NULL) { // Add Metal delegate options if necessary delegate = TFLGpuDelegateCreate(NULL); } // Initialize interpreter with delegate
Logjika e krijimit të delegatit lexon ID-në e makinës së pajisjes (p.sh. iPhone11,1) për të përcaktuar disponueshmërinë e motorit nervor. Shih kodin për më shumë detaje. Përndryshe, mund të zbatoni grupin tuaj të pajisjeve të refuzimit duke përdorur biblioteka të tjera si DeviceKit .
Përdorimi i versionit më të vjetër Core ML
Megjithëse iOS 13 mbështet Core ML 3, modeli mund të funksionojë më mirë kur konvertohet me specifikimet e modelit Core ML 2. Versioni i konvertimit të synuar është vendosur në versionin më të fundit si parazgjedhje, por ju mund ta ndryshoni këtë duke vendosur coreMLVersion
(në Swift, coreml_version
në C API) në opsionin e delegimit në versionin më të vjetër.
Opsionet e mbështetura
Veprimet e mëposhtme mbështeten nga delegati kryesor i ML.
- Shto
- Vetëm forma të caktuara mund të transmetohen. Në paraqitjen e tensorit Core ML, format e mëposhtme të tensorit mund të transmetohen.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Vetëm forma të caktuara mund të transmetohen. Në paraqitjen e tensorit Core ML, format e mëposhtme të tensorit mund të transmetohen.
- AveragePool2D
- Konkat
- Lidhja duhet të bëhet përgjatë boshtit të kanalit.
- Conv2D
- Peshat dhe paragjykimet duhet të jenë konstante.
- DepthwiseConv2D
- Peshat dhe paragjykimet duhet të jenë konstante.
- Plotësisht i lidhur (i njohur ndryshe si Dense ose InnerProduct)
- Peshat dhe paragjykimet (nëse janë të pranishme) duhet të jenë konstante.
- Mbështet vetëm kasë me një grumbull. Dimensionet e hyrjes duhet të jenë 1, përveç dimensionit të fundit.
- Hardswish
- Logjistike (aka Sigmoid)
- MaxPool2D
- MirrorPad
- Mbështetet vetëm hyrja 4D me modalitetin
REFLECT
. Mbushja duhet të jetë konstante dhe lejohet vetëm për dimensionet H dhe W.
- Mbështetet vetëm hyrja 4D me modalitetin
- Mul
- Vetëm forma të caktuara mund të transmetohen. Në paraqitjen e tensorit Core ML, format e mëposhtme të tensorit mund të transmetohen.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Vetëm forma të caktuara mund të transmetohen. Në paraqitjen e tensorit Core ML, format e mëposhtme të tensorit mund të transmetohen.
- Pad dhe PadV2
- Mbështetet vetëm hyrja 4D. Mbushja duhet të jetë konstante dhe lejohet vetëm për dimensionet H dhe W.
- Relu
- ReluN1To1
- Relu6
- Riformojeni
- Mbështetet vetëm kur versioni i synuar Core ML është 2, nuk mbështetet kur synohet Core ML 3.
- ResizeBilinear
- SoftMax
- Tanh
- TransposeConv
- Peshat duhet të jenë konstante.
Feedback
Për probleme, ju lutemi krijoni një problem GitHub me të gjitha detajet e nevojshme për t'u riprodhuar.
FAQ
- A delegon CoreML mbështetjen e kthimit në CPU nëse një grafik përmban funksione të pambështetura?
- po
- A funksionon delegimi i CoreML në Simulatorin iOS?
- po. Biblioteka përfshin objektivat x86 dhe x86_64, kështu që mund të funksionojë në një simulator, por nuk do të shihni rritje të performancës mbi CPU.
- A e mbështet MacOS-in delegatët e LiteRT dhe CoreML?
- LiteRT testohet vetëm në iOS, por jo në MacOS.
- A mbështeten funksionet e personalizuara LiteRT?
- Jo, delegati i CoreML nuk mbështet funksionet e personalizuara dhe ata do të kthehen në CPU.