Wybierz operatory TensorFlow

Ponieważ biblioteka wbudowanych operatorów TensorFlow Lite obsługuje ograniczoną liczbę operatorów TensorFlow Lite, nie każdy model można konwertować. Szczegółowe informacje znajdziesz w sekcji o zgodności operatorów.

Aby umożliwić konwersję, użytkownicy mogą włączyć użycie określonych operacji TensorFlow w modelu TensorFlow Lite. Uruchamianie modeli TensorFlow Lite z operacjami TensorFlow wymaga jednak pobrania podstawowego środowiska wykonawczego TensorFlow, co zwiększa rozmiar binarny interpretera TensorFlow Lite. W przypadku Androida można tego uniknąć, selektywnie tworząc tylko wymagane operacje Tensorflow. Szczegółowe informacje znajdziesz w artykule o zmniejszaniu rozmiaru pliku binarnego.

Ten dokument wyjaśnia, jak przekonwertować i run model TensorFlow Lite zawierający operacje TensorFlow na wybranej platformie. Omawiamy również dane dotyczące wydajności i rozmiaru oraz znane ograniczenia.

Konwertowanie modelu

Poniższy przykład pokazuje, jak wygenerować model TensorFlow Lite z wybranymi operacjami TensorFlow.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Uruchom wnioskowanie

Jeśli używasz modelu TensorFlow Lite, który został przekonwertowany z obsługą wybranych operacji TensorFlow, klient musi też użyć środowiska wykonawczego TensorFlow Lite, które zawiera niezbędną bibliotekę operacji TensorFlow.

AAR na Androida

Aby zmniejszyć rozmiar pliku binarnego, utwórz własne pliki AAR zgodnie z instrukcjami podanymi w następnej sekcji. Jeśli rozmiar pliku binarnego nie stanowi poważnego problemu, zalecamy użycie gotowego AAR z operacjami TensorFlow hostowanymi w MavenCentral.

Możesz to określić w zależnościach build.gradle, dodając je razem ze standardowym AAR TensorFlow Lite w ten sposób:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

Aby korzystać z nocnych zrzutów, musisz dodać repozytorium zrzutów Sonatype.

Po dodaniu zależności należy automatycznie zainstalować na grafie, który jej wymaga, delegat niezbędny do obsługi operacji TensorFlow na wykresie.

Uwaga: zależność operacji TensorFlow jest stosunkowo duża, więc prawdopodobnie lepiej będzie odfiltrować z pliku .gradle niepotrzebne interfejsy ABI x86, konfigurując abiFilters.

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

Tworzenie aplikacji AAR na Androida

Aby zmniejszyć rozmiar pliku binarnego lub zmniejszyć inne zaawansowane przypadki, możesz też ręcznie utworzyć bibliotekę. Zakładając, że działające środowisko kompilacji TensorFlow Lite, utwórz plik AAR na Androida, używając wybranych operacji TensorFlow w następujący sposób:

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

Spowoduje to wygenerowanie pliku AAR bazel-bin/tmp/tensorflow-lite.aar na potrzeby wbudowanych i niestandardowych operacji TensorFlow Lite oraz wygenerowanie pliku AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar na potrzeby operacji TensorFlow. Jeśli nie masz działającego środowiska kompilacji, możesz też skompilować pliki powyżej za pomocą Dockera.

Następnie możesz zaimportować pliki AAR bezpośrednio do projektu lub opublikować niestandardowe pliki AAR w lokalnym repozytorium Maven:

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar

Na koniec w build.gradle aplikacji sprawdź zależność mavenLocal() i zastąp standardową zależność TensorFlow Lite tą, która obsługuje wybrane operacje TensorFlow:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

Korzystanie z CocoaPods

TensorFlow Lite udostępnia na noc gotowe, wybrane operacje TF CocoaPods dla arm64, z których można korzystać razem z CocoaPods TensorFlowLiteSwift lub TensorFlowLiteObjC.

Uwaga: jeśli w symulatorze x86_64 musisz użyć wybranych operacji TF, możesz samodzielnie utworzyć platformę operacji. Więcej informacji znajdziesz w sekcji Korzystanie z Bazel + Xcode.

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

Po uruchomieniu pod install musisz udostępnić dodatkową flagę tagu łączącego, aby wymusić wczytanie w projekcie wybranej platformy operacji TF. W projekcie Xcode otwórz Build Settings -> Other Linker Flags i dodaj:

W przypadku wersji 2.9.0 lub nowszej:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

Wersje < 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

Po wykonaniu tych czynności w aplikacji na iOS powinno być możliwe uruchamianie dowolnych modeli przekonwertowanych za pomocą standardu SELECT_TF_OPS. Możesz np. zmodyfikować aplikację klasyfikacji obrazów na iOS, aby przetestować wybraną funkcję operacji TF.

  • Zastąp plik modelu plikiem przekonwertowanym z włączoną funkcją SELECT_TF_OPS.
  • Dodaj zależność TensorFlowLiteSelectTfOps do Podfile zgodnie z instrukcjami.
  • Dodaj podaną wyżej flagę tagu łączącego.
  • Uruchom przykładową aplikację i sprawdź, czy model działa prawidłowo.

Korzystanie z Bazel + Xcode

TensorFlow Lite z wybranymi operacjami TensorFlow na iOS można tworzyć za pomocą Bazel. Najpierw wykonaj instrukcje kompilacji na iOS, aby prawidłowo skonfigurować obszar roboczy Bazel i plik .bazelrc.

Po skonfigurowaniu obszaru roboczego z włączoną obsługą iOS możesz użyć poniższego polecenia, aby utworzyć platformę dodatków do obsługi plików TF, którą można dodać do zwykłej TensorFlowLiteC.framework. Pamiętaj, że wybranej platformy operacji TF nie można utworzyć pod kątem architektury i386, więc musisz wyraźnie podać listę architektur docelowych z wyłączeniem i386.

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

Spowoduje to wygenerowanie platformy w katalogu bazel-bin/tensorflow/lite/ios/. Możesz dodać tę nową platformę do projektu Xcode, wykonując podobne czynności opisane w sekcji Ustawienia projektu Xcode w przewodniku po kompilacji na iOS.

Po dodaniu platformy do projektu aplikacji musisz w nim określić dodatkową flagę tagu łączącego, aby wymusić wczytanie ramki operacji TF. W projekcie Xcode przejdź do Build Settings -> Other Linker Flags i dodaj:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

Kod C/C++

Jeśli do tworzenia interpretera TensorFlow Lite używasz usługi Bazel lub CMake, możesz włączyć przekazywanie dostępu Flex, łącząc z biblioteką delegowaną TensorFlow Lite Flex. Możesz ją utworzyć w Bazelu za pomocą poniższego polecenia.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

To polecenie generuje poniższe zasoby wspólne w bazel-bin/tensorflow/lite/delegates/flex.

Platforma Nazwa biblioteki
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

Pamiętaj, że niezbędne TfLiteDelegate zostaną zainstalowane automatycznie podczas tworzenia interpretera w czasie działania, o ile biblioteka udostępniona jest połączona. Nie jest konieczne jawne instalowanie instancji z przekazanym dostępem – jest to zwykle wymagane w przypadku innych typów przedstawicieli.

Uwaga: ta funkcja jest dostępna od wersji 2.7.

Python

Biblioteka TensorFlow Lite z wybranymi operacjami TensorFlow zostanie zainstalowana automatycznie z pakietem pip TensorFlow. Możesz też zainstalować tylko pakiet pip pip TensorFlow Lite Interpreter.

Wskaźniki

Wydajność

Jeśli używasz zarówno wbudowanych, jak i wybranych operacji TensorFlow, w konwertowanym modelu dostępne będą wszystkie optymalizacje TensorFlow Lite i zoptymalizowane operacje wbudowane.

W tabeli poniżej opisano średni czas wnioskowania w ramach MobileNet na Pixelu 2. Podane czasy to średnio 100 uruchomień. Te cele utworzono dla Androida z wykorzystaniem tych flag: --config=android_arm64 -c opt.

Kompilacja Czas (milisekundy)
Tylko operacje wbudowane (TFLITE_BUILTIN) 260,7
Używanie tylko operacji TF (SELECT_TF_OPS) 264,5

Wartość atrybutu size pliku binarnego

W tabeli poniżej opisano rozmiar plików binarnych TensorFlow Lite w każdej kompilacji. Te cele zostały utworzone dla Androida przy użyciu --config=android_arm -c opt.

Kompilacja Rozmiar pliku binarnego C++ Rozmiar pliku APK na Androida
Tylko operacje wbudowane 796 KB 561 KB
Wbudowane operacje + operacje TF 23,0 MB 8,0 MB
Operacje wbudowane + operacje TF (1) 4,1 MB 1,8 MB

(1) Te biblioteki są selektywnie tworzone pod kątem modelu i3d-kinetics-400 z 8 wbudowanymi operacjami TFLite i 3 operacjami Tensorflow. Więcej informacji znajdziesz w sekcji Zmniejszanie rozmiaru pliku binarnego TensorFlow Lite.

Znane ograniczenia

  • Nieobsługiwane typy: niektóre operacje TensorFlow mogą nie obsługiwać pełnego zestawu typów danych wejściowych/wyjściowych, które są zwykle dostępne w TensorFlow.

Aktualizacje

  • Wersja 2.6
    • Ulepszono obsługę operatorów opartych na atrybutach GraphDef i inicjowania zasobów HashTable.
  • Wersja 2.5
  • Wersja 2.4
    • Poprawiła się zgodność z przedstawicielami z akceleracją sprzętową