Wybierz operatory TensorFlow

Ponieważ wbudowana biblioteka operatorów TensorFlow Lite obsługuje tylko ograniczoną liczbę operatorów TensorFlow, nie każdy model można zamienić. Aby uzyskać szczegółowe informacje, patrz zgodność 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 pobrania podstawowego środowiska wykonawczego TensorFlow, co zwiększa rozmiar binarny interpretera TensorFlow Lite. W przypadku systemu Android można tego uniknąć, selektywnie budując tylko wymagane operacje Tensorflow. Aby uzyskać szczegółowe informacje, zobacz zmniejszanie rozmiaru binarnego .

W tym dokumencie opisano, jak przekonwertować i uruchomić model TensorFlow Lite zawierający operacje TensorFlow na wybranej platformie. Omówiono również 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 uruchomieniowego 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 jest istotnym problemem, zalecamy użycie gotowego AAR z operacjami TensorFlow hostowanymi w MavenCentral .

Możesz to określić w swoich zależnościach build.gradle , dodając je obok standardowego TensorFlow Lite AAR 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 migawek nocnych, upewnij się, że dodano repozytorium migawek Sonatype .

Po dodaniu zależności niezbędny delegat 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'
        }
    }
}

Budowanie AAR dla Androida

Aby zmniejszyć rozmiar binarny lub w innych zaawansowanych przypadkach, możesz 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 również zbudować powyższe pliki za pomocą docker .

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 upewnij się, że w build.gradle Twojej aplikacji istnieje zależność mavenLocal() i zastąp standardową zależność TensorFlow Lite taką, 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 TF ops CocoaPods 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ę konsolidatora, aby wymusić załadowanie wybranej struktury TF ops do twojego 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 uruchamiać dowolne modele przekonwertowane za pomocą SELECT_TF_OPS w swojej aplikacji na iOS. Na przykład możesz zmodyfikować aplikację Image Classification iOS , aby przetestować funkcję Select TF ops.

  • Zastąp plik modelu plikiem przekonwertowanym z włączonym 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.

Korzystanie z Bazel + Xcode

TensorFlow Lite z wybranymi operacjami TensorFlow dla iOS można zbudować przy użyciu Bazel. 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 skompilować platformę wybranych dodatków operacji TF, którą można dodać na zwykłej platformie TensorFlowLiteC.framework . Zauważ, że wybrana struktura ops TF nie może zostać zbudowana dla architektury i386 , więc musisz 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 struktury 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 frameworka do projektu aplikacji, w projekcie aplikacji należy określić dodatkową flagę konsolidatora, aby wymusić załadowanie wybranego frameworka TF ops. 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 Bazel lub CMake do kompilowania interpretera TensorFlow Lite, możesz włączyć delegata Flex, łącząc udostępnioną bibliotekę delegata TensorFlow Lite Flex. Możesz go zbudować za pomocą Bazela jako 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
Linuks 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 wystąpienia delegata, co jest 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 zainstalować tylko pakiet pip TensorFlow Lite Interpreter .

Metryka

Wydajność

W przypadku korzystania zarówno z wbudowanych, jak i wybranych operacji TensorFlow wszystkie te same optymalizacje TensorFlow Lite i zoptymalizowane wbudowane operacje będą dostępne i będą mogły być używane w przekonwertowanym modelu.

W poniższej tabeli opisano średni czas potrzebny do uruchomienia wnioskowania w sieci MobileNet na Pixelu 2. Podane czasy to średnia z 100 przebiegów. Te cele zostały zbudowane dla systemu Android przy użyciu flag: --config=android_arm64 -c opt .

Zbudować Czas (milisekundy)
Tylko wbudowane operacje ( TFLITE_BUILTIN ) 260,7
Korzystanie tylko z 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 Androida
Tylko wbudowane operacje 796 kB 561 kB
Wbudowane operacje + operacje TF 23,0 MB 8,0 MB
Wbudowane operacje + operacje TF (1) 4,1MB 1,8MB

(1) Te biblioteki są budowane selektywnie dla modelu i3d-kinetics-400 z 8 wbudowanymi operacjami TFLite i 3 operacjami Tensorflow. Aby uzyskać więcej informacji, zobacz sekcję Zmniejsz rozmiar pliku 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
    • Poprawiono zgodność z delegatami przyspieszanymi sprzętowo