Wybierz operatory TensorFlow

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Ponieważ wbudowana biblioteka operatorów TensorFlow Lite obsługuje tylko ograniczoną liczbę operatorów TensorFlow, nie każdy model jest konwertowalny. Aby uzyskać szczegółowe informacje, patrz Kompatybilność operatora .

Aby umożliwić konwersję, użytkownicy mogą włączyć korzystanie z niektórych operacji TensorFlow w swoim modelu TensorFlow Lite. Jednak uruchomienie modeli TensorFlow Lite z operacjami TensorFlow wymaga pobrania 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 uzyskać szczegółowe informacje, zobacz zmniejszanie rozmiaru binarnego .

Ten dokument opisuje, 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 za pomocą wybranych operacji 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 binarny nie jest poważnym problemem, zalecamy użycie gotowego AAR z operacjami TensorFlow hostowanymi na MavenCentral .

Możesz to określić w zależnościach build.gradle , dodając go 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 dodano repozytorium migawek Sonatype .

Po dodaniu zależności delegat niezbędny do obsługi operacji TensorFlow grafu powinien zostać automatycznie zainstalowany dla grafów, które ich wymagają.

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

Budowanie AAR na Androida

Aby zmniejszyć rozmiar binarny lub inne zaawansowane przypadki, możesz również ręcznie zbudować bibliotekę. 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 w build.gradle aplikacji upewnij się, że masz 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 zapewnia co noc prefabrykowane wybrane, wybrane TF ops CocoaPods dla arm64 , na których można 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 projektu. W 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

Powinno być wtedy możliwe uruchomienie dowolnych modeli przekonwertowanych za pomocą SELECT_TF_OPS w aplikacji na iOS. Na przykład możesz zmodyfikować aplikację Klasyfikacja obrazów na iOS , aby przetestować wybraną funkcję TF ops.

  • Zastąp plik modelu plikiem przekonwertowanym z włączoną SELECT_TF_OPS .
  • Dodaj zależność TensorFlowLiteSelectTfOps do Podfile zgodnie z instrukcją.
  • Dodaj dodatkową flagę konsolidatora, jak powyżej.
  • Uruchom przykładową aplikację i sprawdź, czy model działa poprawnie.

Korzystanie z Bazela + Xcode

TensorFlow Lite z wybranymi operacjami TensorFlow dla systemu 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ą iOS, możesz użyć następującego polecenia, aby zbudować wybrany framework dodatków TF ops, który można dodać do zwykłego TensorFlowLiteC.framework . Zauważ, że framework select TF ops nie może być zbudowany 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

To wygeneruje framework w 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 po kompilacji systemu iOS.

Po dodaniu struktury do projektu aplikacji w projekcie aplikacji należy określić dodatkową flagę konsolidatora, aby wymusić załadowanie wybranej struktury TF ops. W 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 programu Bazel lub CMake do tworzenia 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 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
Linux libtensorflowlite_flex.so
System operacyjny Mac libtensorflowlite_flex.dylib
Okna tensorflowlite_flex.dll

Należy zauważyć, ż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 opcjami TensorFlow zostanie zainstalowany automatycznie z pakietem pip TensorFlow . Możesz także wybrać tylko instalację pakietu pip TensorFlow Lite Interpreter .

Metryka

Wydajność

W przypadku korzystania z kombinacji zarówno wbudowanych, jak i wybranych operacji TensorFlow, wszystkie te same optymalizacje TensorFlow Lite i zoptymalizowane wbudowane operacje będą dostępne i użyteczne z przekonwertowanym modelem.

Poniższa tabela opisuje średni czas potrzebny do uruchomienia wnioskowania w MobileNet na Pixel 2. Podane czasy to średnia 100 uruchomień. Te cele zostały zbudowane dla systemu Android przy użyciu flag: --config=android_arm64 -c opt .

Budować Czas (milisekundy)
Tylko wbudowane operacje ( TFLITE_BUILTIN ) 260,7
Korzystanie tylko z operacji TF ( SELECT_TF_OPS ) 264,5

Rozmiar binarny

Poniższa tabela opisuje binarny rozmiar TensorFlow Lite dla każdej kompilacji. Te cele zostały zbudowane dla systemu Android przy użyciu --config=android_arm -c opt .

Budować Rozmiar binarny C++ Rozmiar APK na Androida
Tylko wbudowane operacje 796 KB 561 KB
Wbudowane operacje + operacje TF 23,0 MB 8,0 MB
Wbudowane operacje + operacje TF (1) 4,1 MB 1,8 MB

(1) Te biblioteki są selektywnie budowane 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
    • Poprawiła się kompatybilność z delegatami z przyspieszeniem sprzętowym