Clustering pondéré

Géré par Arm ML Tooling

Ce document propose une vue d'ensemble du clustering pondéré pour vous aider à déterminer si cette technique est adaptée à votre cas d'utilisation.

Aperçu

Le clustering, ou partage de poids, réduit le nombre de valeurs de poids uniques dans un modèle, ce qui entraîne des avantages pour le déploiement. Il regroupe d'abord les poids de chaque couche en N clusters, puis partage la valeur de centroïde du cluster pour tous les poids appartenant au cluster.

Cette technique apporte des améliorations via la compression de modèles. La future compatibilité avec un framework permettra de bénéficier d'améliorations sur le plan de l'empreinte mémoire, ce qui peut s'avérer déterminant pour le déploiement de modèles de deep learning sur des systèmes intégrés disposant de ressources limitées.

Nous avons testé le clustering sur des tâches visuelles et vocales. Pour la compression de modèles, nous avons observé des performances multipliées par cinq avec une perte de justesse minimale, comme le montrent les résultats présentés ci-dessous.

Veuillez noter qu'avec le clustering, les avantages sont moindres pour les couches denses et convolutives qui précèdent une couche de normalisation des lots, ainsi qu'en combinaison avec la quantification post-entraînement par axe.

Matrice de compatibilité des API

Les utilisateurs peuvent appliquer le clustering à l'aide des API suivantes :

  • Création de modèles : tf.keras avec uniquement des modèles séquentiels et fonctionnels
  • Versions de TensorFlow : TF 1.x pour les versions 1.14+ et 2.x.
    • tf.compat.v1 avec un package TF 2.X et tf.compat.v2 avec un package TF 1.X ne sont pas compatibles.
  • Modes d'exécution de TensorFlow : graphe et eager

Résultats

Classification d'images

Modèle Source En cluster
Justesse Top-1 (%) Taille du fichier .tflite compressé (Mo) Configuration Nombre de clusters Justesse Top-1 (%) Taille du fichier .tflite compressé (Mo)
MobileNetV1 70,976 14,97
Sélective (les trois dernières couches Conv2D) 16, 16, 16 70,294 7,69
Sélective (les trois dernières couches Conv2D) 32, 32, 32 70,69 8,22
Complète (toutes les couches Conv2D) 32 69,4 4,43
MobileNetV2 71,778 12,38
Sélective (les trois dernières couches Conv2D) 16, 16, 16 70,742 6,68
Sélective (les trois dernières couches Conv2D) 32, 32, 32 70,926 7,03
Complète (toutes les couches Conv2D) 32 69,744 4,05

Les modèles ont été entraînés et testés sur ImageNet.

Détection de mots clés

Modèle Source En cluster
Justesse Top-1 (%) Taille du fichier .tflite compressé (Mo) Configuration Nombre de clusters Justesse Top-1 (%) Taille du fichier .tflite compressé (Mo)
DS-CNN-L 95,233 1,46
Complète (toutes les couches Conv2D) 32 95,09 0,39
Complète (toutes les couches Conv2D) 8 94,272 0,27

Le modèle a été entraîné et testé sur SpeechCommands v0.02.

  1. Sérialiser le modèle Keras dans un fichier .h5
  2. Convertir le fichier .h5 au format .tflite en utilisant TFLiteConverter.from_keras_model_file()
  3. Compresser le fichier .tflite au format ZIP

Exemples

Outre l'exemple de clustering pondéré dans Keras, consultez les exemples suivants :

  • Mettre en cluster les poids d'un modèle CNN entraîné sur l'ensemble de données de classification des chiffres manuscrits MNIST : code

L'implémentation du clustering pondéré est basée sur l'article Deep Compression: Compressing Deep Neural Networks With Pruning, Trained Quantization and Huffman Coding. Consultez le chapitre 3 intitulé Quantification entraînée et partage de pondération.