Zgjidhni operatorët TensorFlow

Meqenëse biblioteka e operatorëve të integruar LiteRT mbështet vetëm një numër të kufizuar operatorësh TensorFlow, jo çdo model është i konvertueshëm. Për detaje, referojuni përputhshmërisë së operatorit .

Për të lejuar konvertimin, përdoruesit mund të mundësojnë përdorimin e disa opcioneve TensorFlow në modelin e tyre LiteRT. Sidoqoftë, ekzekutimi i modeleve LiteRT me funksione TensorFlow kërkon tërheqjen e kohës së funksionimit thelbësor të TensorFlow, gjë që rrit madhësinë binare të interpretuesit LiteRT. Për Android, ju mund ta shmangni këtë duke ndërtuar në mënyrë selektive vetëm opcionet e nevojshme Tensorflow. Për detaje, referojuni reduktimit të madhësisë binare .

Ky dokument përshkruan se si të konvertohet dhe ekzekutohet një model LiteRT që përmban funksione TensorFlow në një platformë të zgjedhjes suaj. Ai gjithashtu diskuton matjet e performancës dhe madhësisë dhe kufizimet e njohura .

Konvertoni një model

Shembulli i mëposhtëm tregon se si të gjeneroni një model LiteRT me opsione të zgjedhura 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 LiteRT ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Ekzekutoni përfundimin

Kur përdorni një model LiteRT që është konvertuar me mbështetje për funksione të zgjedhura TensorFlow, klienti duhet të përdorë gjithashtu një kohë ekzekutimi LiteRT që përfshin bibliotekën e nevojshme të funksioneve TensorFlow.

Android AAR

Për të zvogëluar madhësinë binare, ju lutemi ndërtoni skedarët tuaj të personalizuar AAR siç udhëzohet në seksionin vijues . Nëse madhësia binare nuk është një shqetësim i konsiderueshëm, ne rekomandojmë përdorimin e AAR-it të para-ndërtuar me operacionet TensorFlow të pritura në MavenCentral .

Ju mund ta specifikoni këtë në varësitë tuaja build.gradle duke e shtuar së bashku me standardin LiteRT AAR si më poshtë:

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'
}

Për të përdorur fotografitë e çastit gjatë natës, sigurohuni që të keni shtuar depon e fotografive të Sonatype .

Pasi të keni shtuar varësinë, delegati i nevojshëm për trajtimin e funksioneve TensorFlow të grafikut duhet të instalohet automatikisht për grafikët që i kërkojnë ato.

Shënim : Varësia e TensorFlow ops është relativisht e madhe, kështu që ndoshta do të dëshironi të filtroni ABI-të e panevojshme x86 në skedarin tuaj .gradle duke vendosur abiFilters tuaj.

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

Ndërtimi i Android AAR

Për të reduktuar madhësinë binare ose raste të tjera të avancuara, mund ta ndërtoni bibliotekën edhe me dorë. Duke supozuar një mjedis ndërtimi funksional të LiteRT , ndërtoni Android AAR me opsione të zgjedhura TensorFlow si më poshtë:

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

Kjo do të gjenerojë skedarin AAR bazel-bin/tmp/tensorflow-lite.aar për funksionet e integruara dhe të personalizuara të LiteRT; dhe gjeneroni skedarin AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar për TensorFlow ops. Nëse nuk keni një mjedis ndërtimi funksional, mund të ndërtoni gjithashtu skedarë të mësipërm me docker .

Nga atje, ju ose mund të importoni skedarët AAR direkt në projektin tuaj, ose të publikoni skedarët e personalizuar AAR në depon tuaj lokale 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

Së fundi, në build.gradle të aplikacionit tuaj, sigurohuni që të keni varësinë mavenLocal() dhe zëvendësoni varësinë standarde LiteRT me atë që ka mbështetje për opsionet e zgjedhura 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

Duke përdorur CocoaPods

LiteRT ofron CocoaPods të zgjedhura TF të parandërtuara çdo natë për arm64 , tek të cilat mund të mbështeteni së bashku me TensorFlowLiteSwift ose TensorFlowLiteObjC CocoaPods.

Shënim : Nëse ju duhet të përdorni opsione të zgjedhura TF në një simulator x86_64 , mund ta ndërtoni vetë kornizën e opcioneve të përzgjedhura. Shihni seksionin Përdorimi i Bazel + Xcode për më shumë detaje.

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

Pas ekzekutimit të pod install , ju duhet të siguroni një flamur shtesë lidhës për të ngarkuar me forcë kornizën e zgjedhur të funksioneve TF në projektin tuaj. Në projektin tuaj Xcode, shkoni te Build Settings -> Other Linker Flags dhe shtoni:

Për versionet >= 2.9.0:

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

Për versionet < 2.9.0:

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

Më pas duhet të jeni në gjendje të ekzekutoni çdo model të konvertuar me SELECT_TF_OPS në aplikacionin tuaj iOS. Për shembull, mund të modifikoni aplikacionin iOS Klasifikimi i imazheve për të testuar veçorinë e zgjedhur të funksioneve TF.

  • Zëvendësoni skedarin e modelit me atë të konvertuar me SELECT_TF_OPS të aktivizuar.
  • Shtoni varësinë TensorFlowLiteSelectTfOpsPodfile siç udhëzohet.
  • Shtoni flamurin shtesë të lidhësit si më sipër.
  • Ekzekutoni aplikacionin shembull dhe shikoni nëse modeli funksionon siç duhet.

Duke përdorur Bazel + Xcode

LiteRT me opsione të zgjedhura TensorFlow për iOS mund të ndërtohet duke përdorur Bazel. Së pari, ndiqni udhëzimet e ndërtimit të iOS për të konfiguruar saktë hapësirën tuaj të punës Bazel dhe skedarin .bazelrc .

Pasi të keni konfiguruar hapësirën e punës me mbështetjen e iOS të aktivizuar, mund të përdorni komandën e mëposhtme për të ndërtuar kornizën e zgjedhur të shtesës TF ops, e cila mund të shtohet në krye të TensorFlowLiteC.framework të rregullt. Vini re se korniza e zgjedhur e funksioneve TF nuk mund të ndërtohet për arkitekturën i386 , kështu që ju duhet të jepni në mënyrë eksplicite listën e arkitekturave të synuara duke përjashtuar i386 .

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

Kjo do të gjenerojë kornizën nën drejtorinë bazel-bin/tensorflow/lite/ios/ . Ju mund ta shtoni këtë kornizë të re në projektin tuaj Xcode duke ndjekur hapa të ngjashëm të përshkruar në seksionin e cilësimeve të projektit Xcode në udhëzuesin e ndërtimit të iOS.

Pas shtimit të kornizës në projektin tuaj të aplikacionit, një flamur shtesë lidhës duhet të specifikohet në projektin tuaj të aplikacionit për të ngarkuar me forcë kornizën e zgjedhur të funksioneve TF. Në projektin tuaj Xcode, shkoni te Build Settings -> Other Linker Flags dhe shtoni:

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

C/C++

Nëse po përdorni Bazel ose CMake për të ndërtuar përkthyes LiteRT, mund të aktivizoni delegatin Flex duke lidhur një bibliotekë të përbashkët të delegatëve LiteRT Flex. Mund ta ndërtoni me Bazel si komandën e mëposhtme.

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

Kjo komandë gjeneron bibliotekën e mëposhtme të përbashkët në bazel-bin/tensorflow/lite/delegates/flex .

Platforma Emri i bibliotekës
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Dritaret tensorflowlite_flex.dll

Vini re se TfLiteDelegate i nevojshëm do të instalohet automatikisht kur krijohet përkthyesi në kohën e ekzekutimit për sa kohë që biblioteka e përbashkët është e lidhur. Nuk është e nevojshme të instaloni në mënyrë të qartë shembullin e delegatit siç kërkohet zakonisht me llojet e tjera të delegatëve.

Shënim: Ky funksion është i disponueshëm që nga versioni 2.7.

Python

LiteRT me opsione të zgjedhura TensorFlow do të instalohet automatikisht me paketën pip TensorFlow . Ju gjithashtu mund të zgjidhni të instaloni vetëm paketën pip LiteRT Interpreter .

Metrikë

Performanca

Kur përdorni një përzierje të funksioneve të integruara dhe të zgjedhura TensorFlow, të gjitha të njëjtat optimizime LiteRT dhe funksione të integruara të optimizuara do të jenë të disponueshme dhe të përdorshme me modelin e konvertuar.

Tabela e mëposhtme përshkruan kohën mesatare të nevojshme për të ekzekutuar konkluzionet në MobileNet në një Pixel 2. Kohët e listuara janë mesatarisht 100 ekzekutime. Këto objektiva u ndërtuan për Android duke përdorur flamujt: --config=android_arm64 -c opt .

Ndërtoni Koha (milisekonda)
Vetëm funksionet e integruara ( TFLITE_BUILTIN ) 260.7
Duke përdorur vetëm funksione TF ( SELECT_TF_OPS ) 264.5

Madhësia binare

Tabela e mëposhtme përshkruan madhësinë binare të LiteRT për çdo ndërtim. Këto objektiva janë ndërtuar për Android duke përdorur --config=android_arm -c opt .

Ndërtoni Madhësia binare C++ Madhësia e APK-së në Android
Vetëm funksione të integruara 796 KB 561 KB
Opsionet e integruara + funksionet TF 23.0 MB 8.0 MB
Opsionet e integruara + funksionet TF (1) 4.1 MB 1.8 MB

(1) Këto biblioteka janë ndërtuar në mënyrë selektive për modelin i3d-kinetics-400 me 8 funksione të integruara TFLite dhe 3 funksione Tensorflow. Për më shumë detaje, ju lutemi shihni seksionin Redukto madhësinë binare të LiteRT .

Kufizimet e njohura

  • Lloje të pambështetura: Disa funksione TensorFlow mund të mos mbështesin grupin e plotë të llojeve të hyrjes/daljes që zakonisht disponohen në TensorFlow.

Përditësimet

  • Versioni 2.6
    • Mbështetja për operatorët e bazuar në atribute GraphDef dhe inicializimet e burimeve HashTable janë përmirësuar.
  • Versioni 2.5
  • Versioni 2.4
    • Përputhshmëria me delegatët e përshpejtuar të harduerit është përmirësuar