Selecciona operadores de TensorFlow

Dado que la biblioteca de operador integrada LiteRT solo admite un cantidad de operadores de TensorFlow, no todos los modelos son convertibles. Para obtener más información, consulta la compatibilidad con operadores.

Para permitir la conversión, los usuarios pueden habilitar el uso de determinados recursos de TensorFlow ops en su modelo LiteRT. Sin embargo, ejecutar Los modelos LiteRT con operaciones de TensorFlow requieren la extracción del núcleo. Es el entorno de ejecución de TensorFlow, que aumenta el tamaño del objeto binario del intérprete LiteRT. Para Android, puedes evitar esto si compilas de forma selectiva solo los TensorFlow necesarios ops. Para obtener más información, consulta Reduce los objetos binarios tamaño.

En este documento, se describe cómo convertir y ejecuta un modelo LiteRT que contenga operaciones de TensorFlow en un plataforma que elijas. También se analiza el rendimiento y el tamaño métricas y limitaciones conocidas.

Convierte un modelo

En el siguiente ejemplo, se muestra cómo generar un modelo LiteRT con la Ops de 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)

Inferencia de ejecución

Cuando se usa un modelo LiteRT que se convirtió y admite en operaciones de TensorFlow, el cliente también debe usar un entorno de ejecución LiteRT que incluye la biblioteca necesaria de operaciones de TensorFlow.

AAR de Android

Para reducir el tamaño del objeto binario, crea tus propios archivos AAR personalizados como se indica en la guía. la siguiente sección. Si el tamaño del objeto binario no es una una preocupación considerable, recomendamos usar las AAR precompiladas con las operaciones de TensorFlow alojado en MavenCentral.

Puedes especificar esto en tus dependencias de build.gradle si lo agregas junto el AAR estándar de LiteRT de la siguiente manera:

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

Para usar instantáneas nocturnas, asegúrate de haber agregado Instantánea de Sonatype Cloud Storage.

Una vez que agregues la dependencia, se podrá ver el delegado necesario ops de TensorFlow de grafos se deben instalar automáticamente para grafos que requieren de ellos.

Nota: La dependencia de operaciones de TensorFlow es relativamente grande, por lo que probablemente quieres filtrar las ABI x86 innecesarias en tu archivo .gradle configurando tu abiFilters.

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

Cómo compilar el AAR de Android

Para reducir el tamaño del objeto binario u otros casos avanzados, también puedes compilar el biblioteca de forma manual. Una compilación LiteRT funcional , compila el AAR de Android con operaciones seleccionadas de TensorFlow como sigue:

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

Esto generará el archivo AAR bazel-bin/tmp/tensorflow-lite.aar para Operaciones de LiteRT integradas y personalizadas y generar el archivo AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar para las operaciones de TensorFlow. Si si no tienes un entorno de compilación que funcione, también puedes crear archivos anteriores con Docker.

Desde allí, puedes importar los archivos AAR directamente a tu proyecto o Publica los archivos AAR personalizados en tu repositorio local de 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

Por último, en el build.gradle de tu app, asegúrate de tener el mavenLocal() y reemplaza la dependencia LiteRT estándar con la que es compatible con algunas operaciones de 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

Uso de CocoaPods

LiteRT proporciona CocoaPods seleccionado para operaciones de TF, que se precompila durante la noche, para arm64. en la que puedes confiar junto con TensorFlowLiteSwift o TensorFlowLiteObjC CocoaPods.

Nota: Si necesitas usar operaciones de TF seleccionadas en un simulador de x86_64, puedes compilar el framework de operaciones de selección. Consulta Cómo usar Bazel + Xcode. para obtener más detalles.

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

Después de ejecutar pod install, debes proporcionarle una marca de vinculador adicional a Fuerza la carga del framework de operaciones de TF de selección en tu proyecto. En tu proyecto de Xcode, Ir a Build Settings -> Other Linker Flags y agrega lo siguiente:

Para versiones posteriores a la 2.9.0:

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

Para las versiones < 2.9.0:

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

Luego, podrás ejecutar cualquier modelo convertido con SELECT_TF_OPS en tu app para iOS. Por ejemplo, puedes modificar el código de Clasificación de imágenes para iOS app para probar la función de selección de operaciones de TF.

  • Reemplaza el archivo de modelo por el que se convirtió con SELECT_TF_OPS habilitado.
  • Agrega la dependencia TensorFlowLiteSelectTfOps a Podfile como se indica.
  • Agrega la marca de vinculador adicional como se muestra arriba.
  • Ejecuta la app de ejemplo y observa si el modelo funciona correctamente.

Cómo usar Bazel + Xcode

LiteRT con operaciones seleccionadas de TensorFlow para iOS se puede compilar con Bazel. Primero, sigue las instrucciones de compilación en iOS para configurar tu El espacio de trabajo y el archivo .bazelrc de Bazel correctamente.

Una vez que hayas configurado el lugar de trabajo con la compatibilidad con iOS habilitada, puedes usar la siguiente comando para compilar el framework del complemento de Operaciones de TF, que se puede agregar por encima del TensorFlowLiteC.framework regular. Ten en cuenta que las operaciones de TF framework no se puede compilar para la arquitectura i386, por lo que debes Proporcionar la lista de arquitecturas de destino, excepto i386

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

Esto generará el framework en bazel-bin/tensorflow/lite/ios/ . Para agregar este nuevo marco de trabajo a tu proyecto Xcode, sigue estos pasos: pasos similares descritos en el proyecto Xcode Configuración en la Guía de compilación para iOS.

Después de agregar el framework al proyecto de tu app, se agregará una marca de vinculador adicional debe especificarse en el proyecto de tu app para forzar la carga de las operaciones seleccionadas de TF en un framework de aplicaciones. En tu proyecto de Xcode, ve a Build Settings -> Other Linker Flags y agrega lo siguiente:

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

C/C++

Si usas Bazel o CMake para compilar LiteRT intérprete, puedes habilitar el delegado de Flex vinculando un LiteRT Flex biblioteca compartida delegada. Puedes compilarlo con Bazel mediante el siguiente comando.

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

Este comando genera la siguiente biblioteca compartida en bazel-bin/tensorflow/lite/delegates/flex

Plataforma Nombre de la biblioteca
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

Ten en cuenta que el TfLiteDelegate necesario se instalará automáticamente cuando Crear el intérprete en el tiempo de ejecución, siempre que la biblioteca compartida esté vinculada Integra no es necesario instalar explícitamente la instancia delegada, como se suele con otros tipos de delegados.

Nota: Esta función está disponible a partir de la versión 2.7.

Python

LiteRT con operaciones seleccionadas de TensorFlow se instalará automáticamente con el paquete pip de TensorFlow. Puedes también puedes instalar únicamente el pip para intérpretes de LiteRT paquete.

Métricas

Rendimiento

Cuando se usa una combinación de operaciones de TensorFlow integradas y seleccionadas, Habrá optimizaciones de LiteRT y operaciones integradas optimizadas. que se puedan usar con el modelo convertido.

En la siguiente tabla, se describe el tiempo promedio que se tarda en ejecutar la inferencia en MobileNet en un Pixel 2 Los tiempos enumerados son un promedio de 100 ejecuciones. Estos se crearon para Android con las siguientes marcas: --config=android_arm64 -c opt.

Compilación Tiempo (milisegundos)
Solo operaciones integradas (TFLITE_BUILTIN) 260,7
Usa solo operaciones de TF (SELECT_TF_OPS) 264,5

Tamaño de los objetos binarios

En la siguiente tabla, se describe el tamaño de objeto binario de LiteRT para cada compilación. Estos destinos se compilaron para Android con --config=android_arm -c opt.

Compilación Tamaño de los objetos binarios de C++ Tamaño del APK de Android
Solo operaciones integradas 796 KB 561 KB
Operaciones integradas + ops de TF 23.0 MB 8.0 MB
Operaciones integradas + Operaciones de TF (1) 4.1 MB 1.8 MB

(1) Estas bibliotecas se crean de forma selectiva para i3d-kinetics-400 modelo con 8 operaciones de TFLite integradas y 3 operaciones de TensorFlow. Para obtener más información, consulta la Sección Reduce el tamaño de los objetos binarios de LiteRT.

Limitaciones conocidas

  • Tipos no admitidos: Ciertas operaciones de TensorFlow pueden no admitir el conjunto completo de que suelen estar disponibles en TensorFlow.

Actualizaciones

  • Versión 2.6
    • Compatibilidad con operadores basados en atributos GraphDef y recursos HashTable las inicializaciones mejoradas.
  • Versión 2.5
  • Versión 2.4
    • Se mejoró la compatibilidad con delegados acelerados por hardware