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.
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-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 |
Inception_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 |
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) |
---|---|---|---|---|
Wav2letter | WER | 6,7% | 7,7% | 7,2% |
DeepSpeech 0.5.1 (desplegado) | CER | 6,13% | 43,67% | 6,52% |
YoloV3 | mAP(IOU=0.5) | 0,577 | 0,563 | 0,574 |
MobileNetV1 | Precisión superior | 0,7062 | 0,694 | 0,6936 |
MobileNetV2 | Precisión superior | 0,718 | 0,7126 | 0,7137 |
MobileBert | F1(Concordancia exacta) | 88,81(81,23) | 2,08(0) | 88,73(81,15) |
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.