Optimización del modelo

Los dispositivos perimetrales suelen tener una memoria o una capacidad de cálculo 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 la inferencia acelerada.

TensorFlow Lite y TensorFlow Model Optimization Toolkit brindan 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 del modelo puede ayudar con el desarrollo de aplicaciones.

Reducción de talla

Algunas formas de optimización se pueden utilizar 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 el agrupamiento pueden reducir el tamaño de un modelo para descargar al hacerlo más fácil de comprimir.

Reducción de latencia

La latencia es la cantidad de tiempo que lleva ejecutar una sola inferencia con un modelo dado. Algunas formas de optimización pueden reducir la cantidad de cómputo requerida para ejecutar la inferencia utilizando un modelo, lo que resulta en una latencia más baja. 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 al simplificar los cálculos que ocurren durante la inferencia, potencialmente a expensas de cierta precisión.

Compatibilidad con aceleradores

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 sean cuantificados de una manera específica. Consulte la documentación de cada acelerador de hardware para obtener más información sobre sus requisitos.

compensaciones

Las optimizaciones pueden generar cambios en la precisión del modelo, lo que debe tenerse en cuenta 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. Por lo general, los modelos optimizados para el tamaño o la latencia perderán una pequeña cantidad de precisión. Dependiendo de su aplicación, esto puede o no afectar la experiencia de sus usuarios. En casos excepcionales, ciertos modelos pueden obtener cierta precisión como resultado del proceso de optimización.

Tipos de optimización

TensorFlow Lite actualmente admite la optimización a través de la cuantificación, la poda y la agrupación.

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

cuantización

La cuantificación funciona al reducir la precisión de los números utilizados para representar los parámetros de un modelo, que por defecto son números de coma 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 cuantificación están disponibles en TensorFlow Lite:

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

El siguiente árbol de decisiones lo ayuda a seleccionar los esquemas de cuantificación que podría querer usar para su modelo, simplemente en función del 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 con una sola CPU de gran núcleo. A medida que mejore el conjunto de herramientas, también lo harán los números aquí:

Modelo Precisión Top-1 (Original) Precisión Top-1 (post-entrenamiento cuantificado) Precisión Top-1 (entrenamiento consciente de la cuantificación) Latencia (Original) (ms) Latencia (posterior al entrenamiento cuantificado) (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

Cuantificación completa de enteros con activaciones int16 y pesos int8

La cuantificación con activaciones int16 es un esquema de cuantificación de 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 cuantización.

NOTA: Actualmente, solo las implementaciones de kernel de referencia no optimizadas están disponibles en TFLite para este esquema de cuantificació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 de float32) Precisión (activaciones int8) Precisión (activaciones int16)
wav2letra NOSOTROS SOMOS 6,7% 7,7% 7,2%
DeepSpeech 0.5.1 (desenrollado) RCE 6,13% 43,67% 6,52%
YoloV3 mA (pagaré = 0,5) 0.577 0.563 0.574
MobileNetV1 Precisión Top-1 0.7062 0.694 0.6936
MobileNetV2 Precisión Top-1 0.718 0.7126 0.7137
MobileBert 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 de int16

Poda

La poda funciona mediante la eliminación de parámetros dentro de un modelo que solo tienen 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 con mayor eficacia. Esto hace que la poda sea una técnica útil para reducir el tamaño de descarga del modelo.

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

Agrupación

La agrupación en clústeres funciona agrupando los pesos de cada capa en un modelo en un número predefinido de clústeres y luego compartiendo los valores del centroide para los pesos que pertenecen a cada clúster individual. Esto reduce la cantidad de valores de peso únicos en un modelo, lo que reduce su complejidad.

Como resultado, los modelos agrupados se pueden comprimir de manera más efectiva, lo que brinda beneficios de implementación similares a la poda.

Flujo de trabajo de desarrollo

Como punto de partida, compruebe si los modelos de 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.

Para los casos en los que no se cumplen los objetivos de precisión y latencia, o en los que es importante la compatibilidad con el acelerador de hardware, la mejor opción es la capacitación consciente de la cuantificació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.