Wybierz operatory TensorFlow

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 do Podfile 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 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
System operacyjny Mac 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,0MB 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
    • Ulepszono obsługę operatorów opartych na atrybutach GraphDef i inicjalizacji zasobów HashTable.
  • Wersja 2.5
  • Wersja 2.4
    • Poprawiona została kompatybilność z delegatami przyspieszanymi sprzętowo