Créer et convertir des modèles

Les microcontrôleurs disposent d'une RAM et d'un stockage limités, ce qui impose des contraintes sur la taille des modèles d'apprentissage automatique. De plus, TensorFlow Lite for Microcontrollers prend actuellement en charge un sous-ensemble limité d'opérations, de sorte que toutes les architectures de modèles ne sont pas possibles.

Ce document explique le processus de conversion d'un modèle TensorFlow pour qu'il s'exécute sur des microcontrôleurs. Il décrit également les opérations prises en charge et donne des conseils sur la conception et la formation d'un modèle adapté à une mémoire limitée.

Pour un exemple exécutable de bout en bout de création et de conversion d’un modèle, consultez l’exemple Hello World .

Conversion de modèle

Pour convertir un modèle TensorFlow entraîné afin qu'il s'exécute sur des microcontrôleurs, vous devez utiliser l' API Python du convertisseur TensorFlow Lite . Cela convertira le modèle en FlatBuffer , réduisant la taille du modèle et le modifiera pour utiliser les opérations TensorFlow Lite.

Pour obtenir la taille de modèle la plus petite possible, vous devez envisager d'utiliser la quantification post-formation .

Convertir en tableau C

De nombreuses plates-formes de microcontrôleurs ne prennent pas en charge le système de fichiers natif. Le moyen le plus simple d'utiliser un modèle de votre programme est de l'inclure sous forme de tableau C et de le compiler dans votre programme.

La commande Unix suivante générera un fichier source C contenant le modèle TensorFlow Lite sous forme de char de caractères :

xxd -i converted_model.tflite > model_data.cc

Le résultat ressemblera à ce qui suit :

unsigned char converted_model_tflite[] = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  // <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;

Une fois que vous avez généré le fichier, vous pouvez l'inclure dans votre programme. Il est important de modifier la déclaration du tableau en const pour une meilleure efficacité de la mémoire sur les plateformes embarquées.

Pour un exemple de la façon d'inclure et d'utiliser un modèle dans votre programme, consultez hello_world_test.cc dans l'exemple Hello World .

Architecture du modèle et formation

Lors de la conception d'un modèle destiné à être utilisé sur des microcontrôleurs, il est important de prendre en compte la taille du modèle, la charge de travail et les opérations utilisées.

Taille du modèle

Un modèle doit être suffisamment petit pour tenir dans la mémoire de votre appareil cible aux côtés du reste de votre programme, à la fois en tant que binaire et au moment de l'exécution.

Pour créer un modèle plus petit, vous pouvez utiliser des couches moins nombreuses et plus petites dans votre architecture. Cependant, les petits modèles sont plus susceptibles de souffrir d'un sous-équipement. Cela signifie que pour de nombreux problèmes, il est logique d’essayer d’utiliser le modèle le plus grand pouvant tenir en mémoire. Cependant, l’utilisation de modèles plus grands entraînera également une augmentation de la charge de travail du processeur.

Charge de travail

La taille et la complexité du modèle ont un impact sur la charge de travail. Les modèles volumineux et complexes peuvent entraîner un cycle de service plus élevé, ce qui signifie que le processeur de votre appareil passe plus de temps à travailler et moins de temps inactif. Cela augmentera la consommation d’énergie et la production de chaleur, ce qui peut poser problème en fonction de votre application.

Soutien opérationnel

TensorFlow Lite for Microcontrollers prend actuellement en charge un sous-ensemble limité d'opérations TensorFlow, ce qui a un impact sur les architectures de modèles qu'il est possible d'exécuter. Nous travaillons à étendre le support opérationnel, à la fois en termes d'implémentations de référence et d'optimisations pour des architectures spécifiques.

Les opérations prises en charge peuvent être vues dans le fichier micro_mutable_ops_resolver.h

,

Les microcontrôleurs disposent d'une RAM et d'un stockage limités, ce qui impose des contraintes sur la taille des modèles d'apprentissage automatique. De plus, TensorFlow Lite for Microcontrollers prend actuellement en charge un sous-ensemble limité d'opérations, de sorte que toutes les architectures de modèles ne sont pas possibles.

Ce document explique le processus de conversion d'un modèle TensorFlow pour qu'il s'exécute sur des microcontrôleurs. Il décrit également les opérations prises en charge et donne des conseils sur la conception et la formation d'un modèle adapté à une mémoire limitée.

Pour un exemple exécutable de bout en bout de création et de conversion d’un modèle, consultez l’exemple Hello World .

Conversion de modèle

Pour convertir un modèle TensorFlow entraîné afin qu'il s'exécute sur des microcontrôleurs, vous devez utiliser l' API Python du convertisseur TensorFlow Lite . Cela convertira le modèle en FlatBuffer , réduisant la taille du modèle et le modifiera pour utiliser les opérations TensorFlow Lite.

Pour obtenir la taille de modèle la plus petite possible, vous devez envisager d'utiliser la quantification post-formation .

Convertir en tableau C

De nombreuses plates-formes de microcontrôleurs ne prennent pas en charge le système de fichiers natif. Le moyen le plus simple d'utiliser un modèle de votre programme est de l'inclure sous forme de tableau C et de le compiler dans votre programme.

La commande Unix suivante générera un fichier source C contenant le modèle TensorFlow Lite sous forme de char de caractères :

xxd -i converted_model.tflite > model_data.cc

Le résultat ressemblera à ce qui suit :

unsigned char converted_model_tflite[] = {
  0x18, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x00, 0x00, 0x0e, 0x00,
  // <Lines omitted>
};
unsigned int converted_model_tflite_len = 18200;

Une fois que vous avez généré le fichier, vous pouvez l'inclure dans votre programme. Il est important de modifier la déclaration du tableau en const pour une meilleure efficacité de la mémoire sur les plateformes embarquées.

Pour un exemple de la façon d'inclure et d'utiliser un modèle dans votre programme, consultez hello_world_test.cc dans l'exemple Hello World .

Architecture du modèle et formation

Lors de la conception d'un modèle destiné à être utilisé sur des microcontrôleurs, il est important de prendre en compte la taille du modèle, la charge de travail et les opérations utilisées.

Taille du modèle

Un modèle doit être suffisamment petit pour tenir dans la mémoire de votre appareil cible aux côtés du reste de votre programme, à la fois en tant que binaire et au moment de l'exécution.

Pour créer un modèle plus petit, vous pouvez utiliser des couches moins nombreuses et plus petites dans votre architecture. Cependant, les petits modèles sont plus susceptibles de souffrir d'un sous-équipement. Cela signifie que pour de nombreux problèmes, il est logique d’essayer d’utiliser le modèle le plus grand pouvant tenir en mémoire. Cependant, l’utilisation de modèles plus grands entraînera également une augmentation de la charge de travail du processeur.

Charge de travail

La taille et la complexité du modèle ont un impact sur la charge de travail. Les modèles volumineux et complexes peuvent entraîner un cycle de service plus élevé, ce qui signifie que le processeur de votre appareil passe plus de temps à travailler et moins de temps inactif. Cela augmentera la consommation d’énergie et la production de chaleur, ce qui peut poser problème en fonction de votre application.

Soutien opérationnel

TensorFlow Lite for Microcontrollers prend actuellement en charge un sous-ensemble limité d'opérations TensorFlow, ce qui a un impact sur les architectures de modèles qu'il est possible d'exécuter. Nous travaillons à étendre le support opérationnel, à la fois en termes d'implémentations de référence et d'optimisations pour des architectures spécifiques.

Les opérations prises en charge peuvent être vues dans le fichier micro_mutable_ops_resolver.h