Delegat LiteRT Core ML

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

Interfejsy API