Vous avez dit ONNX ?

L'Intelligence Artificielle (IA) constitue un accélérateur de la transformation numérique pour chaque industrie, avec des exemples couvrant la fabrication, la vente au détail, la finance, les soins de santé et bien d'autres encore. À ce rythme, chaque industrie sera en mesure d'utiliser l'IA pour amplifier l'ingéniosité humaine. (Je vous invite à lire à ce propos l'eBook The Future Computed: Artificial Intelligence and its role in society.)

Dans ce contexte, nous avons consacré récemment un certain nombre de billets à des services de la plateforme IA de Microsoft à l'image d'Azure Machine Learning et il semblait intéressant de nous arrêter l'espace de ce billet sur un projet moins connu mais pour autant clé, à savoir le projet ONNX, d'où le titre de ce billet.

Je tiens à remercier Pierre Lataillade actuellement en stage de fin d'étude au sein de Microsoft France pour cette contribution.

Qu'est-ce qu'ONNX ?

ONNX (Open Neural Network Exchange) est un format en Open Source pour modèles d'apprentissage profond ou Deep Learning.

Annoncé en Septembre 2017 par Microsoft et Facebook, ce projet communautaire sur GitHub vise à établir un écosystème ouvert pour les modèles d'Intelligence Artificielle (IA). Une première version d'ONNX a été publié en Décembre 2017 après une vague de soutient de nombreux acteurs dans le domaine (avec notamment l'arrivée d'Amazon Web Services (AWS)).

Dans ce billet, nous allons tenter d'expliquer et d'exploiter les avantages de ce format. Et commencer par nous intéresser à pourquoi un tel projet ?

Pourquoi ONNX ?

Il existe aujourd'hui de nombreux Frameworks pour créer et déployer des modèles de Deep Learning. On peut ainsi nommer Caffe2, PyTorch, Cognitive Toolkit (CNTK), Apache MXnet, Chainer, TensorFlow, Apple CoreML, Scikit-Learn et d'autres encore existent. Cette liste est donc loin d'être exhaustive.

Tous ces Frameworks possèdent leur propres représentations propriétaires des modèles qu'ils permettent de constituer et qu'ils utilisent. Cependant, jusqu'à présent, aucune de ces représentations ou format n'est réutilisable dans un autre Framework.

De plus, chaque Framework possède intrinsèquement ses spécificités et ses spécialités, dues à leurs méthodes d'accès aux ressources physiques de la machine : exécution efficace en bordure, entrainement rapide, utilisation dans un réseau complexe, etc.

Ces différents avantages et ces contraintes donnent naturellement lieu à des besoins de conversion entre les formats utilisés par les différents modèles. C'est justement notamment pour éviter ces lourdeurs que le projet ONNX existe.

L'idée centrale consiste à pouvoir utiliser les Frameworks que l'on souhaite pour générer, tester, paramétriser ou déployer notre modèle et d'assurer une transition fluide et simple entre les différents Framework utilisés grâce à ONNX.

En effet, le format ONNX issu du projet communautaire éponyme peut être importé et exporté par de nombreux Frameworks.

Vous pouvez à cet effet consulter :

  • Ce lien pour une liste à jour des Frameworks totalement supportés,
  • Et celui-ci pour ceux qui le sont aussi partiellement, par exemple uniquement en écriture.

Les objectifs de ce format étant établis, regardons les principes de fonctionnement.

Comment fonctionne ONNX ?

Sans rentrer dans les détails – ce billet n'y suffirait pas -, ce format définit dans les grandes lignes un graphe calculatoire extensible, des opérateurs standard, des types de données standard et, facultativement, de la métadonnée sur le modèle (auteur, but, etc.).

Le graphe calculatoire est un graphe acyclique composé des nœuds. Chaque nœud possède au moins une entrée et une sortie et représente un appel à un opérateur.

Ces opérateurs peuvent être soit standard (c.à.d. prédéfinis par ONNX), soit définis de manière externe au modèle. Une fois ces données définies, elles sont sérialisées par le format d'échange de données Protobuf (Protocol Buffers).

Ce format permet de représenter simplement les modèles de Deep Learning et de garantir (notamment grâces aux opérateurs et types de données standard) la transversalité d'ONNX.

Comment commencer avec ONNX ?

Il faut comprendre qu'ONNX n'existe pas seul, et que son utilisation dépend forcément du Framework concerné (même si celle-ci reste toujours très simple). Par exemple, la bibliothèque associée à ONNX, qui permet d'importer et d'exporter des modèles sous ce format, peut être installée par défaut avec le Framework considéré ou peut demander au contraire une installation spécifique.

De plus, il faut avoir préalablement créé un modèle pour (pouvoir) le sauvegarder sous format ONNX.

A titre d'illustration, voici ici un exemple en PyTorch pour montrer la facilité d'utilisation d'ONNX.

Pour que cet exemple en Python fonctionne, il est nécessaire d'avoir installé au préalable le paquet pytorch. On utilisera un modèle préexistant disponible par défaut avec PyTorch : celui d'AlexNet.

Et voilà !

Avec les quelques lignes précédentes, on a ainsi exporté notre modèle AlexNet sous le format ONNX dans le fichier alexnet.onnx.

La simplicité de cette opération se retrouvent avec les autres Framework prenant en charge le format.

Pour l'importation d'un modèle à partir du fichier, une simple ligne de code avec des arguments plutôt faciles à fournir. Cette page redirige vers toutes les informations spécifiques à chaque Framework concerné.

Pour progresser

Pour se faire une idée des utilisations possible d'ONNX, cette partie du repo GitHub d'ONNX donne quelques exemples et tutoriels plus complexes au-delà des principes précédents.

Globalement cependant l'utilisation des fonctionnalités d'ONNX demeure extrêmement simple.

Il peut être intéressant de noter que si vous utilisez Visual Studio, l'extension Visual Studio Tools for AI permet de convertir des modèles sous certains formats (CoreML, TensorFlow, SciKit, LIBSVM et XGboost) vers un format ONNX depuis une interface graphique intégrée à l'EDI à partir d'outils Python spécialisés (dont l'installation est guidée si nécessaire).

 

Visualiser les modèles ONNX

Il peut être intéressant (notamment lors de travaux collaboratifs) de visualiser les modèles contenus dans les fichiers ONNX.

Pour cela, il existe à ce jour deux outils principaux, mais l'un des deux est beaucoup plus simple d'utilisation et d'installation que l'autre. Nous nous intéressons ici au premier. Vous pouvez suivre ce lien si vous voulez absolument utiliser l'outil plus compliqué -.

Il s'agit du projet communautaire Netron sur GitHub. Netron est un logiciel/d'une application Web à part entière, qui permet de charger notamment des modèles sous forme ONNX afin de les visualiser au sein d'une interface graphique.

Si vous travaillez avec Visual Studio, avec l'extension Visual Studio Tools for AI mentionnée précédemment, Netron est directement disponible depuis l'interface habituelle de l'IDE afon de permettre de visualiser les modèles utilisés

 

Pour aller plus loin

Ceci conclut cette première introduction au projet ONNX et au format qu'il représente. Nous espèrons que ce billet vous aura donné l'envie de creuser le sujet !

Vous pouvez télécharger l'eBook A Developer's Guide to Building AI Application pour en apprendre plus sur ONNX.

Pour en apprendre plus sur ONNX et, le cas échéant participer à cet effort, rendez-vous sur https://onnx.ai. Vous pouvez également obtenir des mises à jour sur l'actualité d'ONNX via Facebook et @onnxai sur Twitter.