Compatibilidad con operadores LiteRT y 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 LiteRT. El conversor de LiteRT admite 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 directamente. La herramienta de conversión te permite incluir operadores adicionales, pero convertir un modelo de esta manera también requiere que modifiques el entorno de ejecución de LiteRT que usas para ejecutar tu modelo, lo que puede limitar tu capacidad de usar opciones de implementación de tiempo de ejecución estándar, como los servicios de Google Play.

El conversor de LiteRT está diseñado para analizar la estructura del modelo y aplicar optimizaciones para que sea compatible con los operadores admitidos directamente. Por ejemplo, según los operadores de AA de tu modelo, el convertidor puede elidir o fusionar esos operadores para asignarlos a sus equivalentes de LiteRT.

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 pueda usar con LiteRT 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 LiteRT 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. En el siguiente diagrama, se muestran las relaciones entre estos operadores.

Operadores de TensorFlow

En este rango de operadores de modelos de AA, el proceso de conversión admite 3 tipos de modelos:

  1. Modelos con solo el operador integrado de LiteRT. (Recomendado)
  2. Modelos con los operadores integrados y operadores principales seleccionados de TensorFlow
  3. Modelos con operadores integrados, operadores principales de TensorFlow o operadores personalizados

Si tu modelo solo contiene operaciones que LiteRT admite de forma nativa, no necesitas ninguna marca adicional para convertirlo. Esta es la ruta recomendada, ya que 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 LiteRT. 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 convertidor de LiteRT. Consulta la página de LiteRT Ops para obtener una lista de los operadores integrados.

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

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

Tipos admitidos

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

Además de usar diferentes versiones de las operaciones, la otra diferencia entre los modelos de punto flotante y los cuantificados es la forma en que se convierten. La conversión cuantificada requiere información del rango dinámico para los tensores. Esto requiere una "pseudocuantización" durante el entrenamiento del modelo, la obtención de información de rango a través de un conjunto de datos de calibración o la realización de una estimación de rango "sobre la marcha". Consulta cuantización para obtener más detalles.

Conversiones directas, plegado y fusión de constantes

LiteRT 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 fusionar en operaciones más complejas (tf.nn.bias_add). Incluso algunas operaciones compatibles a veces se pueden quitar a través de uno de estos procesos.

A continuación, se incluye una lista no exhaustiva de las operaciones de TensorFlow que suelen quitarse 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 LiteRT 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