Przedstawiciel LiteRT Core ML umożliwia uruchamianie modeli LiteRT Core ML Framework, pozwala szybciej wnioskować na podstawie modeli na urządzeniach z iOS.
Obsługiwane wersje iOS i urządzenia:
- z systemem iOS 12 lub nowszym. W starszych wersjach iOS osoba, której przekazano dostęp do Core ML, automatycznie przełącza się na procesor.
- Domyślnie funkcja przekazywania dostępu Core ML będzie włączona tylko na urządzeniach z układem SoC A12 a nowsze modele (iPhone X i nowsze), aby korzystać z mechanizmu neuronowego do szybszego wnioskowania. Jeśli chcesz przekazywać dostęp do Core ML także na starszych urządzeniach, zapoznaj się z artykułem sprawdzone metody
Obsługiwane modele
Przedstawiciel Core ML obsługuje obecnie modele zmiennoprzecinkowe (FP32 i FP16).
Wypróbowywanie przedstawiciela Core ML we własnym modelu
Osoba, której przekazano dostęp do Core ML, jest już uwzględniona w conocnej wersji LiteRT
CocoaPods. Aby użyć przedstawiciela Core ML, zmień pod LiteRT, tak aby zawierał
podtyp CoreML
w Podfile
.
target 'YourProjectName'
pod 'TensorFlowLiteSwift/CoreML', '~> 2.4.0' # Or TensorFlowLiteObjC/CoreML
LUB
# 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:e&rror]; if (error != nil) { /* Error handling... */ } if (![interpreter allocateTensorsWithError:e&rror]) { /* Error handling... */ } if (error != nil) { /* Error handling... */ } // Run inference ...
C (do 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);
Sprawdzone metody
Korzystanie z przekazywania dostępu Core ML na urządzeniach bez mechanizmu neuronowego
Domyślnie przedstawiciela Core ML jest tworzony tylko wtedy, gdy urządzenie ma neuronowe
wyszukiwarki i zwróci null
, jeśli przedstawiciel nie został utworzony. Jeśli chcesz
uruchom przekazywanie dostępu Core ML w innych środowiskach (np. w symulatorze), przekaż .all
jako opcji podczas tworzenia przedstawicieli w Swift. W języku C++ (i Objective-C) możesz
wyprzedź TfLiteCoreMlDelegateAllDevices
. Jak to zrobić:
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
Używanie delegacji metalu(GPU) jako funkcji zastępczej.
Jeśli przedstawiciel Core ML nie zostanie utworzony, nadal możesz używać Metal delegata, aby uzyskać i zwiększa wydajność. Jak to zrobić:
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
Logika tworzenia przekazywania dostępu odczytuje identyfikator urządzenia z urządzenia (np. iPhone11,1) w celu i określić jego dostępność Neural Engine. Zobacz kod . Możesz też wdrożyć własny zestaw list odrzuconych na urządzeniach korzystających z innych bibliotek, takich jak DeviceKit.
Korzystanie ze starszej wersji Core ML
Chociaż iOS 13 obsługuje Core ML 3, ten model może działać lepiej,
przekonwertowano zgodnie ze specyfikacją modelu Core ML 2. Docelowa wersja konwersji to
jest domyślnie ustawiona na najnowszą wersję, ale można to zmienić w
coreMLVersion
(w Swift, coreml_version
w C API) w opcji przekazywania dostępu do
starszej wersji.
Obsługiwane operacje
Przedstawiciel Core ML obsługuje te operacje.
- Dodaj
- Można transmitować tylko niektóre kształty. W układzie tensorowym Core ML
następujące kształty tensorów są transmitowane.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Można transmitować tylko niektóre kształty. W układzie tensorowym Core ML
następujące kształty tensorów są transmitowane.
- ŚredniaPola2D
- Concat
- Łączenie należy wprowadzić wzdłuż osi kanału.
- Konw.2D
- Wagi i odchylenie powinny być stałe.
- DepthwiseConv2D
- Wagi i odchylenie powinny być stałe.
- Pełna integracja (inaczej gęste lub InnerProduct)
- Wagi i odchylenia (jeśli występują) powinny być stałe.
- Obsługuje tylko zgłoszenia jednoskładnikowe. Wymiary wejściowe powinny wynosić 1, oprócz ostatniego wymiaru.
- Hardswish
- Logistyka (Sigmoid)
- MaxPool2D,
- MirrorPad
- Obsługiwane jest tylko wejście 4D w trybie
REFLECT
. Dopełnienie powinno być jest stała i jest dozwolona tylko w przypadku wymiarów H i W.
- Obsługiwane jest tylko wejście 4D w trybie
- Mul
- Można transmitować tylko niektóre kształty. W układzie tensorowym Core ML
następujące kształty tensorów są transmitowane.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Można transmitować tylko niektóre kształty. W układzie tensorowym Core ML
następujące kształty tensorów są transmitowane.
- Pad i PadV2
- Obsługiwane jest tylko wejście 4D. Dopełnienie powinno być stałe i ma wyłącznie w wymiarach H i W.
- Relu
- ReluN1To1
- Relu6
- Zmień kształt
- Obsługiwane tylko wtedy, gdy docelowa wersja Core ML to 2. Nieobsługiwane, gdy: kierowania na Core ML 3.
- ResizeBilinear
- SoftMax
- Tanh
- TransposeConv
- Wagi powinny być stałe.
Prześlij opinię
W przypadku problemów utwórz GitHub ze wszystkimi szczegółami niezbędnymi do jego odtworzenia.
Najczęstsze pytania
- Czy CoreML deleguje obsługę zastępczą do procesora, jeśli wykres zawiera nieobsługiwany
?
- Tak
- Czy dostęp do CoreML działa w symulatorze iOS?
- Tak. Biblioteka zawiera środowiska docelowe x86 i x86_64, więc może działać jak w symulatorze, ale nie zauważysz wzrostu wydajności CPU.
- Czy LiteRT i CoreML są obsługiwane w systemie macOS?
- LiteRT jest testowane tylko na iOS, ale nie na macOS.
- Czy niestandardowe operacje LiteRT są obsługiwane?
- Nie. Osoba, której przekazano dostęp do CoreML, nie obsługuje operacji niestandardowych i będzie w zastępstwie CPU.