Optimización del modelo

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

TensorFlow Lite y TensorFlow Model Optimization Toolkit proporcionan herramientas para minimizar la complejidad de optimizar la inferencia.

Se recomienda que considere la optimización del modelo durante el proceso de desarrollo de su aplicación. Este documento describe algunas de las mejores prácticas para optimizar los modelos de TensorFlow para su implementación en hardware perimetral.

Por qué se deben optimizar los modelos

Hay varias formas principales en que la optimización de modelos puede ayudar con el desarrollo de aplicaciones.

Reducción de talla

Se pueden utilizar 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 sus usuarios. Por ejemplo, una aplicación de Android que utilice un modelo más pequeño ocupará menos espacio de almacenamiento en el dispositivo móvil de un usuario.
  • Tamaño de descarga más pequeño: los modelos más pequeños requieren menos tiempo y ancho de banda para descargar 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 su aplicación y puede traducirse en un mejor rendimiento y estabilidad.

La cuantificación puede reducir el tamaño de un modelo en todos estos casos, potencialmente a expensas de cierta precisión. La poda y la agrupación en clústeres pueden reducir el tamaño de un modelo para descargar haciéndolo más fácilmente comprimible.

Reducción de latencia

La latencia es la cantidad de tiempo que lleva ejecutar una única inferencia con un modelo determinado. Algunas formas de optimización pueden reducir la cantidad de cálculo necesaria para ejecutar la inferencia utilizando un modelo, lo que resulta en una menor latencia. La latencia también puede tener un impacto en el consumo de energía.

Actualmente, la cuantificación se puede utilizar para reducir la latencia simplificando los cálculos que ocurren durante la inferencia, potencialmente a expensas de cierta precisión.

Compatibilidad del acelerador

Algunos aceleradores de hardware, como Edge TPU , pueden ejecutar inferencias extremadamente rápido con modelos que se han optimizado correctamente.

Generalmente, este tipo de dispositivos requieren que los modelos estén cuantizados de una forma específica. Consulte la documentación de cada acelerador de hardware para obtener más información sobre sus requisitos.

Compensaciones

Las optimizaciones pueden potencialmente dar lugar a cambios en la precisión del modelo, que deben considerarse durante el proceso de desarrollo de la aplicación.

Los cambios de precisión dependen del modelo individual que se optimice y son difíciles de predecir con anticipación. Generalmente, los modelos optimizados en cuanto a tamaño o latencia perderán una pequeña cantidad de precisión. Dependiendo de su aplicación, esto puede afectar o no la experiencia de sus usuarios. En casos raros, ciertos modelos pueden ganar cierta precisión como resultado del proceso de optimización.

Tipos de optimización

TensorFlow Lite actualmente admite la optimización mediante cuantificación, poda y agrupación.

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

Cuantización

La cuantificación funciona reduciendo la precisión de los números utilizados para representar los parámetros de un modelo, que por defecto son números de punto flotante de 32 bits. Esto da como resultado un tamaño de modelo más pequeño y un cálculo más rápido.

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

Técnica Requerimientos de datos Reducción de talla Exactitud Hardware compatible
Cuantización float16 post-entrenamiento Sin datos Hasta 50% Pérdida de precisión insignificante CPU, GPU
Cuantización del rango dinámico post-entrenamiento Sin datos Hasta 75% Pérdida de precisión más pequeña CPU, GPU (Android)
Cuantización de enteros post-entrenamiento Muestra representativa sin etiquetar Hasta 75% Pequeña pérdida de precisión CPU, GPU (Android), EdgeTPU, DSP hexagonal
Entrenamiento consciente de la cuantificación Datos de entrenamiento etiquetados Hasta 75% Pérdida de precisión más pequeña CPU, GPU (Android), EdgeTPU, DSP hexagonal

El siguiente árbol de decisiones le ayuda a seleccionar los esquemas de cuantificación que quizás desee utilizar para su modelo, basándose simplemente en el tamaño y la precisión esperados del modelo.

árbol-de-decisión-de-cuantización

A continuación se muestran los resultados de latencia y precisión para la cuantificación posterior al entrenamiento y el entrenamiento consciente de la cuantificación en algunos modelos. Todos los números de latencia se miden en dispositivos Pixel 2 utilizando una única CPU de gran núcleo. A medida que el conjunto de herramientas mejore, también lo harán los números aquí:

Modelo Precisión Top-1 (Original) Precisión Top-1 (cuantificada después del entrenamiento) Precisión Top-1 (entrenamiento consciente de la cuantificación) Latencia (original) (ms) Latencia (cuantificada después del entrenamiento) (ms) Latencia (entrenamiento consciente de la cuantificación) (ms) Tamaño (Original) (MB) Tamaño (optimizado) (MB)
Mobilenet-v1-1-224 0.709 0,657 0,70 124 112 64 16.9 4.3
Mobilenet-v2-1-224 0.719 0,637 0.709 89 98 54 14 3.6
Inicio_v3 0,78 0,772 0,775 1130 845 543 95,7 23.9
Resnet_v2_101 0.770 0,768 N / A 3973 2868 N / A 178,3 44,9
Tabla 1 Beneficios de la cuantificación del modelo para modelos CNN seleccionados

Cuantización entera completa con activaciones int16 y pesos int8

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

NOTA: Actualmente, solo están disponibles en TFLite implementaciones de kernel de referencia no optimizadas 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 a través de 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 precisión Precisión (activaciones float32) Precisión (activaciones int8) Precisión (activaciones int16)
letra wav2 NOSOTROS SOMOS 6,7% 7,7% 7,2%
DeepSpeech 0.5.1 (desenrollado) CER 6,13% 43,67% 6,52%
YoloV3 mapa(pagaré=0,5) 0,577 0.563 0.574
MóvilNetV1 Precisión Top-1 0.7062 0,694 0.6936
MóvilNetV2 Precisión Top-1 0,718 0.7126 0.7137
MóvilBert F1 (coincidencia exacta) 88,81(81,23) 2.08(0) 88,73(81,15)
Tabla 2 Beneficios de la cuantificación del modelo con activaciones int16

Poda

La poda funciona eliminando parámetros dentro de un modelo que tienen solo un impacto menor en sus predicciones. Los modelos eliminados tienen el mismo tamaño en el disco y tienen la misma latencia de tiempo de ejecución, pero se pueden comprimir de manera más efectiva. Esto hace que la poda sea una técnica útil para reducir el tamaño de descarga del modelo.

En el futuro, TensorFlow Lite proporcionará reducción de latencia para modelos podados.

Agrupación

La agrupación funciona agrupando los pesos de cada capa en un modelo en un número predefinido de grupos y luego comparte los valores del centroide para los pesos que pertenecen a cada grupo individual. Esto reduce la cantidad de valores de peso únicos en un modelo, reduciendo así su complejidad.

Como resultado, los modelos agrupados se pueden comprimir de forma más eficaz, proporcionando beneficios de implementación similares a los de la poda.

Flujo de trabajo de desarrollo

Como punto de partida, verifique si los modelos alojados pueden funcionar para su aplicación. De lo contrario, recomendamos que los usuarios comiencen con la herramienta de cuantificación posterior al entrenamiento , ya que es ampliamente aplicable y no requiere datos de entrenamiento.

En los casos en los que no se cumplan los objetivos de precisión y latencia, o en los que la compatibilidad con el acelerador de hardware sea importante, la capacitación consciente de la cuantificación es la mejor opción. Consulte técnicas de optimización adicionales en el kit de herramientas de optimización de modelos de TensorFlow .

Si desea reducir aún más el tamaño de su modelo, puede intentar podar y/o agrupar antes de cuantificar sus modelos.