Seleccionar operadores de TensorFlow

Dado que la biblioteca de operadores integrada de TensorFlow Lite solo admite una cantidad limitada de operadores de TensorFlow, no todos los modelos son convertibles. Para obtener más información, consulte la compatibilidad del operador .

Para permitir la conversión, los usuarios pueden habilitar el uso de ciertas operaciones de TensorFlow en su modelo TensorFlow Lite. Sin embargo, ejecutar modelos de TensorFlow Lite con operaciones de TensorFlow requiere incorporar el tiempo de ejecución central de TensorFlow, lo que aumenta el tamaño binario del intérprete de TensorFlow Lite. Para Android, puede evitar esto creando selectivamente solo las operaciones de Tensorflow requeridas. Para obtener más información, consulte reducir el tamaño binario .

Este documento describe cómo convertir y ejecutar un modelo de TensorFlow Lite que contiene operaciones de TensorFlow en una plataforma de su elección. También analiza las métricas de rendimiento y tamaño y las limitaciones conocidas .

Convertir un modelo

El siguiente ejemplo muestra cómo generar un modelo TensorFlow Lite con operaciones seleccionadas 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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

Ejecutar inferencia

Cuando se usa un modelo de TensorFlow Lite que se ha convertido con soporte para operaciones seleccionadas de TensorFlow, el cliente también debe usar un tiempo de ejecución de TensorFlow Lite que incluye la biblioteca necesaria de operaciones de TensorFlow.

RAA de Android

Para reducir el tamaño binario, cree sus propios archivos AAR personalizados como se indica en la siguiente sección . Si el tamaño binario no es una preocupación considerable, recomendamos usar el AAR preconstruido con TensorFlow ops alojado en MavenCentral .

Puede especificar esto en sus dependencias build.gradle agregándolo junto con el AAR estándar de TensorFlow Lite 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úrese de haber agregado el repositorio de instantáneas de Sonatype .

Una vez que haya agregado la dependencia, el delegado necesario para manejar las operaciones de TensorFlow del gráfico debe instalarse automáticamente para los gráficos que lo requieran.

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

Construyendo el AAR de Android

Para reducir el tamaño binario u otros casos avanzados, también puede crear la biblioteca manualmente. Suponiendo un entorno de compilación TensorFlow Lite en funcionamiento , cree el AAR de Android con operaciones seleccionadas de TensorFlow de la siguiente manera:

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 las operaciones integradas y personalizadas de TensorFlow Lite; y genere el archivo AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar para TensorFlow ops. Si no tiene un entorno de compilación que funcione, también puede compilar los archivos anteriores con docker .

Desde allí, puede importar los archivos AAR directamente a su proyecto o publicar los archivos AAR personalizados en su repositorio Maven local:

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

Finalmente, en build.gradle de su aplicación, asegúrese de tener la dependencia mavenLocal() y reemplace la dependencia estándar de TensorFlow Lite con la que admite operaciones seleccionadas 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

TensorFlow Lite proporciona CocoaPods de TF ops prediseñados todas las noches para arm64 , en los que puede confiar junto con TensorFlowLiteSwift o TensorFlowLiteObjC CocoaPods.

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

Después de ejecutar pod install , debe proporcionar un indicador de vinculación adicional para forzar la carga del marco de operaciones de TF seleccionado en su proyecto. En su proyecto Xcode, vaya a Build Settings -> Other Linker Flags y agregue:

Para versiones >= 2.9.0:

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

Para versiones < 2.9.0:

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

Entonces debería poder ejecutar cualquier modelo convertido con SELECT_TF_OPS en su aplicación iOS. Por ejemplo, puede modificar la aplicación Clasificación de imágenes de iOS para probar la función de operaciones TF seleccionadas.

  • Reemplace el archivo del modelo con el convertido con SELECT_TF_OPS habilitado.
  • Agregue la dependencia TensorFlowLiteSelectTfOps al Podfile como se indica.
  • Agregue la bandera del enlazador adicional como se indica arriba.
  • Ejecute la aplicación de ejemplo y vea si el modelo funciona correctamente.

Usando Bazel + Xcode

TensorFlow Lite con operaciones seleccionadas de TensorFlow para iOS se puede crear con Bazel. Primero, siga las instrucciones de compilación de iOS para configurar su espacio de trabajo de Bazel y el archivo .bazelrc correctamente.

Una vez que haya configurado el espacio de trabajo con la compatibilidad con iOS habilitada, puede usar el siguiente comando para crear el marco adicional de operaciones de TF seleccionado, que se puede agregar encima del TensorFlowLiteC.framework normal. Tenga en cuenta que el marco de operaciones de TF seleccionado no se puede compilar para la arquitectura i386 , por lo que debe proporcionar explícitamente 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 marco en el directorio bazel-bin/tensorflow/lite/ios/ . Puede agregar este nuevo marco a su proyecto Xcode siguiendo pasos similares descritos en la sección de configuración del proyecto Xcode en la guía de compilación de iOS.

Después de agregar el marco a su proyecto de aplicación, se debe especificar un indicador de vinculación adicional en su proyecto de aplicación para forzar la carga del marco de operaciones de TF seleccionado. En su proyecto Xcode, vaya a Build Settings -> Other Linker Flags y agregue:

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

C/C++

Si usa Bazel o CMake para compilar el intérprete de TensorFlow Lite, puede habilitar el delegado de Flex vinculando una biblioteca compartida de delegado de TensorFlow Lite Flex. Puedes construirlo con Bazel como 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
Mac OS libtensorflowlite_flex.dylib
ventanas tensorflowlite_flex.dll

Tenga en cuenta que el TfLiteDelegate necesario se instalará automáticamente al crear el intérprete en tiempo de ejecución siempre que la biblioteca compartida esté vinculada. No es necesario instalar explícitamente la instancia de delegado como suele ser necesario con otros tipos de delegados.

Pitón

TensorFlow Lite con operaciones seleccionadas de TensorFlow se instalará automáticamente con el paquete pip de TensorFlow . También puede elegir instalar solo el paquete pip de TensorFlow Lite Interpreter .

Métrica

Actuación

Cuando se usa una combinación de operaciones integradas y seleccionadas de TensorFlow, todas las mismas optimizaciones de TensorFlow Lite y operaciones integradas optimizadas estarán disponibles y se podrán usar con el modelo convertido.

La siguiente tabla 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 objetivos se crearon para Android usando las banderas: --config=android_arm64 -c opt .

Construir Tiempo (milisegundos)
Solo operaciones integradas ( TFLITE_BUILTIN ) 260.7
Usando solo operaciones TF ( SELECT_TF_OPS ) 264.5

Tamaño binario

La siguiente tabla describe el tamaño binario de TensorFlow Lite para cada compilación. Estos objetivos se crearon para Android mediante --config=android_arm -c opt .

Construir Tamaño binario de C++ Tamaño de APK de Android
Solo operaciones integradas 796KB 561KB
Operaciones integradas + operaciones TF 23,0 MB 8,0 MB
Operaciones integradas + operaciones TF (1) 4,1 MB 1,8 MB

(1) Estas bibliotecas se crean de forma selectiva para el modelo i3d-kinetics-400 con 8 operaciones integradas TFLite y 3 operaciones Tensorflow. Para obtener más detalles, consulte la sección Reducir el tamaño binario de TensorFlow Lite .

Limitaciones conocidas

  • Tipos no admitidos: es posible que ciertas operaciones de TensorFlow no admitan el conjunto completo de tipos de entrada/salida que normalmente están disponibles en TensorFlow.

Actualizaciones

  • Versión 2.6
    • Se ha mejorado la compatibilidad con los operadores basados ​​en atributos de GraphDef y las inicializaciones de recursos de HashTable.
  • Versión 2.5
  • Versión 2.4
    • Se ha mejorado la compatibilidad con los delegados acelerados por hardware.