Delegat Tensorflow Lite Core ML

Delegat TensorFlow Lite Core ML umożliwia uruchamianie modeli TensorFlow Lite na platformie Core ML , co skutkuje szybszym wnioskowaniem modelu 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 przełączy się na CPU.
  • Domyślnie delegat Core ML będzie włączony tylko na urządzeniach z A12 SoC i nowszym (iPhone Xs i nowsze), aby używać Neural Engine do szybszego wnioskowania. Jeśli chcesz używać delegata Core ML również na starszych urządzeniach, zapoznaj się z najlepszymi praktykami

Obsługiwane modele

Delegat Core ML obsługuje obecnie modele zmiennoprzecinkowe (FP32 i FP16).

Wypróbowanie delegata Core ML na własnym modelu

Delegat Core ML jest już zawarty w nocnej wersji CocoaPods TensorFlow lite. Aby użyć delegata Core ML, zmień swój moduł TensorFlow lite tak, aby zawierał subspec 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']

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 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 Neural Engine

Domyślnie delegat Core ML zostanie utworzony tylko wtedy, gdy urządzenie ma Neural Engine 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 języku 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 rezerwy.

Gdy delegat Core ML nie zostanie utworzony, alternatywnie możesz nadal używać delegata Metal , aby uzyskać korzyści związane z 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 urządzenia urządzenia (np. iPhone11,1) w celu określenia jego dostępności Neural Engine. Zobacz kod, aby uzyskać więcej szczegółów. Alternatywnie możesz zaimplementować własny zestaw urządzeń z listą odrzuconych za pomocą innych bibliotek, takich jak DeviceKit .

Korzystanie ze starszej wersji Core ML

Chociaż system iOS 13 obsługuje technologię Core ML 3, model może działać lepiej, gdy zostanie przekonwertowany ze specyfikacją modelu Core ML 2. Docelowa wersja konwersji jest domyślnie ustawiona na najnowszą wersję, ale można to zmienić, ustawiając coreMLVersion (w języku Swift, coreml_version w C API) w opcji delegata na starszą wersję.

Obsługiwane operacje

Następujące operacje są obsługiwane przez delegata Core ML.

  • Dodać
    • Tylko niektóre kształty nadają się do nadawania. W układzie tensora Core ML można rozgłaszać następujące kształty tensora. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Średnia pula2D
  • Concat
    • Konkatenację należy wykonać wzdłuż osi kanału.
  • Conv2D
    • Wagi i odchylenie powinny być stałe.
  • DepthwiseConv2D
    • Wagi i odchylenie powinny być stałe.
  • W pełni połączony (inaczej gęsty lub wewnętrzny produkt)
    • Wagi i odchylenie (jeśli są obecne) powinny być stałe.
    • Obsługuje tylko przypadek pojedynczej partii. Wymiary wejściowe powinny wynosić 1, z wyjątkiem ostatniego wymiaru.
  • Hardswish
  • Logistyka (aka Sigmoid)
  • Max Pool2D
  • Podkładka lustrzana
    • Obsługiwane jest tylko wejście 4D w trybie REFLECT . Dopełnienie powinno być stałe i jest dozwolone tylko dla wymiarów H i W.
  • Mul
    • Tylko niektóre kształty nadają się do nadawania. W układzie tensora Core ML można rozgłaszać następujące kształty tensora. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • Pad i PadV2
    • Obsługiwane jest tylko wejście 4D. Dopełnienie powinno być stałe i jest dozwolone tylko dla wymiarów H i W.
  • Relu
  • ReluN1To1
  • Relu6
  • Przefasonować
    • Obsługiwane tylko wtedy, gdy docelowa wersja Core ML to 2, nieobsługiwane w przypadku kierowania na Core ML 3.
  • Zmień rozmiarBilinear
  • SoftMax
  • Tanha
  • 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.

FAQ

  • Czy delegat CoreML obsługuje powrót do procesora, jeśli wykres zawiera nieobsługiwane operacje?
    • TAk
  • Czy delegat CoreML działa w symulatorze systemu iOS?
    • TAk. Biblioteka zawiera cele x86 i x86_64, więc może działać na symulatorze, ale nie zobaczysz wzrostu wydajności w stosunku do procesora.
  • 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 operacji niestandardowych i nastąpi powrót do procesora CPU.

Pszczoła