Seleccionar operadores de TensorFlow

Dado que la biblioteca de operadores incorporada 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 de TensorFlow Lite. Sin embargo, ejecutar modelos de TensorFlow Lite con operaciones de TensorFlow requiere incorporar el tiempo de ejecución principal de TensorFlow, lo que aumenta el tamaño binario del intérprete de TensorFlow Lite. Para Android, puede evitar esto compilando de forma selectiva solo las operaciones de Tensorflow necesarias. 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 de TensorFlow Lite con determinadas operaciones 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 de TensorFlow seleccionadas, el cliente también debe usar un tiempo de ejecución de TensorFlow Lite que incluye la biblioteca necesaria de operaciones de TensorFlow.

Android AAR

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 prediseñado con las operaciones de TensorFlow alojadas en MavenCentral .

Puedes especificar esto en tus dependencias de 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 de TensorFlow Lite que funcione , compile el AAR de Android con las operaciones de TensorFlow seleccionadas 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 bazel-bin/tmp/tensorflow-lite.aar integradas y personalizadas de TensorFlow Lite; y generar el archivo AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar para las operaciones de TensorFlow. Si no tiene un entorno de compilación que funcione, también puede compilar los archivos anteriores con la ventana acoplable .

Desde allí, puede importar los archivos AAR directamente a su proyecto o publicar los archivos AAR personalizados en su 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

Finalmente, en build.gradle tu aplicación, asegúrate de tener la dependencia mavenLocal() y reemplaza la dependencia estándar de TensorFlow Lite con la que tiene soporte para determinadas operaciones de TensorFlow:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'http://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

Usando CocoaPods

Proporcionamos CocoaPods selectos de TF precompilados nocturnos para armv7 y arm64 , en los que puede confiar junto con los CocoaPods de TensorFlowLiteSwift o TensorFlowLiteObjC .

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

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

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

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

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

Usando Bazel + Xcode

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

Una vez que haya configurado el espacio de trabajo con la compatibilidad con iOS habilitada, puede usar el siguiente comando para crear el marco de complemento de operaciones de TF seleccionado, que se puede agregar sobre el marco regular de TensorFlowLiteC.framework . Tenga en cuenta que el marco de operaciones TF seleccionado no se puede construir para la arquitectura i386 , por lo que debe proporcionar explícitamente la lista de arquitecturas de destino excluyendo i386 .

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

Esto generará el marco en el 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 en el proyecto de su aplicación, se debe especificar una marca de vinculador adicional en el proyecto de su aplicación para forzar la carga del marco de operaciones de TF seleccionado. En su proyecto de Xcode, vaya a Build Settings -> Other Linker Flags , y agregue:

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

C ++

Al compilar bibliotecas de TensorFlow Lite con la canalización de bazel, la biblioteca de operaciones de TensorFlow adicional se puede incluir y habilitar de la siguiente manera:

  • Habilite las compilaciones monolíticas si es necesario agregando el --config=monolithic compilación --config=monolithic .
  • Agrega la dependencia de la biblioteca delegada de operaciones de TensorFlow a las dependencias de compilación: tensorflow/lite/delegates/flex:delegate .

Tenga en cuenta que el TfLiteDelegate necesario se instalará automáticamente al crear el intérprete en tiempo de ejecución, siempre que el delegado esté vinculado a la biblioteca cliente. No es necesario instalar explícitamente la instancia de delegado como normalmente se requiere con otros tipos de delegado.

Pitón

TensorFlow Lite con determinadas operaciones de TensorFlow se instalará automáticamente con el paquete pip de TensorFlow . También puede optar por instalar solo elpaquete pip de intérprete de TensorFlow Lite .

Métrica

Actuación

Cuando se usa una combinación de operaciones integradas y selectas de TensorFlow, todas las mismas optimizaciones de TensorFlow Lite y operaciones integradas optimizadas estarán disponibles y se podrán utilizar 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 --config=android_arm64 -c opt para Android usando las banderas: --config=android_arm64 -c opt .

Construir Tiempo (milisegundos)
Solo operaciones TFLITE_BUILTIN ( 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 --config=android_arm -c opt para Android usando --config=android_arm -c opt .

Construir Tamaño binario de C ++ Tamaño APK de Android
Solo operaciones integradas 796 KB 561 KB
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 de TFLite y 3 operaciones de 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 algunas operaciones de TensorFlow no admitan el conjunto completo de tipos de entrada / salida que normalmente están disponibles en TensorFlow.
  • Operaciones no admitidas: las operaciones de flujo de control y las operaciones que requieren inicialización explícita de recursos, como HashTableV2 , aún no son compatibles.

Actualizaciones

  • Versión 2.5 (aún no lanzada oficialmente)
  • Versión 2.4
    • Se ha mejorado la compatibilidad con delegados acelerados por hardware