Optimización de modelos

Los dispositivos perimetrales suelen tener memoria o capacidad de procesamiento limitadas. Se pueden aplicar varias optimizaciones a los modelos para que se puedan ejecutar dentro de estas restricciones. Además, algunas optimizaciones permiten el uso de hardware especializado para una inferencia acelerada.

TensorFlow Lite y el kit de herramientas de optimización de modelos de TensorFlow proporcionan herramientas para minimizar la complejidad de la optimización de la inferencia.

Se recomienda que consideres la optimización del modelo durante el proceso de desarrollo de la aplicación. En este documento, se describen algunas prácticas recomendadas a fin de optimizar modelos de TensorFlow para implementaciones en hardware perimetral.

Por qué se deben optimizar los modelos

Existen varias formas principales en las que la optimización de modelos puede ayudar con el desarrollo de la aplicación.

Reducción de tamaño

Se pueden usar algunas formas de optimización para reducir el tamaño de un modelo. Los modelos más pequeños tienen los siguientes beneficios:

  • Tamaño de almacenamiento más pequeño: Los modelos más pequeños ocupan menos espacio de almacenamiento en los dispositivos de los usuarios. Por ejemplo, una app para Android que use un modelo más pequeño ocupará menos espacio de almacenamiento en el dispositivo móvil de un usuario.
  • Tamaño de descarga menor: Los modelos más pequeños requieren menos tiempo y ancho de banda para descargarse en los dispositivos de los usuarios.
  • Menos uso de memoria: Los modelos más pequeños usan menos RAM cuando se ejecutan, lo que libera memoria para que la usen otras partes de tu aplicación y puede mejorar el rendimiento y la estabilidad.

La cuantización puede reducir el tamaño de un modelo en todos estos casos, posiblemente a expensas de cierta exactitud. La reducción y el agrupamiento en clústeres pueden reducir el tamaño de un modelo que se descarga, ya que se puede comprimir con mayor facilidad.

Reducción de latencia

La latencia es la cantidad de tiempo que lleva ejecutar una sola inferencia con un modelo determinado. Algunas formas de optimización pueden reducir la cantidad de procesamiento necesario para ejecutar inferencias con un modelo, lo que da como resultado una latencia más baja. La latencia también puede tener un impacto en el consumo de energía.

En la actualidad, la cuantización se puede usar para reducir la latencia mediante la simplificación de los cálculos que se producen durante la inferencia, a expensas de cierta exactitud.

Compatibilidad con los aceleradores

Algunos aceleradores de hardware, como la TPU de Edge, pueden ejecutar inferencias muy rápido con modelos que se optimizaron de forma correcta.

En general, estos tipos de dispositivos requieren que los modelos se cuantifiquen de una manera específica. Consulta la documentación de cada acelerador de hardware para obtener más información sobre sus requisitos.

Concesiones

Las optimizaciones pueden generar cambios en la exactitud del modelo, que deben tenerse en cuenta durante el proceso de desarrollo de la aplicación.

Los cambios en la exactitud dependen del modelo individual que se optimiza y son difíciles de predecir con anticipación. Por lo general, los modelos optimizados para el tamaño o la latencia pierden una pequeña cantidad de exactitud. Según tu aplicación, esto puede o no afectar la experiencia de tus usuarios. En casos excepcionales, algunos modelos pueden obtener cierta exactitud como resultado del proceso de optimización.

Tipos de optimización

Actualmente, TensorFlow Lite es compatible con la optimización a través de la cuantización, la reducción y el agrupamiento en clústeres.

Son parte del kit de herramientas de optimización de modelos de TensorFlow, que proporciona recursos para técnicas de optimización de modelos compatibles con TensorFlow Lite.

Cuantización

La cuantización reduce la precisión de los números que se usan para representar los parámetros de un modelo, que, de forma predeterminada, son números de punto flotante de 32 bits. Esto da como resultado un tamaño de modelo más pequeño y un procesamiento más rápido.

Los siguientes tipos de cuantización están disponibles en TensorFlow Lite:

Técnica Requisitos de los datos Reducción de tamaño Exactitud Hardware compatible
Cuantización de float16 posterior al entrenamiento No hay datos Hasta el 50% Pérdida de exactitud insignificante CPU, GPU
Cuantización del rango dinámico posterior al entrenamiento No hay datos Hasta un 75% Pérdida de exactitud mínima CPU, GPU (Android)
Cuantización de números enteros posterior al entrenamiento Muestra representativa sin etiqueta Hasta un 75% Pérdida de exactitud pequeña CPU, GPU (Android) y EdgeTPU
Entrenamiento con cuantización Datos de entrenamiento etiquetados Hasta un 75% Pérdida de exactitud mínima CPU, GPU (Android) y EdgeTPU

El siguiente árbol de decisión te ayuda a seleccionar los esquemas de cuantización que puedes usar para tu modelo, según la exactitud y el tamaño esperados del modelo.

árbol de cuantización-decisión

A continuación, se muestran los resultados de latencia y exactitud para la cuantización posterior al entrenamiento y el entrenamiento con cuantización en algunos modelos. Todas las cifras de latencia se miden en dispositivos Pixel 2 con una sola CPU de gran núcleo. A medida que mejore el kit de herramientas, también lo harán los números aquí:

Modelo Precisión superior (original) Precisión superior (cuantizada después del entrenamiento) Exactitud máxima (entrenamiento de cuantización) Latencia (original) (ms) Latencia (cuantizada posterior al entrenamiento) (ms) Latencia (entrenamiento de reconocimiento de la cuantización) (ms) Tamaño (original) (MB) Tamaño (optimizado) (MB)
Mobilenet-v1-1-2240,7090,6570.70 1241126416,94.3
Mobilenet-v2-1-2240,7190,6370,709 899854143.6
Inception_v30.780.7720,775 113084554395,723,9
Resnet_v2_1010,7700,768N/A 39732868N/A178,344,9
Tabla 1 Beneficios de la cuantización de modelos para modelos de CNN seleccionados

Cuantización de números enteros con activaciones de int16 y ponderaciones de int8

La cuantización con activaciones de int16 es un esquema de cuantización de números enteros completo con activaciones en int16 y ponderaciones en int8. Este modo puede mejorar la precisión del modelo cuantizado en comparación con el esquema de cuantización de números enteros completo con activaciones y pesos int8 manteniendo un tamaño de modelo similar. Se recomienda cuando las activaciones son sensibles a la cuantización.

NOTA: Actualmente, solo las implementaciones de kernels de referencia no optimizadas están disponibles en TFLite para este esquema de cuantización, por lo que, de forma predeterminada, el rendimiento será lento en comparación con los kernels int8. Actualmente, se puede acceder a todas las ventajas de este modo mediante hardware especializado o software personalizado.

A continuación, se muestran los resultados de precisión de algunos modelos que se benefician de este modo.

Modelo Tipo de métrica de exactitud Precisión (activaciones de float32) Precisión (activaciones de int8) Precisión (activaciones de int16)
Wav2letterWER6,7%7,7% 7,2%
DeepSpeech 0.5.1 (desplegado)CER6,13%43,67% 6,52%
YoloV3mAP(IOU=0.5)0,5770,563 0,574
MobileNetV1Precisión superior0,70620,694 0,6936
MobileNetV2Precisión superior0,7180,7126 0,7137
MobileBertF1(Concordancia exacta)88,81(81,23)2,08(0) 88,73(81,15)
Tabla 2 Beneficios de la cuantización de modelos con activaciones de int16

De poda

La reducción consiste en quitar parámetros dentro de un modelo que solo tienen un impacto mínimo en sus predicciones. Los modelos reducidos tienen el mismo tamaño en disco y la misma latencia de entorno de ejecución, pero se pueden comprimir de manera más eficaz. Esto hace que la reducción sea una técnica útil para reducir el tamaño de descarga del modelo.

En el futuro, TensorFlow Lite ofrecerá una reducción de latencia para los modelos reducidos.

Agrupamiento en clústeres

El agrupamiento en clústeres agrupa los pesos de cada capa de un modelo en una cantidad predefinida de clústeres y, luego, comparte los valores centroides de los pesos que pertenecen a cada clúster individual. Esto reduce la cantidad de valores de ponderación únicos en un modelo y, por lo tanto, reduce su complejidad.

Como resultado, los modelos agrupados en clústeres se pueden comprimir de manera más eficaz, lo que proporciona beneficios de implementación similares a la reducción.

Flujo de trabajo de desarrollo

Como punto de partida, comprueba si los modelos de los modelos alojados pueden funcionar para tu aplicación. De lo contrario, recomendamos que los usuarios comiencen con la herramienta de cuantización posterior al entrenamiento, ya que se aplica de manera amplia y no requiere datos de entrenamiento.

En los casos en los que no se cumplen los objetivos de precisión y latencia, o la compatibilidad con el acelerador de hardware es importante, el entrenamiento con cuantización es la mejor opción. Consulta técnicas de optimización adicionales en el kit de herramientas de optimización de modelos de TensorFlow.

Si deseas reducir aún más el tamaño de tu modelo, puedes intentar reducir o agrupar en clústeres antes de cuantificar los modelos.