此页面由 Cloud Translation API 翻译。
Switch to English

Delegat Tensorflow Lite Core ML

Delegat TensorFlow Lite Core ML umożliwia uruchamianie modeli TensorFlow Lite w środowisku Core ML , co skutkuje szybszym wnioskiem 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 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 obecnie obsługuje modele pływające (FP32 i FP16).

Wypróbowanie delegata Core ML na własnym modelu

Delegat Core ML jest już zawarty w nocnym wydaniu TensorFlow lite CocoaPods. Aby korzystać z delegata Core ML, zmień wersję TensorFlow lite pod ( TensorflowLiteC for C API i TensorFlowLiteSwift for Swift) na 0.0.1-nightly w swoim Podfile i dołącz CoreML

target 'YourProjectName'
  # pod 'TensorFlowLiteSwift'
  pod 'TensorFlowLiteSwift/CoreML', '~> 0.0.1-nightly'

LUB

target 'YourProjectName'
  # pod 'TensorFlowLiteSwift'
  pod 'TensorFlowLiteSwift', '~> 0.0.1-nightly', :subspecs => ['CoreML']

Szybki

Zainicjuj interpreter TensorFlow Lite z delegatem Core ML.

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

Delegat Core ML używa interfejsu API języka C dla kodów Objective-C.

Krok 1. Dołącz coreml_delegate.h .

#include "tensorflow/lite/experimental/delegates/coreml/coreml_delegate.h"

Krok 2. Utwórz delegata i zainicjuj tłumacza TensorFlow Lite

Po zainicjowaniu opcji interpretera wywołaj TfLiteInterpreterOptionsAddDelegate z zainicjowanym delegatem Core ML, aby zastosować delegata. Następnie zainicjuj interpreter utworzoną opcją.

// 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 ...

Krok 3. Usuń zasoby, gdy nie są już używane.

Dodaj ten kod do sekcji, w której dealloc delegata (np. dealloc klasy).

TfLiteInterpreterDelete(interpreter);
TfLiteCoreMlDelegateDelete(delegate);
TfLiteModelDelete(model);

Najlepsze praktyki

Używanie delegata Core ML na urządzeniach bez silnika Neural Engine

Domyślnie delegat Core ML zostanie utworzony tylko wtedy, gdy urządzenie ma silnik 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żna 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

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 jest utworzony, można alternatywnie nadal używać delegata Metal, aby uzyskać korzyści 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

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 jego dostępności Neural Engine. Zobacz kod, aby uzyskać więcej szczegółów. Alternatywnie możesz zaimplementować własny zestaw urządzeń denylist, 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, gdy zostanie przekonwertowany na specyfikację 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 delegata na starszą wersję.

Obsługiwane operacje

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

  • Dodaj
    • Nadawane są tylko niektóre kształty. W układzie tensorów Core ML można rozgłaszać następujące kształty tensorów. [B, C, H, W] , [B, C, 1, 1] , [B, 1, H, W] , [B, 1, 1, 1] .
  • AveragePool2D
  • Concat
    • Konkatenację należy przeprowadzić wzdłuż osi kanału.
  • Conv2D
    • Wagi i odchylenie powinny być stałe.
  • DepthwiseConv2D
    • Wagi i odchylenie powinny być stałe.
  • FullyConnected (inaczej Dense lub InnerProduct)
    • Wagi i odchylenie (jeśli są obecne) powinny być stałe.
    • Obsługuje tylko pojedyncze przypadki. Wymiary wejściowe powinny wynosić 1, z wyjątkiem ostatniego wymiaru.
  • Trudne
  • Logistyka (inaczej Sigmoid)
  • MaxPool2D
  • MirrorPad
    • Obsługiwane jest tylko wejście 4D z trybem REFLECT . Dopełnienie powinno być stałe i jest dozwolone tylko dla wymiarów H i W.
  • Mul
    • Nadawane są tylko niektóre kształty. W układzie tensorów Core ML można rozgłaszać następujące kształty tensorów. [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, nie jest obsługiwana w przypadku platformy Core ML 3.
  • ResizeBilinear
  • SoftMax
  • Tanh
  • TransposeConv
    • Wagi powinny być stałe.

Informacje zwrotne

W przypadku problemów utwórz zgłoszenie na GitHub ze wszystkimi szczegółami niezbędnymi 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 iOS?
    • Tak. Biblioteka zawiera cele x86 i x86_64, dzięki czemu może działać na symulatorze, ale nie zobaczysz wzrostu wydajności w porównaniu z procesorem.
  • Czy delegat TensorFlow Lite i CoreML obsługuje 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 będzie zastępował procesor.

Pszczoła