Ponieważ wbudowana biblioteka operatorów TensorFlow Lite obsługuje tylko ograniczoną liczbę operatorów TensorFlow, nie każdy model można konwertować. Aby uzyskać szczegółowe informacje, zobacz kompatybilność operatorów .
Aby umożliwić konwersję, użytkownicy mogą włączyć korzystanie z niektórych operacji TensorFlow w swoim modelu TensorFlow Lite. Jednak uruchamianie modeli TensorFlow Lite z operacjami TensorFlow wymaga wciągnięcia podstawowego środowiska wykonawczego TensorFlow, co zwiększa rozmiar binarny interpretera TensorFlow Lite. W przypadku Androida możesz tego uniknąć, selektywnie budując tylko wymagane operacje Tensorflow. Aby poznać szczegóły, zobacz Zmniejszanie rozmiaru binarnego .
W tym dokumencie opisano, jak konwertować i uruchamiać model TensorFlow Lite zawierający operacje TensorFlow na wybranej platformie. Omówiono także metryki wydajności i rozmiaru oraz znane ograniczenia .
Konwertuj model
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
W przypadku korzystania z modelu TensorFlow Lite, który został przekonwertowany z obsługą wybranych operacji TensorFlow, klient musi również użyć środowiska wykonawczego TensorFlow Lite, które zawiera niezbędną bibliotekę operacji TensorFlow.
Android AAR
Aby zmniejszyć rozmiar pliku binarnego, utwórz własne niestandardowe pliki AAR zgodnie z instrukcjami w następnej sekcji . Jeśli rozmiar pliku binarnego nie stanowi dużego problemu, zalecamy użycie wstępnie skompilowanego AAR z operacjami TensorFlow hostowanymi w MavenCentral .
Możesz to określić w zależnościach build.gradle
dodając je obok standardowego AAR TensorFlow Lite w następujący 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 migawek, upewnij się, że dodałeś repozytorium migawek Sonatype .
Po dodaniu zależności delegat niezbędny do obsługi operacji TensorFlow wykresu powinien zostać automatycznie zainstalowany dla wykresów, które ich wymagają.
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
Tworzenie Androida AAR
W celu zmniejszenia rozmiaru pliku binarnego lub w innych zaawansowanych przypadkach można także zbudować bibliotekę ręcznie. Zakładając działające środowisko kompilacji TensorFlow Lite , zbuduj Android AAR z wybranymi operacjami 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
dla wbudowanych i niestandardowych operacji TensorFlow Lite; i wygeneruj plik AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar
dla TensorFlow ops. Jeśli nie masz działającego środowiska kompilacji, możesz także zbudować powyższe pliki za pomocą dockera .
Stamtąd możesz zaimportować pliki AAR bezpośrednio do swojego 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
swojej aplikacji upewnij się, że masz zależność mavenLocal()
i zamień standardową zależność TensorFlow Lite na 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 zapewnia conocne wstępnie zbudowane wybrane CocoaPods TF ops dla arm64
, na których możesz polegać wraz z TensorFlowLiteSwift
lub TensorFlowLiteObjC
CocoaPods.
# In your Podfile target:
pod 'TensorFlowLiteSwift' # or 'TensorFlowLiteObjC'
pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'
Po uruchomieniu pod install
musisz podać dodatkową flagę linkera, aby wymusić załadowanie wybranej platformy TF ops do swojego projektu. W swoim projekcie Xcode przejdź do Build Settings
-> Other Linker Flags
i dodaj:
Dla wersji >= 2.9.0:
-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps
Dla wersji < 2.9.0:
-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps
Powinieneś wtedy móc uruchomić dowolne modele przekonwertowane za pomocą SELECT_TF_OPS
w swojej aplikacji na iOS. Na przykład możesz zmodyfikować aplikację Image Classification na iOS, aby przetestować wybraną funkcję TF ops.
- Zastąp plik modelu plikiem przekonwertowanym z włączoną opcją
SELECT_TF_OPS
. - Dodaj zależność
TensorFlowLiteSelectTfOps
doPodfile
zgodnie z instrukcją. - Dodaj dodatkową flagę linkera jak powyżej.
- Uruchom przykładową aplikację i sprawdź, czy model działa poprawnie.
Używanie Bazela + Xcode
TensorFlow Lite z wybranymi operacjami TensorFlow dla iOS można zbudować przy użyciu Bazela. Najpierw postępuj zgodnie z instrukcjami kompilacji iOS , aby poprawnie skonfigurować obszar roboczy Bazel i plik .bazelrc
.
Po skonfigurowaniu obszaru roboczego z włączoną obsługą systemu iOS możesz użyć następującego polecenia, aby zbudować wybraną platformę dodatku TF ops, którą można dodać do zwykłego TensorFlowLiteC.framework
. Należy pamiętać, że frameworku Select TF ops nie można zbudować dla architektury i386
, dlatego należy jawnie 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 frameworka w katalogu bazel-bin/tensorflow/lite/ios/
. Możesz dodać tę nową platformę do swojego projektu Xcode, wykonując podobne kroki opisane w sekcji Ustawienia projektu Xcode w przewodniku kompilacji systemu iOS.
Po dodaniu struktury do projektu aplikacji należy określić dodatkową flagę linkera w projekcie aplikacji, aby wymusić załadowanie wybranej struktury operacji TF. W swoim projekcie Xcode przejdź do Build Settings
-> Other Linker Flags
i dodaj:
-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>
C/C++
Jeśli używasz Bazela lub CMake do kompilowania interpretera TensorFlow Lite, możesz włączyć delegata Flex, łącząc bibliotekę współdzieloną delegata TensorFlow Lite Flex. Możesz go zbudować za pomocą Bazela za pomocą następującego polecenia.
bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex
To polecenie generuje następującą bibliotekę współdzieloną w bazel-bin/tensorflow/lite/delegates/flex
.
Platforma | Nazwa biblioteki |
---|---|
Linuksa | libtensorflowlite_flex.so |
macOS | libtensorflowlite_flex.dylib |
Okna | tensorflowlite_flex.dll |
Należy pamiętać, że niezbędny TfLiteDelegate
zostanie zainstalowany automatycznie podczas tworzenia interpretera w czasie wykonywania, o ile biblioteka współdzielona jest połączona. Nie jest konieczne jawne instalowanie instancji delegata, jak jest to zwykle wymagane w przypadku innych typów delegatów.
Pyton
TensorFlow Lite z wybranymi operacjami TensorFlow zostanie zainstalowany automatycznie z pakietem pip TensorFlow . Możesz także zdecydować się na zainstalowanie tylko pakietu pip Interpretera TensorFlow Lite .
Metryka
Wydajność
W przypadku korzystania z kombinacji wbudowanych i wybranych operacji TensorFlow, wszystkie te same optymalizacje TensorFlow Lite i zoptymalizowane operacje wbudowane będą dostępne i możliwe do użycia z przekonwertowanym modelem.
W poniższej tabeli opisano średni czas potrzebny na uruchomienie wnioskowania w MobileNet na Pixelu 2. Podane czasy to średnia ze 100 uruchomień. Te cele zostały zbudowane dla Androida przy użyciu flag: --config=android_arm64 -c opt
.
Zbudować | Czas (milisekundy) |
---|---|
Tylko wbudowane operacje ( TFLITE_BUILTIN ) | 260,7 |
Używanie tylko operacji TF ( SELECT_TF_OPS ) | 264,5 |
Rozmiar binarny
W poniższej tabeli opisano rozmiar binarny TensorFlow Lite dla każdej kompilacji. Te cele zostały zbudowane dla Androida przy użyciu --config=android_arm -c opt
.
Zbudować | Rozmiar binarny C++ | Rozmiar APK na Androida |
---|---|---|
Tylko wbudowane operacje | 796 kB | 561 kB |
Wbudowane operacje + operacje TF | 23,0 MB | 8,0MB |
Wbudowane operacje + operacje TF (1) | 4,1 MB | 1,8 MB |
(1) Biblioteki te są budowane selektywnie dla modelu i3d-kinetics-400 z 8 wbudowanymi operacjami TFLite i 3 operacjami Tensorflow. Aby uzyskać więcej informacji, zobacz sekcję Zmniejszanie rozmiaru binarnego TensorFlow Lite .
Znane ograniczenia
- Nieobsługiwane typy: niektóre operacje TensorFlow mogą nie obsługiwać pełnego zestawu typów wejścia/wyjścia, które są zwykle dostępne w TensorFlow.
Aktualizacje
- Wersja 2.6
- Udoskonalono obsługę operatorów opartych na atrybutach GraphDef i inicjalizacji zasobów HashTable.
- Wersja 2.5
- Można zastosować optymalizację znaną jako kwantyzacja potreningowa
- Wersja 2.4
- Poprawiona została kompatybilność z delegatami przyspieszanymi sprzętowo