ONNX et Azure Machine Learning : Créer et accélérer des modèles ML

Découvrez comment Open Neural Network Exchange (ONNX) peut optimiser l’inférence de votre modèle Machine Learning. L’inférence, ou notation du modèle, est la phase où le modèle déployé est utilisé pour la prédiction, généralement sur des données de production.

Il est difficile d’optimiser les modèles Machine Learning pour l’inférence (ou le scoring du modèle), car vous devez paramétrer le modèle et la bibliothèque d’inférence pour tirer le meilleur parti des fonctionnalités matérielles. Le problème devient extrêmement complexe lorsque vous souhaitez obtenir des performances optimales sur différents types de plateformes (cloud/edge, UC/GPU, etc.), étant donné que chaque plateforme a des caractéristiques et des fonctionnalités différentes. La complexité s’accroît si des modèles issus de diverses infrastructures doivent s’exécuter sur diverses plateformes. Il est très chronophage d’optimiser les différentes combinaisons d’infrastructures et de matériel. Il faut une solution de formation unique dans votre infrastructure par défaut et l’exécuter partout sur le cloud ou les appareils Edge. C’est là qu’entre en scène ONNX.

Microsoft et une communauté de partenaires ont créé ONNX : cette norme ouverte représente les modèles Machine Learning. Les modèles de nombreuses infrastructures notamment TensorFlow, PyTorch, SciKit-Learn, Keras, Chainer, MXNet et MATLAB et SparkML peuvent être exportés ou convertis au format ONNX standard. Une fois que les modèles sont au format ONNX, ils peuvent s’exécuter sur une multitude de plateformes et d’appareils.

ONNX Runtime est un moteur d’inférence haute performance pour le déploiement de modèles ONNX en production. Il est optimisé pour le cloud et les appareils Edge, et il fonctionne sur Linux, Windows et Mac. Écrit dans C++ , il dispose également d’API C, Python, C# , Java et JavaScript (node. js) pour l’utilisation dans un large éventail d’environnements. Le Runtime ONNX prend en charge les modèles DNN ainsi que ML traditionnels et s’intègre avec les accélérateurs sur différents matériels, comme TensorRT sur les GPU NVidia, OpenVINO sur les processeurs Intel, DirectML sur Windows, et bien plus encore. Grâce à ONNX Runtime, vous pouvez tirer parti de vastes optimisations à l’échelle de la production, des tests et des améliorations en cours.

Runtime ONNX est utilisé dans les services Microsoft à grande échelle, tels que Bing, Office et Azure Cognitive Services. Les gains de performances dépendent d’un certain nombre de facteurs, mais ces services Microsoft ont enregistré en moyenne des performances du processeur doublées. En plus des services Azure Machine Learning, le runtime ONNX s’exécute également dans d’autres produits fonctionnant avec les charges de travail Machine Learning, notamment :

Organigramme ONNX montrant la formation, les convertisseurs et le déploiement

Obtenir des modèles ONNX

Vous pouvez obtenir des modèles ONNX de plusieurs façons :

De nombreux modèles, y compris la classification d’images, la détection d’objets et le traitement de texte, peuvent être représentés en tant que modèles ONNX. Si vous rencontrez un problème avec un modèle qui ne peut pas être converti correctement, veuillez remonter le problème dans le GitHub du convertisseur correspondant que vous avez utilisé. Vous pouvez continuer à utiliser le modèle de format existant jusqu’à ce que le problème soit résolu.

Déployer des modèles ONNX dans Azure

Avec Azure Machine Learning, vous pouvez déployer, gérer et superviser vos modèles ONNX. En utilisant le workflow de déploiement standard et ONNX Runtime, vous pouvez créer un point de terminaison REST hébergé dans le cloud. Pour essayer par vous-même, consultez l’exemple complet de notebooks Jupyter fourni à la fin de cet article.

Installer et utiliser ONNX Runtime avec Python

Les packages Python pour ONNX Runtime sont disponibles sur PyPi.org (UC, GPU). Veuillez lire la configuration requise avant l’installation.

Pour installer ONNX Runtime pour Python, utilisez l’une des commandes suivantes :

pip install onnxruntime       # CPU build
pip install onnxruntime-gpu   # GPU build

Pour appeler ONNX Runtime dans votre script Python, utilisez :

import onnxruntime
session = onnxruntime.InferenceSession("path to model")

La documentation qui accompagne le modèle indique généralement les entrées et sorties pour l’utilisation du modèle. Vous pouvez également utiliser un outil de visualisation tel que Netron pour afficher le modèle. Le runtime ONNX vous permet également d’interroger les métadonnées, entrées et sorties du modèle :

session.get_modelmeta()
first_input_name = session.get_inputs()[0].name
first_output_name = session.get_outputs()[0].name

Pour déduire votre modèle, utilisez run et passez la liste des sorties à retourner (laissez vide si vous souhaitez toutes les retourner) et un mappage des valeurs d’entrée. Le résultat est une liste des sorties.

results = session.run(["output1", "output2"], {
                      "input1": indata1, "input2": indata2})
results = session.run([], {"input1": indata1, "input2": indata2})

Pour obtenir des informations de référence complètes sur l’API Python, consultez les documents de référence sur ONNX Runtime.

Exemples

Consultez how-to-use-azureml/déploiement/onnx pour obtenir des exemples de notebooks Python qui créent et déploient des modèles ONNX.

Découvrez comment exécuter des notebooks dans l’article Utiliser des notebooks Jupyter pour explorer ce service.

Vous trouverez des exemples d’utilisation dans d’autres langages dans la page GitHub relative au runtime ONNX.

En savoir plus

Apprenez-en davantage sur ONNX ou contribuez au projet :

Apprenez-en davantage sur ONNX Runtime ou contribuez au projet :