Delegat TensorFlow Lite Core ML umożliwia uruchamianie modeli TensorFlow Lite w środowisku Core ML , co skutkuje szybszym wnioskowaniem o modelach na urządzeniach z systemem iOS.
Obsługiwane wersje i urządzenia iOS:
- iOS 12 i nowsze. W starszych wersjach systemu iOS delegat Core ML automatycznie powróci do procesora.
- Domyślnie delegowanie Core ML będzie włączone tylko na urządzeniach z A12 SoC i nowszych (iPhone Xs i nowsze), aby używać Neural Engine w celu szybszego wnioskowania. Jeśli chcesz korzystać z delegowania Core ML także na starszych urządzeniach, zapoznaj się z najlepszymi praktykami
Obsługiwane modele
Delegat Core ML obsługuje obecnie modele float (FP32 i FP16).
Wypróbowanie delegata Core ML na własnym modelu
Delegat Core ML jest już uwzględniony w nocnej wersji TensorFlow lite CocoaPods. Aby korzystać z delegata Core ML, zmień moduł TensorFlow Lite Pod tak, aby zawierał podspecyfikację CoreML
w swoim 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']
Szybki
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) }
Cel 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 (do wersji 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);
Najlepsze praktyki
Korzystanie z delegata Core ML na urządzeniach bez silnika neuronowego
Domyślnie delegat Core ML zostanie utworzony tylko wtedy, gdy urządzenie ma silnik neuronowy i zwróci null
, jeśli delegat nie zostanie utworzony. Jeśli chcesz uruchomić delegata Core ML w innych środowiskach (na przykład symulatorze), przekaż .all
jako opcję podczas tworzenia delegata w Swift. W C++ (i Objective-C) możesz przekazać TfLiteCoreMlDelegateAllDevices
. Poniższy przykład pokazuje, jak to zrobić:
Szybki
var options = CoreMLDelegate.Options() options.enabledDevices = .all let coreMLDelegate = CoreMLDelegate(options: options)! let interpreter = try Interpreter(modelPath: modelPath, delegates: [coreMLDelegate])
Cel 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 delegata Metal(GPU) jako rozwiązania awaryjnego.
Jeśli delegat Core ML nie zostanie utworzony, alternatywnie możesz nadal używać delegata Metal , aby uzyskać korzyści w zakresie wydajności. Poniższy przykład pokazuje, jak to zrobić:
Szybki
var delegate = CoreMLDelegate() if delegate == nil { delegate = MetalDelegate() // Add Metal delegate options if necessary. } let interpreter = try Interpreter(modelPath: modelPath, delegates: [delegate!])
Cel 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 delegata odczytuje identyfikator maszyny urządzenia (np. iPhone11,1) w celu określenia dostępności silnika neuronowego. Zobacz kod , aby uzyskać więcej szczegółów. Alternatywnie możesz zaimplementować własny zestaw urządzeń z listą odrzuconych, korzystając z innych bibliotek, takich jak DeviceKit .
Korzystanie ze starszej wersji Core ML
Chociaż iOS 13 obsługuje Core ML 3, model może działać lepiej, jeśli zostanie przekonwertowany przy użyciu specyfikacji modelu Core ML 2. Docelowa wersja konwersji jest domyślnie ustawiona na najnowszą wersję, ale można to zmienić, ustawiając coreMLVersion
(w Swift, coreml_version
w C API) w opcji delegowania na starszą wersję.
Obsługiwane operacje
Następujące operacje są obsługiwane przez delegata Core ML.
- Dodać
- Nadawane są tylko niektóre kształty. W układzie tensora Core ML możliwe jest nadawanie następujących kształtów tensora.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Nadawane są tylko niektóre kształty. W układzie tensora Core ML możliwe jest nadawanie następujących kształtów tensora.
- Średnia pula2D
- Połącz
- Łączenie należy wykonać wzdłuż osi kanału.
- Konw2D
- Wagi i odchylenie powinny być stałe.
- DepthwiseConv2D
- Wagi i odchylenie powinny być stałe.
- W pełni połączone (aka Dense lub InnerProduct)
- Wagi i odchylenie (jeśli występują) powinny być stałe.
- Obsługuje tylko przypadki jednopartyjne. Wymiary wejściowe powinny wynosić 1, z wyjątkiem ostatniego wymiaru.
- Hardswish
- Logistyka (aka Sigmoid)
- MaxPool2D
- MirrorPad
- Obsługiwane jest tylko wejście 4D w trybie
REFLECT
. Wypełnienie powinno być stałe i jest dozwolone tylko w przypadku wymiarów H i W.
- Obsługiwane jest tylko wejście 4D w trybie
- Muł
- Nadawane są tylko niektóre kształty. W układzie tensora Core ML możliwe jest nadawanie następujących kształtów tensora.
[B, C, H, W]
,[B, C, 1, 1]
,[B, 1, H, W]
,[B, 1, 1, 1]
.
- Nadawane są tylko niektóre kształty. W układzie tensora Core ML możliwe jest nadawanie następujących kształtów tensora.
- Pad i PadV2
- Obsługiwane jest tylko wejście 4D. Wypełnienie powinno być stałe i jest dozwolone tylko w przypadku wymiarów H i W.
- Relu
- ReluN1To1
- Relu6
- Przefasonować
- Obsługiwane tylko wtedy, gdy docelowa wersja Core ML to 2, nie jest obsługiwana w przypadku platformy docelowej Core ML 3.
- Zmień rozmiarDwuliniowy
- SoftMax
- Tanh
- Transpozycja konw
- Wagi powinny być stałe.
Informacja zwrotna
W przypadku problemów utwórz zgłoszenie w serwisie GitHub ze wszystkimi niezbędnymi szczegółami do odtworzenia.
Często zadawane pytania
- Czy delegat CoreML obsługuje rezerwę na procesor, jeśli wykres zawiera nieobsługiwane operacje?
- Tak
- Czy delegat CoreML działa na symulatorze iOS?
- Tak. Biblioteka zawiera cele x86 i x86_64, więc można ją uruchomić na symulatorze, ale nie zauważysz wzrostu wydajności w porównaniu z procesorem.
- Czy delegat TensorFlow Lite i CoreML obsługuje system MacOS?
- TensorFlow Lite jest testowany tylko na iOS, ale nie na MacOS.
- Czy obsługiwane są niestandardowe operacje TF Lite?
- Nie, delegat CoreML nie obsługuje niestandardowych operacji i powróci do procesora.
Pszczoła
- Delegat Core ML Swift API
- Core ML delegat C API
- Można tego użyć w przypadku kodów Objective-C. ~~~