{"id":270,"date":"2023-11-05T12:33:54","date_gmt":"2023-11-05T11:33:54","guid":{"rendered":"https:\/\/ai.rebootconseil.com\/?p=270"},"modified":"2024-02-28T14:14:11","modified_gmt":"2024-02-28T13:14:11","slug":"de-python-a-c-le-transfert-de-modeles-sous-format-onnx","status":"publish","type":"post","link":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/","title":{"rendered":"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.python.org\/\">Python<\/a> s&rsquo;est impos\u00e9 comme le langage de r\u00e9f\u00e9rence dans la communaut\u00e9 des chercheurs, ing\u00e9nieurs, et praticiens de l&rsquo;Intelligence Artificielle et les impl\u00e9mentations les plus compl\u00e8tes des frameworks de ML les plus populaires, comme <a href=\"https:\/\/pytorch.org\/\">PyTorch<\/a> ou <a href=\"https:\/\/www.tensorflow.org\/\">Tensorflow<\/a>, sont aujourd&rsquo;hui \u00e9crites dans ce langage. Comment faire pour pouvoir utiliser nativement vos mod\u00e8les d&rsquo;IA dans une application \u00e9crite dans un autre langage ? Le format <a href=\"https:\/\/onnx.ai\/\">ONNX<\/a> r\u00e9pond \u00e0 cette probl\u00e9matique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voyons comment avec ce tutoriel !<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu&rsquo;est-ce qu&rsquo;ONNX ?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">ONNX signifie <strong>Open Neural Network Exchange<\/strong>. Il s&rsquo;agit d&rsquo;un projet open-source dont le but est de faciliter l&rsquo;interop\u00e9rabilit\u00e9 entre des syst\u00e8mes de machine learning, quel que soit le langage dans lequel ils ont \u00e9t\u00e9 \u00e9crits. Vous pouvez trouver la page GitHub du projet <a href=\"https:\/\/github.com\/onnx\/\">ici<\/a>. Le format est progressivement devenu un standard dans l&rsquo;industrie.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-1024x649.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Les entreprises soutenant le projet ONNX<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En plus de permettre la migration d&rsquo;un mod\u00e8le d&rsquo;IA d&rsquo;une plateforme \u00e0 une autre, ONNX facilite l&rsquo;optimisation de ces m\u00eames mod\u00e8les gr\u00e2ce \u00e0 son convertisseur qui transforme les mod\u00e8les en un format standardis\u00e9, tout en int\u00e9grant des optimisations de performance. Ces optimisations peuvent inclure la fusion de couches de neurones, l&rsquo;\u00e9limination de noeuds redondants, ou encore la simplification des op\u00e9rations math\u00e9matiques<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ces optimisations permettent d&rsquo;acc\u00e9l\u00e9rer les temps d&rsquo;ex\u00e9cution et de r\u00e9duire l&#8217;empreinte m\u00e9moire des mod\u00e8les. Cela est particuli\u00e8rement b\u00e9n\u00e9fique lors du d\u00e9ploiement de mod\u00e8les sur des appareils \u00e0 ressources limit\u00e9es, comme les mobiles ou les dispositifs IoT. Ainsi, ONNX contribue \u00e0 rendre les mod\u00e8les d&rsquo;apprentissage automatique plus l\u00e9gers et plus rapides, sans perte d&rsquo;information et de fonctionnalit\u00e9 avec l&rsquo;original.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00e9 requis<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;objectif de ce tutoriel est de vous guider \u00e0 travers un cas pratique de transfert de mod\u00e8le de Python \u00e0 C#. Nous ne passerons pas beaucoup de temps \u00e0 expliquer comment entra\u00eener un mod\u00e8le, comment fonctionnent les r\u00e9seaux de neurones, etc. car nous souhaitons nos focaliser ici sur le transfert ONNX.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"> Il pr\u00e9suppose que vous avez les pr\u00e9 requis suivants:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>un environnement Python pour le marchine learning fonctionnel<\/li>\n\n\n\n<li>un environnement .NET Core (j&rsquo;ai utilis\u00e9 la version 7) fonctionnel<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Le code que vous allez \u00e9crire devrait normalement run sous toute plateforme, n&rsquo;h\u00e9sitez pas \u00e0 me le faire savoir en commentaire si vous rencontrez des soucis !<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ce que vous allez construire<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vous allez:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Entra\u00eener un classificateur d&rsquo;images bas\u00e9 sur <a href=\"https:\/\/pytorch.org\/vision\/main\/models\/generated\/torchvision.models.resnet18.html#torchvision.models.resnet18\">resnet18<\/a> en utilisant <a href=\"https:\/\/docs.fast.ai\/\">fastai<\/a>, une librairie wrapper autour de PyTorch, permettant de r\u00e9aliser tr\u00e8s facilement des pipelines d&rsquo;entra\u00eenement de r\u00e9seaux de neurones.<\/li>\n\n\n\n<li>Nous allons sp\u00e9cialiser ce mod\u00e8le en l&rsquo;entra\u00eenant sur le <a href=\"https:\/\/www.kaggle.com\/datasets\/hojjatk\/mnist-dataset\">MNIST<\/a>, le dataset de r\u00e9f\u00e9rence du deep learning.<\/li>\n\n\n\n<li>Ce classificateur aura pour mission de reconna\u00eetre les chiffres <code>0<\/code> \u00e0 <code>9<\/code> avec une image en input issue du training set du MNIST.<\/li>\n\n\n\n<li>Nous l&rsquo;exporterons ensuite en ONNX pour pouvoir le consommer avec une application .NET Core 7 afin qu&rsquo;il puisse effectuer des classifications dans ce langage!<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Votre point de r\u00e9f\u00e9rence sera ce <a href=\"https:\/\/github.com\/reboot-conseil\/aisquad-pytorch-onnx-tutorial\">d\u00e9p\u00f4t git<\/a>. N&rsquo;h\u00e9sitez pas \u00e0 le consulter pour voir le code complet. Je m&rsquo;attarderai ici sur les points qui m&rsquo;ont sembl\u00e9 le plus important pour comprendre comment ce type d&rsquo;exports fonctionne.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Les points importants avant export<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Lister de mani\u00e8re exhaustive les \u00e9tapes de pr\u00e9 processing de l&rsquo;input \u00e0 classifier<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La plupart des frameworks et outils populaires d&rsquo;IA vont op\u00e9rer plusieurs transformations sur la donn\u00e9e en entr\u00e9e m\u00eame si vous ne l&rsquo;avez pas sp\u00e9cifi\u00e9 dans votre code, c&rsquo;est le cas de <code>fastai<\/code>. Par exemple, j&rsquo;ai pass\u00e9 pas mal de temps \u00e0 comprendre qu&rsquo;en r\u00e9alit\u00e9 le <code>visual_learner<\/code> de <code>fastai<\/code> op\u00e9rait plusieurs transformations par d\u00e9faut sur mes images d&rsquo;entra\u00eenement au moment de l&rsquo;entra\u00eenement alors que je voulais cr\u00e9er le data loader le plus simple possible:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-1-1024x308.png\" alt=\"un data loader tr\u00e8s simple pour loader le MNIST dans fastai\" style=\"aspect-ratio:1;width:740px;height:auto\"\/><figcaption class=\"wp-element-caption\">le data loader en question<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">On peut v\u00e9rifier cela apr\u00e8s l&rsquo;entra\u00eenement du mod\u00e8le de cette mani\u00e8re =&gt;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-2-1024x433.png\" alt=\"les \u00e9tapes de transformations par d\u00e9faut qu'op\u00e8re `fastai` lorsqu'on utilise un visual learner\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En r\u00e9sum\u00e9, 2 transformations sont appliqu\u00e9es par d\u00e9faut par <code>fastai<\/code>  au moment de l&rsquo;entra\u00eenement:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Le <code>tensor<\/code> de nombres entiers de l&rsquo;image import\u00e9e est transform\u00e9e en <code>tensor<\/code>  de <code>float<\/code> et chaque pixel est divis\u00e9 par <code>255.<\/code> \u00e0 fins de normalisation.<\/li>\n\n\n\n<li>Les pixels sont de nouveau normalis\u00e9s en utilisant l&rsquo;\u00e9cart moyen et standard afin de s&rsquo;assurer que toutes les valeurs des pixels sont distribu\u00e9es dans la bonne \u00e9chelle.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Savoir exactement quelle \u00e9tape de pr\u00e9 processing a \u00e9t\u00e9 appliqu\u00e9e est primordial, comme vous le verrez dans la partie C#.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Savoir quelle est la forme de l&rsquo;input \u00e0 classifier<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cela vaut pour les programmes classiques et pour les r\u00e9seaux de neurones (jusque l\u00e0):  un mod\u00e8le attend un input d&rsquo;une certaine forme pour pouvoir r\u00e9aliser sa t\u00e2che.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsque vous aurez export\u00e9 votre mod\u00e8le pour usage dans votre langage de programmation cible, il faudra vous assurer que l&rsquo;input \u00e0 pr\u00e9dire a exactement la m\u00eame forme que celui qui a \u00e9t\u00e9 utilis\u00e9 durant l&rsquo;entra\u00eenement:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-4-1024x78.png\" alt=\"les dimensions et canaux d'une image repr\u00e9sent\u00e9e par un `tensor`\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">On voit ci-dessus que notre input est une image de 28*28 pixels avec trois canaux: R, G, et B. On peut donc parler d&rsquo;un <code>rank-3 tensor<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Conna\u00eetre la forme de l&rsquo;input \u00e0 classifier nous aidera \u00e0 d\u00e9finir un example d&rsquo;input lors de l&rsquo;export de l&rsquo;ONNX:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-5-1024x134.png\" alt=\"example d'input \u00e0 d\u00e9finir pour l'export du mod\u00e8le\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Les quatre dimensions que vous voyez ci-dessus sont, de gauche \u00e0 droite:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>la taille du batch \u00e0 donner au mod\u00e8le au moment de la classification (ici <code>1<\/code>, mais \u00e0 l&rsquo;entra\u00eenement on lui chargeait des images par batchs de 64)<\/li>\n\n\n\n<li>les canaux de l&rsquo;image (RGB)<\/li>\n\n\n\n<li>les pixels en largeur et hauteur<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Passer le mod\u00e8le en mode \u00e9valuation avant l&rsquo;export<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cette petite ligne de code permet de s&rsquo;assurer que son mod\u00e8le est pr\u00eat pour la production:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-6.png\" alt=\"pr\u00e9paration du mod\u00e8le pour la production\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cela va supprimer des couches de neurones redondantes, certaines op\u00e9rations de normalisation dans les couches couch\u00e9es, et \u00e9liminer tout <code>dropout<\/code> parce que nous ne sommes plus en phase d&rsquo;entra\u00eenement.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Exporter le mod\u00e8le<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-7-1024x539.png\" alt=\"export du mod\u00e8le en ONNX c\u00f4t\u00e9 Python\" style=\"aspect-ratio:1;width:740px;height:auto\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le code ci-dessus est amplement comment\u00e9 dans <a href=\"https:\/\/github.com\/reboot-conseil\/aisquad-pytorch-onnx-tutorial\/blob\/main\/initial-model.ipynb\">le notebook<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Toutefois certaines points int\u00e9ressants sont \u00e0 soulever:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Si vous n&rsquo;\u00eates pas certain que les machines cibles qui accueilleront votre mod\u00e8le ONNX pour ex\u00e9cuter des inf\u00e9rences ont une GPU, privil\u00e9giez la s\u00e9curit\u00e9 et passez en param\u00e8tre d&rsquo;export le fait que le mod\u00e8le sera ex\u00e9cut\u00e9 sur CPU; de m\u00eame, assurez-vous que l&rsquo;input de test est un tenseur CPU<\/li>\n\n\n\n<li>N&rsquo;oubliez pas de sp\u00e9cifier que vous souhaitez appliquer les optimisations du compilateur au moment de l&rsquo;export, c&rsquo;est une bonne pratique.<\/li>\n\n\n\n<li>Pour une application en production, il faut inclure les poids du mod\u00e8le dans l&rsquo;export.<\/li>\n\n\n\n<li>Sp\u00e9cifiez des axes dynamiques pour l&rsquo;I\/O: cela vous permettra d&rsquo;ex\u00e9cuter des inf\u00e9rences de masse avec votre mod\u00e8le export\u00e9 (classifier des images en batchs dans notre cas).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Validez votre export en Python<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avant de switcher sur une autre plateforme pour exploiter votre export ONNX et d&rsquo;ajouter de la complexit\u00e9 \u00e0 votre travail en faisant cela, \u00e9pargnez-vous quelques heures de souffrance \ud83e\udd12: validez que votre export fonctionne dans la m\u00eame plateforme que vous avez utilis\u00e9 pour l&rsquo;export en r\u00e9 important tout simplement votre mod\u00e8le ONNX et en v\u00e9rifiant qu&rsquo;il fonctionne comme attendu =&gt;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">V\u00e9rification technique<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-8-1024x125.png\" alt=\"v\u00e9rification technique que l'export a fonctionn\u00e9\" style=\"aspect-ratio:1;width:740px;height:auto\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Reproduire le pr\u00e9 processing<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-9-1024x139.png\" alt=\"pr\u00e9 processing de l'image\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Comme indiqu\u00e9 plus haut, pour que la classification r\u00e9ussisse, il faut que le mod\u00e8le re\u00e7oive en input la m\u00eame chose qu&rsquo;il a apprise \u00e0 l&rsquo;entra\u00eenement (un principe \u00f4 combien classique mais si facilement oubliable dans le monde du deep learning).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tester l&rsquo;inf\u00e9rence avec le mod\u00e8le export\u00e9<\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-10-1024x208.png\" alt=\"tester l'inf\u00e9rence c\u00f4t\u00e9 Python\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ici, le test est tr\u00e8s simple, mais pour tester rigoureusement que votre mod\u00e8le ne perd pas en performance d&rsquo;une plateforme \u00e0 une autre, vous effectuerez des inf\u00e9rences de masse sur un jeu de donn\u00e9es repr\u00e9sentatif.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Faisons cela en C# \ud83d\ude09<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vous \u00eates pr\u00eat \u00e0 run votre mod\u00e8le en C# !<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/github.com\/reboot-conseil\/aisquad-pytorch-onnx-tutorial\/blob\/5acccf997b4e247008447a78ff86d219138c5ea4\/ExportedModel\/Program.cs\">Le code C# du programme<\/a> \u00ab\u00a0mirror\u00a0\u00bb en quelque sorte ce que nous avons fait en Python:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-11.png\" alt=\"pr\u00e9 processing c\u00f4t\u00e9 C#\"\/><figcaption class=\"wp-element-caption\">&#8230; le pr\u00e9 processing initial<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/ai.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/image-12.png\" alt=\"ONNX inference in C#\"\/><figcaption class=\"wp-element-caption\">l&rsquo;ex\u00e9cution de l&rsquo;inf\u00e9rence<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A travers cet exemple (et quelques heures avant de comprendre comment \u00e7a marche), je suis ravi de partager avec vous comment consommer un mod\u00e8le d&rsquo;IA d\u00e9velopp\u00e9 en Python dans un autre langage de programmation (ici le C#).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cet apprentissage a \u00e9t\u00e9 pour moi tr\u00e8s excitant dans la mesure o\u00f9 je r\u00e9alise d&rsquo;avantage le champ des possibles dans le fait de pouvoir embed des applications boost\u00e9es \u00e0 l&rsquo;IA dans n&rsquo;importe quelle codebase, m\u00eame legacy!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">J&rsquo;ajoute que, si vous avez besoin de moderniser et d&rsquo;ajouter un sel d&rsquo;IA votre transformation digitale sans devoir tout casser dans votre syst\u00e8me existant, vous pouvez faire appel \u00e0 l&rsquo;IA Squad \ud83e\uddb8 !<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cela, rien de plus simple: contactez https:\/\/reboot-conseil.com\/ !<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Python s&rsquo;est impos\u00e9 comme le langage de r\u00e9f\u00e9rence dans la communaut\u00e9 des chercheurs, ing\u00e9nieurs, et praticiens de l&rsquo;Intelligence Artificielle et les impl\u00e9mentations les plus compl\u00e8tes des frameworks de ML les plus populaires, comme PyTorch ou Tensorflow, sont aujourd&rsquo;hui \u00e9crites dans ce langage. Comment faire pour pouvoir utiliser nativement vos mod\u00e8les d&rsquo;IA dans une application \u00e9crite dans un autre langage ? Le format ONNX r\u00e9pond \u00e0 cette probl\u00e9matique. Voyons comment avec ce tutoriel ! Qu&rsquo;est-ce qu&rsquo;ONNX ? ONNX signifie Open Neural Network Exchange. Il s&rsquo;agit d&rsquo;un projet open-source dont le but est de faciliter l&rsquo;interop\u00e9rabilit\u00e9 entre des syst\u00e8mes de machine learning, quel que soit le langage dans lequel ils ont \u00e9t\u00e9 \u00e9crits. Vous pouvez trouver la page GitHub du projet ici. Le format est progressivement devenu un standard dans l&rsquo;industrie. En plus de permettre la migration d&rsquo;un mod\u00e8le d&rsquo;IA d&rsquo;une plateforme \u00e0 une autre, ONNX facilite l&rsquo;optimisation de ces m\u00eames mod\u00e8les gr\u00e2ce \u00e0 son convertisseur qui transforme les mod\u00e8les en un format standardis\u00e9, tout en int\u00e9grant des optimisations de performance. Ces optimisations peuvent inclure la fusion de couches de neurones, l&rsquo;\u00e9limination de noeuds redondants, ou encore la simplification des op\u00e9rations math\u00e9matiques Ces optimisations permettent d&rsquo;acc\u00e9l\u00e9rer les temps d&rsquo;ex\u00e9cution et de r\u00e9duire l&#8217;empreinte m\u00e9moire des mod\u00e8les. Cela est particuli\u00e8rement b\u00e9n\u00e9fique lors du d\u00e9ploiement de mod\u00e8les sur des appareils \u00e0 ressources limit\u00e9es, comme les mobiles ou les dispositifs IoT. Ainsi, ONNX contribue \u00e0 rendre les mod\u00e8les d&rsquo;apprentissage automatique plus l\u00e9gers et plus rapides, sans perte d&rsquo;information et de fonctionnalit\u00e9 avec l&rsquo;original. Pr\u00e9 requis L&rsquo;objectif de ce tutoriel est de vous guider \u00e0 travers un cas pratique de transfert de mod\u00e8le de Python \u00e0 C#. Nous ne passerons pas beaucoup de temps \u00e0 expliquer comment entra\u00eener un mod\u00e8le, comment fonctionnent les r\u00e9seaux de neurones, etc. car nous souhaitons nos focaliser ici sur le transfert ONNX. Il pr\u00e9suppose que vous avez les pr\u00e9 requis suivants: Le code que vous allez \u00e9crire devrait normalement run sous toute plateforme, n&rsquo;h\u00e9sitez pas \u00e0 me le faire savoir en commentaire si vous rencontrez des soucis ! Ce que vous allez construire Vous allez: Votre point de r\u00e9f\u00e9rence sera ce d\u00e9p\u00f4t git. N&rsquo;h\u00e9sitez pas \u00e0 le consulter pour voir le code complet. Je m&rsquo;attarderai ici sur les points qui m&rsquo;ont sembl\u00e9 le plus important pour comprendre comment ce type d&rsquo;exports fonctionne. Les points importants avant export Lister de mani\u00e8re exhaustive les \u00e9tapes de pr\u00e9 processing de l&rsquo;input \u00e0 classifier La plupart des frameworks et outils populaires d&rsquo;IA vont op\u00e9rer plusieurs transformations sur la donn\u00e9e en entr\u00e9e m\u00eame si vous ne l&rsquo;avez pas sp\u00e9cifi\u00e9 dans votre code, c&rsquo;est le cas de fastai. Par exemple, j&rsquo;ai pass\u00e9 pas mal de temps \u00e0 comprendre qu&rsquo;en r\u00e9alit\u00e9 le visual_learner de fastai op\u00e9rait plusieurs transformations par d\u00e9faut sur mes images d&rsquo;entra\u00eenement au moment de l&rsquo;entra\u00eenement alors que je voulais cr\u00e9er le data loader le plus simple possible: On peut v\u00e9rifier cela apr\u00e8s l&rsquo;entra\u00eenement du mod\u00e8le de cette mani\u00e8re =&gt; En r\u00e9sum\u00e9, 2 transformations sont appliqu\u00e9es par d\u00e9faut par fastai au moment de l&rsquo;entra\u00eenement: Savoir exactement quelle \u00e9tape de pr\u00e9 processing a \u00e9t\u00e9 appliqu\u00e9e est primordial, comme vous le verrez dans la partie C#. Savoir quelle est la forme de l&rsquo;input \u00e0 classifier Cela vaut pour les programmes classiques et pour les r\u00e9seaux de neurones (jusque l\u00e0): un mod\u00e8le attend un input d&rsquo;une certaine forme pour pouvoir r\u00e9aliser sa t\u00e2che. Lorsque vous aurez export\u00e9 votre mod\u00e8le pour usage dans votre langage de programmation cible, il faudra vous assurer que l&rsquo;input \u00e0 pr\u00e9dire a exactement la m\u00eame forme que celui qui a \u00e9t\u00e9 utilis\u00e9 durant l&rsquo;entra\u00eenement: On voit ci-dessus que notre input est une image de 28*28 pixels avec trois canaux: R, G, et B. On peut donc parler d&rsquo;un rank-3 tensor. Conna\u00eetre la forme de l&rsquo;input \u00e0 classifier nous aidera \u00e0 d\u00e9finir un example d&rsquo;input lors de l&rsquo;export de l&rsquo;ONNX: Les quatre dimensions que vous voyez ci-dessus sont, de gauche \u00e0 droite: Passer le mod\u00e8le en mode \u00e9valuation avant l&rsquo;export Cette petite ligne de code permet de s&rsquo;assurer que son mod\u00e8le est pr\u00eat pour la production: Cela va supprimer des couches de neurones redondantes, certaines op\u00e9rations de normalisation dans les couches couch\u00e9es, et \u00e9liminer tout dropout parce que nous ne sommes plus en phase d&rsquo;entra\u00eenement. Exporter le mod\u00e8le Le code ci-dessus est amplement comment\u00e9 dans le notebook. Toutefois certaines points int\u00e9ressants sont \u00e0 soulever: Validez votre export en Python Avant de switcher sur une autre plateforme pour exploiter votre export ONNX et d&rsquo;ajouter de la complexit\u00e9 \u00e0 votre travail en faisant cela, \u00e9pargnez-vous quelques heures de souffrance \ud83e\udd12: validez que votre export fonctionne dans la m\u00eame plateforme que vous avez utilis\u00e9 pour l&rsquo;export en r\u00e9 important tout simplement votre mod\u00e8le ONNX et en v\u00e9rifiant qu&rsquo;il fonctionne comme attendu =&gt; V\u00e9rification technique Reproduire le pr\u00e9 processing Comme indiqu\u00e9 plus haut, pour que la classification r\u00e9ussisse, il faut que le mod\u00e8le re\u00e7oive en input la m\u00eame chose qu&rsquo;il a apprise \u00e0 l&rsquo;entra\u00eenement (un principe \u00f4 combien classique mais si facilement oubliable dans le monde du deep learning). Tester l&rsquo;inf\u00e9rence avec le mod\u00e8le export\u00e9 Ici, le test est tr\u00e8s simple, mais pour tester rigoureusement que votre mod\u00e8le ne perd pas en performance d&rsquo;une plateforme \u00e0 une autre, vous effectuerez des inf\u00e9rences de masse sur un jeu de donn\u00e9es repr\u00e9sentatif. Faisons cela en C# \ud83d\ude09 Vous \u00eates pr\u00eat \u00e0 run votre mod\u00e8le en C# ! Le code C# du programme \u00ab\u00a0mirror\u00a0\u00bb en quelque sorte ce que nous avons fait en Python: Conclusion A travers cet exemple (et quelques heures avant de comprendre comment \u00e7a marche), je suis ravi de partager avec vous comment consommer un mod\u00e8le d&rsquo;IA d\u00e9velopp\u00e9 en Python dans un autre langage de programmation (ici le C#). Cet apprentissage a \u00e9t\u00e9 pour moi tr\u00e8s excitant dans la mesure o\u00f9 je r\u00e9alise d&rsquo;avantage le champ des possibles dans le fait de pouvoir embed des applications boost\u00e9es \u00e0 l&rsquo;IA dans n&rsquo;importe quelle codebase, m\u00eame legacy! J&rsquo;ajoute que, si vous avez besoin de moderniser et d&rsquo;ajouter un sel d&rsquo;IA votre transformation digitale sans devoir tout casser dans votre syst\u00e8me existant,<\/p>\n","protected":false},"author":1,"featured_media":271,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[39,40],"tags":[7],"class_list":["post-270","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-pytorch","category-tutoriels","tag-ia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.7 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX -<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX -\" \/>\n<meta property=\"og:description\" content=\"Python s&rsquo;est impos\u00e9 comme le langage de r\u00e9f\u00e9rence dans la communaut\u00e9 des chercheurs, ing\u00e9nieurs, et praticiens de l&rsquo;Intelligence Artificielle et les impl\u00e9mentations les plus compl\u00e8tes des frameworks de ML les plus populaires, comme PyTorch ou Tensorflow, sont aujourd&rsquo;hui \u00e9crites dans ce langage. Comment faire pour pouvoir utiliser nativement vos mod\u00e8les d&rsquo;IA dans une application \u00e9crite dans un autre langage ? Le format ONNX r\u00e9pond \u00e0 cette probl\u00e9matique. Voyons comment avec ce tutoriel ! Qu&rsquo;est-ce qu&rsquo;ONNX ? ONNX signifie Open Neural Network Exchange. Il s&rsquo;agit d&rsquo;un projet open-source dont le but est de faciliter l&rsquo;interop\u00e9rabilit\u00e9 entre des syst\u00e8mes de machine learning, quel que soit le langage dans lequel ils ont \u00e9t\u00e9 \u00e9crits. Vous pouvez trouver la page GitHub du projet ici. Le format est progressivement devenu un standard dans l&rsquo;industrie. En plus de permettre la migration d&rsquo;un mod\u00e8le d&rsquo;IA d&rsquo;une plateforme \u00e0 une autre, ONNX facilite l&rsquo;optimisation de ces m\u00eames mod\u00e8les gr\u00e2ce \u00e0 son convertisseur qui transforme les mod\u00e8les en un format standardis\u00e9, tout en int\u00e9grant des optimisations de performance. Ces optimisations peuvent inclure la fusion de couches de neurones, l&rsquo;\u00e9limination de noeuds redondants, ou encore la simplification des op\u00e9rations math\u00e9matiques Ces optimisations permettent d&rsquo;acc\u00e9l\u00e9rer les temps d&rsquo;ex\u00e9cution et de r\u00e9duire l&#8217;empreinte m\u00e9moire des mod\u00e8les. Cela est particuli\u00e8rement b\u00e9n\u00e9fique lors du d\u00e9ploiement de mod\u00e8les sur des appareils \u00e0 ressources limit\u00e9es, comme les mobiles ou les dispositifs IoT. Ainsi, ONNX contribue \u00e0 rendre les mod\u00e8les d&rsquo;apprentissage automatique plus l\u00e9gers et plus rapides, sans perte d&rsquo;information et de fonctionnalit\u00e9 avec l&rsquo;original. Pr\u00e9 requis L&rsquo;objectif de ce tutoriel est de vous guider \u00e0 travers un cas pratique de transfert de mod\u00e8le de Python \u00e0 C#. Nous ne passerons pas beaucoup de temps \u00e0 expliquer comment entra\u00eener un mod\u00e8le, comment fonctionnent les r\u00e9seaux de neurones, etc. car nous souhaitons nos focaliser ici sur le transfert ONNX. Il pr\u00e9suppose que vous avez les pr\u00e9 requis suivants: Le code que vous allez \u00e9crire devrait normalement run sous toute plateforme, n&rsquo;h\u00e9sitez pas \u00e0 me le faire savoir en commentaire si vous rencontrez des soucis ! Ce que vous allez construire Vous allez: Votre point de r\u00e9f\u00e9rence sera ce d\u00e9p\u00f4t git. N&rsquo;h\u00e9sitez pas \u00e0 le consulter pour voir le code complet. Je m&rsquo;attarderai ici sur les points qui m&rsquo;ont sembl\u00e9 le plus important pour comprendre comment ce type d&rsquo;exports fonctionne. Les points importants avant export Lister de mani\u00e8re exhaustive les \u00e9tapes de pr\u00e9 processing de l&rsquo;input \u00e0 classifier La plupart des frameworks et outils populaires d&rsquo;IA vont op\u00e9rer plusieurs transformations sur la donn\u00e9e en entr\u00e9e m\u00eame si vous ne l&rsquo;avez pas sp\u00e9cifi\u00e9 dans votre code, c&rsquo;est le cas de fastai. Par exemple, j&rsquo;ai pass\u00e9 pas mal de temps \u00e0 comprendre qu&rsquo;en r\u00e9alit\u00e9 le visual_learner de fastai op\u00e9rait plusieurs transformations par d\u00e9faut sur mes images d&rsquo;entra\u00eenement au moment de l&rsquo;entra\u00eenement alors que je voulais cr\u00e9er le data loader le plus simple possible: On peut v\u00e9rifier cela apr\u00e8s l&rsquo;entra\u00eenement du mod\u00e8le de cette mani\u00e8re =&gt; En r\u00e9sum\u00e9, 2 transformations sont appliqu\u00e9es par d\u00e9faut par fastai au moment de l&rsquo;entra\u00eenement: Savoir exactement quelle \u00e9tape de pr\u00e9 processing a \u00e9t\u00e9 appliqu\u00e9e est primordial, comme vous le verrez dans la partie C#. Savoir quelle est la forme de l&rsquo;input \u00e0 classifier Cela vaut pour les programmes classiques et pour les r\u00e9seaux de neurones (jusque l\u00e0): un mod\u00e8le attend un input d&rsquo;une certaine forme pour pouvoir r\u00e9aliser sa t\u00e2che. Lorsque vous aurez export\u00e9 votre mod\u00e8le pour usage dans votre langage de programmation cible, il faudra vous assurer que l&rsquo;input \u00e0 pr\u00e9dire a exactement la m\u00eame forme que celui qui a \u00e9t\u00e9 utilis\u00e9 durant l&rsquo;entra\u00eenement: On voit ci-dessus que notre input est une image de 28*28 pixels avec trois canaux: R, G, et B. On peut donc parler d&rsquo;un rank-3 tensor. Conna\u00eetre la forme de l&rsquo;input \u00e0 classifier nous aidera \u00e0 d\u00e9finir un example d&rsquo;input lors de l&rsquo;export de l&rsquo;ONNX: Les quatre dimensions que vous voyez ci-dessus sont, de gauche \u00e0 droite: Passer le mod\u00e8le en mode \u00e9valuation avant l&rsquo;export Cette petite ligne de code permet de s&rsquo;assurer que son mod\u00e8le est pr\u00eat pour la production: Cela va supprimer des couches de neurones redondantes, certaines op\u00e9rations de normalisation dans les couches couch\u00e9es, et \u00e9liminer tout dropout parce que nous ne sommes plus en phase d&rsquo;entra\u00eenement. Exporter le mod\u00e8le Le code ci-dessus est amplement comment\u00e9 dans le notebook. Toutefois certaines points int\u00e9ressants sont \u00e0 soulever: Validez votre export en Python Avant de switcher sur une autre plateforme pour exploiter votre export ONNX et d&rsquo;ajouter de la complexit\u00e9 \u00e0 votre travail en faisant cela, \u00e9pargnez-vous quelques heures de souffrance \ud83e\udd12: validez que votre export fonctionne dans la m\u00eame plateforme que vous avez utilis\u00e9 pour l&rsquo;export en r\u00e9 important tout simplement votre mod\u00e8le ONNX et en v\u00e9rifiant qu&rsquo;il fonctionne comme attendu =&gt; V\u00e9rification technique Reproduire le pr\u00e9 processing Comme indiqu\u00e9 plus haut, pour que la classification r\u00e9ussisse, il faut que le mod\u00e8le re\u00e7oive en input la m\u00eame chose qu&rsquo;il a apprise \u00e0 l&rsquo;entra\u00eenement (un principe \u00f4 combien classique mais si facilement oubliable dans le monde du deep learning). Tester l&rsquo;inf\u00e9rence avec le mod\u00e8le export\u00e9 Ici, le test est tr\u00e8s simple, mais pour tester rigoureusement que votre mod\u00e8le ne perd pas en performance d&rsquo;une plateforme \u00e0 une autre, vous effectuerez des inf\u00e9rences de masse sur un jeu de donn\u00e9es repr\u00e9sentatif. Faisons cela en C# \ud83d\ude09 Vous \u00eates pr\u00eat \u00e0 run votre mod\u00e8le en C# ! Le code C# du programme \u00ab\u00a0mirror\u00a0\u00bb en quelque sorte ce que nous avons fait en Python: Conclusion A travers cet exemple (et quelques heures avant de comprendre comment \u00e7a marche), je suis ravi de partager avec vous comment consommer un mod\u00e8le d&rsquo;IA d\u00e9velopp\u00e9 en Python dans un autre langage de programmation (ici le C#). Cet apprentissage a \u00e9t\u00e9 pour moi tr\u00e8s excitant dans la mesure o\u00f9 je r\u00e9alise d&rsquo;avantage le champ des possibles dans le fait de pouvoir embed des applications boost\u00e9es \u00e0 l&rsquo;IA dans n&rsquo;importe quelle codebase, m\u00eame legacy! J&rsquo;ajoute que, si vous avez besoin de moderniser et d&rsquo;ajouter un sel d&rsquo;IA votre transformation digitale sans devoir tout casser dans votre syst\u00e8me existant,\" \/>\n<meta property=\"og:url\" content=\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-05T11:33:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-02-28T13:14:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1792\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Yacine Touati\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Yacine Touati\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\"},\"author\":{\"name\":\"Yacine Touati\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/2947c0a3dd038b2bf559d53fbc9c5576\"},\"headline\":\"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX\",\"datePublished\":\"2023-11-05T11:33:54+00:00\",\"dateModified\":\"2024-02-28T13:14:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\"},\"wordCount\":1528,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png\",\"keywords\":[\"IA\"],\"articleSection\":[\"PyTorch\",\"Tutoriels\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\",\"url\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\",\"name\":\"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX -\",\"isPartOf\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png\",\"datePublished\":\"2023-11-05T11:33:54+00:00\",\"dateModified\":\"2024-02-28T13:14:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage\",\"url\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png\",\"contentUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png\",\"width\":1792,\"height\":1024,\"caption\":\"une repr\u00e9sentation abstraite du format ONNX\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/beta.reboot-conseil.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#website\",\"url\":\"https:\/\/beta.reboot-conseil.com\/\",\"name\":\"AI Squad\",\"description\":\"Dans le doute, Reboot\",\"publisher\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/beta.reboot-conseil.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#organization\",\"name\":\"AI Squad By Reboot Conseil\",\"url\":\"https:\/\/beta.reboot-conseil.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png\",\"contentUrl\":\"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png\",\"width\":500,\"height\":218,\"caption\":\"AI Squad By Reboot Conseil\"},\"image\":{\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/2947c0a3dd038b2bf559d53fbc9c5576\",\"name\":\"Yacine Touati\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/6da6ec3d9bbc05c0f70ccbd05c5fa47f4de7a9df9ec40ce281f012db7267c287?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/6da6ec3d9bbc05c0f70ccbd05c5fa47f4de7a9df9ec40ce281f012db7267c287?s=96&d=mm&r=g\",\"caption\":\"Yacine Touati\"},\"sameAs\":[\"https:\/\/ai.rebootconseil.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX -","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/","og_locale":"fr_FR","og_type":"article","og_title":"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX -","og_description":"Python s&rsquo;est impos\u00e9 comme le langage de r\u00e9f\u00e9rence dans la communaut\u00e9 des chercheurs, ing\u00e9nieurs, et praticiens de l&rsquo;Intelligence Artificielle et les impl\u00e9mentations les plus compl\u00e8tes des frameworks de ML les plus populaires, comme PyTorch ou Tensorflow, sont aujourd&rsquo;hui \u00e9crites dans ce langage. Comment faire pour pouvoir utiliser nativement vos mod\u00e8les d&rsquo;IA dans une application \u00e9crite dans un autre langage ? Le format ONNX r\u00e9pond \u00e0 cette probl\u00e9matique. Voyons comment avec ce tutoriel ! Qu&rsquo;est-ce qu&rsquo;ONNX ? ONNX signifie Open Neural Network Exchange. Il s&rsquo;agit d&rsquo;un projet open-source dont le but est de faciliter l&rsquo;interop\u00e9rabilit\u00e9 entre des syst\u00e8mes de machine learning, quel que soit le langage dans lequel ils ont \u00e9t\u00e9 \u00e9crits. Vous pouvez trouver la page GitHub du projet ici. Le format est progressivement devenu un standard dans l&rsquo;industrie. En plus de permettre la migration d&rsquo;un mod\u00e8le d&rsquo;IA d&rsquo;une plateforme \u00e0 une autre, ONNX facilite l&rsquo;optimisation de ces m\u00eames mod\u00e8les gr\u00e2ce \u00e0 son convertisseur qui transforme les mod\u00e8les en un format standardis\u00e9, tout en int\u00e9grant des optimisations de performance. Ces optimisations peuvent inclure la fusion de couches de neurones, l&rsquo;\u00e9limination de noeuds redondants, ou encore la simplification des op\u00e9rations math\u00e9matiques Ces optimisations permettent d&rsquo;acc\u00e9l\u00e9rer les temps d&rsquo;ex\u00e9cution et de r\u00e9duire l&#8217;empreinte m\u00e9moire des mod\u00e8les. Cela est particuli\u00e8rement b\u00e9n\u00e9fique lors du d\u00e9ploiement de mod\u00e8les sur des appareils \u00e0 ressources limit\u00e9es, comme les mobiles ou les dispositifs IoT. Ainsi, ONNX contribue \u00e0 rendre les mod\u00e8les d&rsquo;apprentissage automatique plus l\u00e9gers et plus rapides, sans perte d&rsquo;information et de fonctionnalit\u00e9 avec l&rsquo;original. Pr\u00e9 requis L&rsquo;objectif de ce tutoriel est de vous guider \u00e0 travers un cas pratique de transfert de mod\u00e8le de Python \u00e0 C#. Nous ne passerons pas beaucoup de temps \u00e0 expliquer comment entra\u00eener un mod\u00e8le, comment fonctionnent les r\u00e9seaux de neurones, etc. car nous souhaitons nos focaliser ici sur le transfert ONNX. Il pr\u00e9suppose que vous avez les pr\u00e9 requis suivants: Le code que vous allez \u00e9crire devrait normalement run sous toute plateforme, n&rsquo;h\u00e9sitez pas \u00e0 me le faire savoir en commentaire si vous rencontrez des soucis ! Ce que vous allez construire Vous allez: Votre point de r\u00e9f\u00e9rence sera ce d\u00e9p\u00f4t git. N&rsquo;h\u00e9sitez pas \u00e0 le consulter pour voir le code complet. Je m&rsquo;attarderai ici sur les points qui m&rsquo;ont sembl\u00e9 le plus important pour comprendre comment ce type d&rsquo;exports fonctionne. Les points importants avant export Lister de mani\u00e8re exhaustive les \u00e9tapes de pr\u00e9 processing de l&rsquo;input \u00e0 classifier La plupart des frameworks et outils populaires d&rsquo;IA vont op\u00e9rer plusieurs transformations sur la donn\u00e9e en entr\u00e9e m\u00eame si vous ne l&rsquo;avez pas sp\u00e9cifi\u00e9 dans votre code, c&rsquo;est le cas de fastai. Par exemple, j&rsquo;ai pass\u00e9 pas mal de temps \u00e0 comprendre qu&rsquo;en r\u00e9alit\u00e9 le visual_learner de fastai op\u00e9rait plusieurs transformations par d\u00e9faut sur mes images d&rsquo;entra\u00eenement au moment de l&rsquo;entra\u00eenement alors que je voulais cr\u00e9er le data loader le plus simple possible: On peut v\u00e9rifier cela apr\u00e8s l&rsquo;entra\u00eenement du mod\u00e8le de cette mani\u00e8re =&gt; En r\u00e9sum\u00e9, 2 transformations sont appliqu\u00e9es par d\u00e9faut par fastai au moment de l&rsquo;entra\u00eenement: Savoir exactement quelle \u00e9tape de pr\u00e9 processing a \u00e9t\u00e9 appliqu\u00e9e est primordial, comme vous le verrez dans la partie C#. Savoir quelle est la forme de l&rsquo;input \u00e0 classifier Cela vaut pour les programmes classiques et pour les r\u00e9seaux de neurones (jusque l\u00e0): un mod\u00e8le attend un input d&rsquo;une certaine forme pour pouvoir r\u00e9aliser sa t\u00e2che. Lorsque vous aurez export\u00e9 votre mod\u00e8le pour usage dans votre langage de programmation cible, il faudra vous assurer que l&rsquo;input \u00e0 pr\u00e9dire a exactement la m\u00eame forme que celui qui a \u00e9t\u00e9 utilis\u00e9 durant l&rsquo;entra\u00eenement: On voit ci-dessus que notre input est une image de 28*28 pixels avec trois canaux: R, G, et B. On peut donc parler d&rsquo;un rank-3 tensor. Conna\u00eetre la forme de l&rsquo;input \u00e0 classifier nous aidera \u00e0 d\u00e9finir un example d&rsquo;input lors de l&rsquo;export de l&rsquo;ONNX: Les quatre dimensions que vous voyez ci-dessus sont, de gauche \u00e0 droite: Passer le mod\u00e8le en mode \u00e9valuation avant l&rsquo;export Cette petite ligne de code permet de s&rsquo;assurer que son mod\u00e8le est pr\u00eat pour la production: Cela va supprimer des couches de neurones redondantes, certaines op\u00e9rations de normalisation dans les couches couch\u00e9es, et \u00e9liminer tout dropout parce que nous ne sommes plus en phase d&rsquo;entra\u00eenement. Exporter le mod\u00e8le Le code ci-dessus est amplement comment\u00e9 dans le notebook. Toutefois certaines points int\u00e9ressants sont \u00e0 soulever: Validez votre export en Python Avant de switcher sur une autre plateforme pour exploiter votre export ONNX et d&rsquo;ajouter de la complexit\u00e9 \u00e0 votre travail en faisant cela, \u00e9pargnez-vous quelques heures de souffrance \ud83e\udd12: validez que votre export fonctionne dans la m\u00eame plateforme que vous avez utilis\u00e9 pour l&rsquo;export en r\u00e9 important tout simplement votre mod\u00e8le ONNX et en v\u00e9rifiant qu&rsquo;il fonctionne comme attendu =&gt; V\u00e9rification technique Reproduire le pr\u00e9 processing Comme indiqu\u00e9 plus haut, pour que la classification r\u00e9ussisse, il faut que le mod\u00e8le re\u00e7oive en input la m\u00eame chose qu&rsquo;il a apprise \u00e0 l&rsquo;entra\u00eenement (un principe \u00f4 combien classique mais si facilement oubliable dans le monde du deep learning). Tester l&rsquo;inf\u00e9rence avec le mod\u00e8le export\u00e9 Ici, le test est tr\u00e8s simple, mais pour tester rigoureusement que votre mod\u00e8le ne perd pas en performance d&rsquo;une plateforme \u00e0 une autre, vous effectuerez des inf\u00e9rences de masse sur un jeu de donn\u00e9es repr\u00e9sentatif. Faisons cela en C# \ud83d\ude09 Vous \u00eates pr\u00eat \u00e0 run votre mod\u00e8le en C# ! Le code C# du programme \u00ab\u00a0mirror\u00a0\u00bb en quelque sorte ce que nous avons fait en Python: Conclusion A travers cet exemple (et quelques heures avant de comprendre comment \u00e7a marche), je suis ravi de partager avec vous comment consommer un mod\u00e8le d&rsquo;IA d\u00e9velopp\u00e9 en Python dans un autre langage de programmation (ici le C#). Cet apprentissage a \u00e9t\u00e9 pour moi tr\u00e8s excitant dans la mesure o\u00f9 je r\u00e9alise d&rsquo;avantage le champ des possibles dans le fait de pouvoir embed des applications boost\u00e9es \u00e0 l&rsquo;IA dans n&rsquo;importe quelle codebase, m\u00eame legacy! J&rsquo;ajoute que, si vous avez besoin de moderniser et d&rsquo;ajouter un sel d&rsquo;IA votre transformation digitale sans devoir tout casser dans votre syst\u00e8me existant,","og_url":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/","article_published_time":"2023-11-05T11:33:54+00:00","article_modified_time":"2024-02-28T13:14:11+00:00","og_image":[{"width":1792,"height":1024,"url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png","type":"image\/png"}],"author":"Yacine Touati","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Yacine Touati","Dur\u00e9e de lecture estim\u00e9e":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#article","isPartOf":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/"},"author":{"name":"Yacine Touati","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/2947c0a3dd038b2bf559d53fbc9c5576"},"headline":"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX","datePublished":"2023-11-05T11:33:54+00:00","dateModified":"2024-02-28T13:14:11+00:00","mainEntityOfPage":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/"},"wordCount":1528,"commentCount":0,"publisher":{"@id":"https:\/\/beta.reboot-conseil.com\/#organization"},"image":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage"},"thumbnailUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png","keywords":["IA"],"articleSection":["PyTorch","Tutoriels"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/","url":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/","name":"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX -","isPartOf":{"@id":"https:\/\/beta.reboot-conseil.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage"},"image":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage"},"thumbnailUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png","datePublished":"2023-11-05T11:33:54+00:00","dateModified":"2024-02-28T13:14:11+00:00","breadcrumb":{"@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#primaryimage","url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png","contentUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/11\/onnx3.png","width":1792,"height":1024,"caption":"une repr\u00e9sentation abstraite du format ONNX"},{"@type":"BreadcrumbList","@id":"https:\/\/beta.reboot-conseil.com\/index.php\/2023\/11\/05\/de-python-a-c-le-transfert-de-modeles-sous-format-onnx\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/beta.reboot-conseil.com\/"},{"@type":"ListItem","position":2,"name":"De Python \u00e0 C#: le transfert de mod\u00e8les sous format ONNX"}]},{"@type":"WebSite","@id":"https:\/\/beta.reboot-conseil.com\/#website","url":"https:\/\/beta.reboot-conseil.com\/","name":"AI Squad","description":"Dans le doute, Reboot","publisher":{"@id":"https:\/\/beta.reboot-conseil.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/beta.reboot-conseil.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/beta.reboot-conseil.com\/#organization","name":"AI Squad By Reboot Conseil","url":"https:\/\/beta.reboot-conseil.com\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/","url":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png","contentUrl":"https:\/\/beta.reboot-conseil.com\/wp-content\/uploads\/2023\/09\/cropped-cropped-Logo-IA-Squad-by-Reboot-Conseil-3.png","width":500,"height":218,"caption":"AI Squad By Reboot Conseil"},"image":{"@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/2947c0a3dd038b2bf559d53fbc9c5576","name":"Yacine Touati","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/beta.reboot-conseil.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/6da6ec3d9bbc05c0f70ccbd05c5fa47f4de7a9df9ec40ce281f012db7267c287?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/6da6ec3d9bbc05c0f70ccbd05c5fa47f4de7a9df9ec40ce281f012db7267c287?s=96&d=mm&r=g","caption":"Yacine Touati"},"sameAs":["https:\/\/ai.rebootconseil.com"]}]}},"_links":{"self":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts\/270","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/comments?post=270"}],"version-history":[{"count":55,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts\/270\/revisions"}],"predecessor-version":[{"id":844,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/posts\/270\/revisions\/844"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/media\/271"}],"wp:attachment":[{"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/media?parent=270"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/categories?post=270"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/beta.reboot-conseil.com\/index.php\/wp-json\/wp\/v2\/tags?post=270"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}