Principes
pyml2fpga est un package Python conçu pour convertir des modèles d’apprentissage automatique entraînés en noyaux de propriété intellectuelle (IP) VHDL afin de les intégrer dans le firmware des FPGA. L’outil fonctionne selon un flux de travail structuré en plusieurs étapes, détaillées ci-dessous.
Principe de l’algorithme
On commence par la description couche par couche du modèle (un fichier .h5 Keras), qui est transformée en un graphe acyclique orienté (DAG). Dans ce graphe, chaque nœud représente un calcul produisant un flux de données unique. Les utilisateurs peuvent définir la granularité des nœuds de calcul, influençant ainsi le niveau de détail de l’arbre de traitement. Chaque nœud possède des attributs obligatoires (type et taille du flux de sortie) et des attributs optionnels (options de configuration, quantification, etc.). Une fonction de parcours récursif permet d’effectuer l’inférence sur l’ensemble du réseau.
Ensuite, une fonction de hachage calcule une empreinte numérique pour chaque nœud en fonction de son type et de sa configuration (en excluant la taille du flux de données et les paramètres constants). Les nœuds ayant des empreintes uniques sont enregistrés dans un dictionnaire de composants, garantissant un ensemble minimal de composants pour l’inférence.
Une unité de traitement est une instance d’un composant. Les utilisateurs spécifient la multiplicité (nombre d’instances) pour chaque composant. L’outil énumère alors toutes les transmissions de flux de données nécessaires à l’inférence, en définissant les tâches comme des transferts entre unités de traitement. Chaque tâche possède un temps de début, des unités d’origine et de destination, ainsi qu’un nœud associé. L’objectif de cette étape est de planifier cet ensemble de tâches tout en minimisant diverses valeurs (durée totale, nombre de combinaisons de connexions entre unités de traitement).
Chaque unité de traitement est ensuite transformée en une combinaison de :
- multiplexeurs,
- un élément de traitement (entité HDL),
- une RAM (pour le stockage des flux de données),
- et des démultiplexeurs.
Le réseau est enfin encapsulé dans un wrapper VHDL. Les tâches sont converties en une liste d’instructions, qui rythme le fonctionnement du système. Un décodeur d’instructions contrôle le routage et l’accès à la RAM, appliquant la séquence optimisée issue de la planification.
Tests
L’outil prend actuellement en charge uniquement les couches de réseaux de neurones denses et convolutionnels (CNN). Nous avons donc utilisé pour nos tests un autoencodeur CNN léger conçu pour détecter en temps réel des signaux d’ondes gravitationnelles.
Nous avons utilisé notre outil pour créer une IP de réseau et l’avons déployée sur un FPGA Intel Arria10. Cette implémentation a ensuite été comparée à celle obtenue avec HLS4ml (en utilisant Intel HLS/Arria10 et Xilinx Vitis HLS/Zynq Ultrascale+).
En termes de latence, pyML2FPGA obtient les meilleures performances (17 000 cycles), contre 32 000 à 116 000 cycles pour les implémentations HLS4ml (selon la valeur du facteur de réutilisation).
En termes de ressources, les performances de l’implémentation VHDL sont également très prometteuses :
- Moins de ressources logiques que l’approche HLS (9 000 ALM (2 %) contre 51 000 à 69 000 (12–30 %)),
- Moins de mémoire et de DSP dans la plupart des cas.
Conclusion
pyml2fpga propose une approche unique pour convertir des modèles de ML en IP prêts pour FPGA, en mettant l’accent sur la flexibilité, le contrôle et la modularité. En évitant les outils HLS et propriétaires, il offre un flux de travail transparent et centré sur l’utilisateur, adapté à diverses cibles matérielles, y compris les appareils anciens ou contraints en ressources.