Path: blob/master/site/es-419/lite/performance/model_optimization.md
25118 views
Optimización de modelos
Los dispositivos Edge suelen tener una memoria o una potencia de cálculo limitadas. Pueden aplicarse diversas optimizaciones a los modelos para que puedan ejecutarse dentro de estas limitaciones. Además, algunas optimizaciones permiten usar hardware especializado para acelerar la inferencia.
TensorFlow Lite y el TensorFlow Model Optimization Toolkit ofrecen herramientas para minimizar la complejidad de la optimización de la inferencia.
Es recomendable que considere la optimización de modelos durante el proceso de desarrollo de su aplicación. Este documento describe algunas de las mejores prácticas para optimizar los modelos TensorFlow para su implementación en hardware EDGE.
Por qué deben optimizarse los modelos
Hay varias formas principales en las que la optimización de modelos puede ayudar en el desarrollo de aplicaciones.
Reducción de tamaño
Algunas formas de optimización pueden usarse para reducir el tamaño de un modelo. Los modelos más pequeños tienen los siguientes beneficios:
Menor tamaño de almacenamiento: Los modelos más pequeños ocupan menos espacio de almacenamiento en los dispositivos de sus 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.
Menor tamaño de descarga: 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 utilizan menos memoria 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 cuantizació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 pueden reducir el tamaño de un modelo para su descarga haciéndolo más fácilmente compresible.
Reducción de la latencia
La latencia es la cantidad de tiempo que se tarda en ejecutar una única inferencia con un modelo dado. Algunas formas de optimización pueden reducir la cantidad de cálculo necesaria para ejecutar la inferencia usando 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 cuantización puede usarse para reducir la latencia simplificando los cálculos que se producen durante la inferencia, potencialmente a expensas de cierta precisión.
Compatibilidad del acelerador
Algunos aceleradores de hardware, como el Edge TPU, pueden ejecutar la inferencia extremadamente rápido con modelos que hayan sido correctamente optimizados.
Por lo general, este tipo de dispositivos requieren que los modelos se cuantifiquen de una manera específica. Consulte la documentación de cada acelerador de hardware para saber más sobre sus requisitos.
Contrapartidas
Las optimizaciones pueden dar lugar a cambios en la precisión del modelo, que deben tenerse en cuenta durante el proceso de desarrollo de la aplicación.
Los cambios en la precisión dependen del modelo individual que se esté optimizando y son difíciles de predecir con antelación. Por lo general, los modelos que se optimizan para el tamaño o la latencia perderán una pequeña cantidad de precisión. Dependiendo de su aplicación, esto puede afectar o no a la experiencia de sus usuarios. En raras ocasiones, algunos modelos pueden ganar algo de precisión como resultado del proceso de optimización.
Tipos de optimización
TensorFlow Lite admite actualmente la optimización mediante la cuantización, la poda y la agrupación.
Éstas forman parte del TensorFlow Model Optimization Toolkit, que ofrece recursos para técnicas de optimización de modelos compatibles con TensorFlow Lite.
Cuantización
La cuantización funciona reduciendo la precisión de los números usados para representar los parámetros de un modelo, que de forma predeterminada son números de punto flotante de 32 bits. Esto resulta en un modelo de menor tamaño y un cálculo más rápido.
Los siguientes tipos de cuantización están disponibles en TensorFlow Lite:
Técnica | Requisitos de datos | Reducción de tamaño | Precisión | Hardware compatible |
---|---|---|---|---|
Cuantización de float16 posentrenamiento | Sin datos | Hasta 50% | Pérdida de precisión insignificante | CPU, GPU |
Cuantización del rango dinámico postentrenamiento | Sin datos | Hasta 75% | La menor pérdida de precisión | CPU, GPU (Android) |
Cuantización entera postentrenamiento | Muestra representativa sin etiquetar | Hasta 75% | Pequeña pérdida de precisión | CPU, GPU (Android), EdgeTPU, Hexagon DSP |
Entrenamiento consciente de la cuantización | Datos de entrenamiento etiquetados | Hasta 75% | La menor pérdida de precisión | CPU, GPU (Android), EdgeTPU, Hexagon DSP |
El siguiente árbol de decisión le ayuda a seleccionar los esquemas de cuantización que puede querer usar para su modelo, basándose simplemente en el tamaño y la precisión esperados del modelo.
A continuación se muestran los resultados de latencia y precisión para la cuantización postentrenamiento y el entrenamiento consciente de la cuantización en algunos modelos. Todas las cifras de latencia se han medido en dispositivos Pixel 2 usando una CPU de núcleo grande. A medida que mejore el conjunto de herramientas, también lo harán los números aquí:
Model | Top-1 Accuracy (Original) | Top-1 Accuracy (Post Training Quantized) | Top-1 Accuracy (Quantization Aware Training) | Latency (Original) (ms) | Latency (Post Training Quantized) (ms) | Latency (Quantization Aware Training) (ms) | Size (Original) (MB) | Size (Optimized) (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 entera con activaciones int16 y ponderaciones int8
Cuantificación con activaciones int16 es un esquema de cuantización entero 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 entera completa con activaciones y ponderaciones en int8 manteniendo un tamaño de modelo similar. Se recomienda cuando las activaciones son sensibles a la cuantización.
NOTA: Actualmente sólo se dispone en TFLite de implementaciones no optimizadas del kernel de referencia 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 son útiles en este modo.
Model | Accuracy metric type | Accuracy (float32 activations) | Accuracy (int8 activations) | Accuracy (int16 activations) |
---|---|---|---|---|
Wav2letter | WER | 6.7% | 7.7% | 7.2% |
DeepSpeech 0.5.1 (unrolled) | CER | 6.13% | 43.67% | 6.52% |
YoloV3 | mAP(IOU=0.5) | 0.577 | 0.563 | 0.574 |
MobileNetV1 | Top-1 Accuracy | 0.7062 | 0.694 | 0.6936 |
MobileNetV2 | Top-1 Accuracy | 0.718 | 0.7126 | 0.7137 |
MobileBert | F1(Exact match) | 88.81(81.23) | 2.08(0) | 88.73(81.15) |
Poda
La poda funciona eliminando parámetros dentro de un modelo que sólo tienen un impacto menor en sus predicciones. Los modelos podados tienen el mismo tamaño en disco y la misma latencia runtime, pero pueden comprimirse con mayor eficacia. Esto hace que la poda sea una técnica útil para reducir el tamaño de descarga de los modelos.
En el futuro, TensorFlow Lite ofrecerá una reducción de latencia para los modelos podados.
Agrupación
La agrupación funciona agrupando las ponderaciones de cada capa de un modelo en un número predefinido de clusters y compartiendo después los valores del centroide de las ponderaciones pertenecientes a cada cluster individual. Esto reduce el número de valores de ponderación únicos en un modelo, reduciendo así su complejidad.
Como resultado, los modelos agrupados pueden comprimirse con mayor eficacia, lo que ofrece beneficios de implementación similares a la poda.
Flujo de trabajo de desarrollo
Como punto de partida, revise si los modelos de modelos alojados pueden funcionar para su aplicación. Si no es así, recomendamos a los usuarios que empiecen con la herramienta de cuantización posterior al entrenamiento, ya que es ampliamente aplicable y no requiere datos de entrenamiento.
Para los casos en los que no se cumplan los objetivos de precisión y latencia, o sea importante la compatibilidad con aceleradores de hardware, la mejor opción es el entrenamiento basado en la cuantización{:.external}. Consulte técnicas de optimización adicionales en TensorFlow Model Optimization Toolkit.
Si desea reducir aún más el tamaño de su modelo, puede intentar la poda y/o el agrupamiento antes de cuantizar sus modelos.