Compatibilidad con TensorFlow Lite y con operadores de TensorFlow

Los operadores de aprendizaje automático (AA) que usas en tu modelo pueden afectar el proceso de conversión de un modelo de TensorFlow al formato de TensorFlow Lite. El conversor de TensorFlow Lite es compatible con una cantidad limitada de operaciones de TensorFlow que se usan en modelos de inferencia comunes, lo que significa que no todos los modelos se pueden convertir de forma directa. La herramienta de conversión te permite incluir operadores adicionales, pero esta manera de convertir un modelo también requiere que modifiques el entorno de ejecución de TensorFlow Lite que usas para ejecutar el modelo, lo que puede limitar tu capacidad de usar opciones de implementación del entorno de ejecución estándar, como los Servicios de Google Play.

El convertidor de TensorFlow Lite se diseñó para analizar la estructura del modelo y aplicar optimizaciones a fin de que sea compatible con los operadores que admiten directamente. Por ejemplo, según los operadores de AA de tu modelo, el conversor puede elide o fusiona esos operadores para asignarlos a sus contrapartes de TensorFlow Lite.

Incluso para las operaciones admitidas, a veces se esperan patrones de uso específicos por motivos de rendimiento. La mejor manera de comprender cómo compilar un modelo de TensorFlow que se puede usar con TensorFlow Lite es considerar cuidadosamente cómo se convierten y optimizan las operaciones, junto con las limitaciones que impone este proceso.

Operadores admitidos

Los operadores integrados de TensorFlow Lite son un subconjunto de los operadores que forman parte de la biblioteca principal de TensorFlow. Tu modelo de TensorFlow también puede incluir operadores personalizados en forma de operadores compuestos o nuevos operadores definidos por ti. El siguiente diagrama muestra las relaciones entre estos operadores.

Operadores de TensorFlow

En esta variedad de operadores de modelos de AA, hay 3 tipos de modelos compatibles con el proceso de conversión:

  1. Modelos que solo tienen un operador integrado de TensorFlow Lite. (Recomendado)
  2. Modelos con los operadores integrados y operadores principales de TensorFlow seleccionados.
  3. Modelos con los operadores integrados, operadores básicos de TensorFlow o operadores personalizados

Si tu modelo solo contiene operaciones que son compatibles de forma nativa con TensorFlow Lite, no necesitas marcas adicionales para convertirlo. Esta es la ruta recomendada porque este tipo de modelo se convertirá sin problemas y es más fácil de optimizar y ejecutar con el entorno de ejecución predeterminado de TensorFlow Lite. También tienes más opciones de implementación para tu modelo, como los Servicios de Google Play. Puedes comenzar con la guía del conversor de TensorFlow Lite. Consulta la página de operaciones de TensorFlow Lite para obtener una lista de los operadores integrados.

Si necesitas incluir operaciones seleccionadas de TensorFlow de la biblioteca principal, debes especificarla en la conversión y asegurarte de que tu entorno de ejecución incluya esas operaciones. Consulta el tema Selecciona operadores de TensorFlow para obtener pasos detallados.

Siempre que sea posible, evita la última opción de incluir operadores personalizados en el modelo convertido. Los operadores personalizados son operadores que se crean mediante la combinación de varios operadores principales básicos de TensorFlow o la definición de uno completamente nuevo. Cuando los operadores personalizados se convierten, pueden aumentar el tamaño del modelo general incurriendo en dependencias fuera de la biblioteca integrada de TensorFlow Lite. Las operaciones personalizadas, si no se crean específicamente para la implementación en dispositivos móviles o dispositivos, pueden generar un peor rendimiento cuando se implementan en dispositivos con recursos limitados en comparación con un entorno de servidor. Por último, al igual que cuando se incluyen algunos operadores principales de TensorFlow, los operadores personalizados requieren que modifiques el entorno de ejecución del modelo, lo que te impide aprovechar los servicios del entorno de ejecución estándar, como los Servicios de Google Play.

Tipos admitidos

La mayoría de las operaciones de TensorFlow Lite se orientan a la inferencia de punto flotante (float32) y cuantizada (uint8, int8), pero muchas ops aún no lo hacen para otros tipos, como tf.float16 y cadenas.

Además de usar versiones diferentes de las operaciones, la otra diferencia entre los modelos de punto flotante y los cuantizados es la forma en que se convierten. La conversión cuantizada requiere información de rango dinámico para los tensores. Esto requiere una “cuantización falsa” durante el entrenamiento de modelos, obtener información del rango a través de un conjunto de datos de calibración o realizar una estimación de rango “en el momento”. Consulta Cuantización para obtener más detalles.

Conversiones sencillas, plegado constante y fusión

TensorFlow Lite puede procesar varias operaciones de TensorFlow, aunque no tengan un equivalente directo. Este es el caso de las operaciones que se pueden quitar del gráfico (tf.identity), reemplazar por tensores (tf.placeholder) o fusionarse en operaciones más complejas (tf.nn.bias_add). A veces, incluso algunas operaciones admitidas pueden quitarse a través de uno de estos procesos.

Esta es una lista no exhaustiva de las operaciones de TensorFlow que, por lo general, se quitan del grafo:

  • tf.add
  • tf.debugging.check_numerics
  • tf.constant
  • tf.div
  • tf.divide
  • tf.fake_quant_with_min_max_args
  • tf.fake_quant_with_min_max_vars
  • tf.identity
  • tf.maximum
  • tf.minimum
  • tf.multiply
  • tf.no_op
  • tf.placeholder
  • tf.placeholder_with_default
  • tf.realdiv
  • tf.reduce_max
  • tf.reduce_min
  • tf.reduce_sum
  • tf.rsqrt
  • tf.shape
  • tf.sqrt
  • tf.square
  • tf.subtract
  • tf.tile
  • tf.nn.batch_norm_with_global_normalization
  • tf.nn.bias_add
  • tf.nn.fused_batch_norm
  • tf.nn.relu
  • tf.nn.relu6

Operaciones experimentales

Las siguientes operaciones de TensorFlow Lite están presentes, pero no están listas para los modelos personalizados:

  • CALL
  • CONCAT_EMBEDDINGS
  • CUSTOM
  • EMBEDDING_LOOKUP_SPARSE
  • HASHTABLE_LOOKUP
  • LSH_PROJECTION
  • SKIP_GRAM
  • SVDF