Agrupamiento en clústeres por peso

Mantenido por Arm ML Tooling

En este documento, se proporciona una descripción general sobre el agrupamiento en clústeres por peso para que puedas determinar cómo se adapta a tu caso de uso.

Resumen

El agrupamiento en clústeres, o el uso de pesos compartidos, reduce la cantidad de valores de peso únicos en un modelo, lo que genera beneficios para la implementación. Primero, agrupa los pesos de cada capa en N clústeres; luego, comparte el valor centroide del clúster con todos los pesos que pertenecen al clúster.

Esta técnica permite realizar mejoras mediante la compresión de modelos. La compatibilidad con marcos de trabajo en el futuro puede desbloquear mejoras en el uso de la memoria, que marquen una diferencia crucial para implementar modelos de aprendizaje profundo en sistemas incorporados con recursos limitados.

Experimentamos con la agrupación en clústeres en las tareas de visión y de voz. Observamos hasta 5 mejoras en la compresión de modelos con una pérdida de exactitud mínima, como se demuestra en los resultados de más abajo.

Ten en cuenta que la agrupación en clústeres brinda beneficios limitados para capas densas y convolucionales que preceden a una capa de normalización por lotes, así como también, en combinación con la cuantización por eje posterior al entrenamiento.

Matriz de compatibilidad de API

Los usuarios pueden aplicar el agrupamiento en clústeres con las siguientes API:

  • Compilación de modelos: tf.keras solo con modelos secuenciales y funcionales
  • Versiones de TensorFlow: TF 1.x para las versiones 2.x y las posteriores a 1.14.
    • tf.compat.v1 con un paquete TF 2.X y tf.compat.v2 con un paquete TF 1.X no son compatibles
  • Modo de ejecución de TensorFlow: inmediata y por grafos

Resultados

Clasificación de imágenes

Modelo Original Agrupado
Precisión más alta (%) Tamaño del .tflite comprimido (MB) Configuración Cantidad de clústeres Precisión más alta (%) Tamaño del .tflite comprimido (MB)
MobileNetV1 70.976 14.97
Selectivo (últimas 3 capas de Conv2D) 16, 16, 16 70.294 7.69
Selectivo (últimas 3 capas de Conv2D) 32, 32, 32 70.69 8.22
Completo (todas las capas de Conv2D) 32 69.4 4.43
MobileNetV2 71.778 12.38
Selectivo (últimas 3 capas de Conv2D) 16, 16, 16 70.742 6.68
Selectivo (últimas 3 capas de Conv2D) 32, 32, 32 70.926 7.03
Completo (todas las capas de Conv2D) 32 69.744 4.05

Los modelos se entrenaron y probaron en ImageNet.

Detección de palabras clave

Modelo Original Agrupado
Precisión más alta (%) Tamaño del .tflite comprimido (MB) Configuración Cantidad de clústeres Precisión más alta (%) Tamaño del .tflite comprimido (MB)
DS-CNN-L 95.233 1.46
Completo (todas las capas de Conv2D) 32 95.09 0.39
Completo (todas las capas de Conv2D) 8 94.272 0.27

El modelo se entrenó y probó en SpeechCommands v0.02.

  1. Serializa el modelo de Keras a un archivo .h5.
  2. Convierte el archivo .h5 en .tflite con TFLiteConverter.from_keras_model_file()
  3. Comprime el archivo .tflite en un archivo ZIP

Ejemplos

Además del ejemplo de agrupamiento en clústeres de Keras, puedes consultar los siguientes ejemplos:

  • Agrupa los pesos de un modelo de CNN entrenado con el conjunto de datos de clasificación de dígitos escritos a mano de MNIST: código

La implementación del agrupamiento en clústeres por peso se basa en el artículo Deep Compression: Compressing Deep Neural Networks With Pruning, Trained Quantization and Huffman Coding (Compresión profunda: Compresión de redes neuronales profundas con reducción, cuantización entrenada y codificación Huffman). Consulta el capítulo 3, titulado Trained Quantization and Weight Sharing (La cuantización entrenada y el uso de pesos compartidos).