Delegat Tensorflow Lite Core ML

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] .
  • Ś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.
  • 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] .
  • 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