Se usó la API de Cloud Translation para traducir esta página.
Switch to English

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 la plataforma que elijas. 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.

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

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'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly'
}

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 en funcionamiento , 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 genera 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 Docker .

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 {
        jcenter()
        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, en los que puede confiar junto con los CocoaPods 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 Xcode, vaya a Build Settings -> Other Linker Flags , y agregue:

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

A continuación, debería poder ejecutar cualquier modelo convertido con SELECT_TF_OPS en su aplicación iOS. Por ejemplo, puede modificar la aplicació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 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 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/experimental/ios:TensorFlowLiteSelectTfOps_framework

Esto generará el marco en el bazel-bin/tensorflow/lite/experimental/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 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 la --config=monolithic build.
  • 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 el paquete 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 necesario para 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.
  • Optimizaciones no admitidas: si aplicas una optimización conocida como cuantización posterior al entrenamiento , solo se cuantificarán (u optimizarán) las operaciones de TensorFlow Lite, pero las operaciones de TensorFlow permanecerán como flotantes (o no optimizadas).

Planes futuros

A continuación, se muestra una lista de mejoras en este proceso en curso:

  • Rendimiento mejorado : se está trabajando para garantizar que TensorFlow Lite con las operaciones de TensorFlow coopere bien con los delegados acelerados por hardware, por ejemplo, los delegados de NNAPI y GPU.