FPGA AI Suite

Lorsque l’on travaille avec un FPGA et que l’on souhaite exécuter un réseau de neurones deux approches sont possibles :

  • Description du réseaux de neurones au sein d’un design qui est ensuite implémenté dans le FPGA. Pour exécuter des réseaux de neurones différents, il faut reprogrammer le FPGA à chaque fois.
  • Description d’un processeur neuronal que l’on implémente dans le FPGA. Le processeur est par la suite capable d’exécuter différents réseaux sans que l’on ait à reprogrammer le FPGA.

Les processeurs sont grandement customisables en fonction des réseaux que l’on déploie :

  • Choix des couches supportées.
  • Taille des données
  • Agencement des modules calculatoires (certaines configurations sont préférables pour les CNN et d’autres pour les MLP)
  • Etc …

Pour le moment la solution est compatible avec les deux cartes suivantes :

Carte DE10-Agilex
Carte PAC Arria 10 GX

Principe de fonctionnement

Le déploiement d’un modèle se fait en différentes étapes qui utilisent des logiciels propres :

Conversion d’un réseau avec OpenVINO

OpenVINO est un outil qui permet de prendre un modèle décrit avec les frameworks de deep learning classiques :

  • Tensorflow
  • Pythorch
  • Caffe

Puis de le convertir en ensemble de fichiers qui seront compréhensibles par le processeur neuronal que l’on aura décrit.

Le processeur neuronal

Au sein d’un fichier (.arch) on retrouve toutes les caractéristiques du processeur. Il est possible grâce à des programmes de l’optimiser en fonction de l’application que l’on cible.

Une fois que le processeur est convenable, un programme permet de générer un bitstream.

Enfin, à l’aide d’une commande particulière on programme le FPGA avec le bitstream généré.

Inférence

Au sein de FPGA AI Suite, l’outil benchmark_app permet de réaliser l’inférence de réseaux neuronaux et de récupérer les données relatives aux performances d’exécutions.

Il existe 2 modes d’inférence différents :

  • Just-In-Time : Le réseau est compilé au moment de l’inférence.
  • Ahead-of-Time : Le réseau a été compilé au préalable.

Voici sous forme de graphique le workflow d’Intel Ai Suite :

Performances sur les réseaux challenges

Les performances qui suivent sont données en fonction de 3 paramètres que l’on fait varier au fils des inférences :

  • -niter : Nombre d’entrées à traiter.
  • -nireq : Nombre d’exécutions en parallèle (sous multiple de niter).
  • -api : Mode dans lequel on utilise l’API (async ou sync).
-api-niter-nireqFPS JITFPS AOT
async12614 0466 650
async12413 9827 252
async12311 5056 477
async1229 7526 073
async1216 4844 391
sync12X13 0568 704
Résultats CH1

-api-niter-nireqFPS JITFPS AOT
async12618 4897 245
async12415 0037 503
async12314 0036 525
async12213 5145 747
async1216 1784 198
sync12X16 31610 294
Résultats CH3

-api-niter-nireqFPS JITFPS AOT
async12614 0538 400
async12411 8487 643
async12310 9877 576
async1228 2255 925
async1216 1785 421
sync12X9 2247 711
Résultats CH4

-api-niter-nireqFPS JITFPS AOT
async12618 6627 498
async12413 5066 903
async12313 4506 281
async12211 0755 852
async1216 3174 116
sync12X14 0239 596
Résultats CH5

Conclusion

Avantages :

  • Ne nécessite pas d’apprendre de nouveaux frameworks : utilisation de modèles Keras, Pytorch etc…
  • Optimisation du processeur en fonction de l’application.
  • Programmation statique du bitstream relatif au processeur puis exécution dynamique des réseaux.

inconvénients :

  • Technologie en développement : supportée pas 2 cartes spécifiques.
  • Nécessite une configuration particulière : Ubuntu 18.04, 48 Gb de RAM.