Home
Login

ONNX Runtime : un accélérateur d'inférence et d'entraînement de machine learning multiplateforme et haute performance.

MITC++ 16.9kmicrosoft Last Updated: 2025-06-14

ONNX Runtime (ORT)

Introduction

ONNX Runtime (ORT) est un accélérateur d'inférence de machine learning multiplateforme, conçu pour accélérer le processus d'inférence des modèles ONNX (Open Neural Network Exchange). Développé et mis en open source par Microsoft, il prend en charge une variété de plateformes matérielles et de systèmes d'exploitation, et offre des capacités d'inférence haute performance.

Objectifs principaux :

  • Accélérer l'inférence des modèles ONNX : Améliorer la vitesse d'inférence des modèles ONNX en optimisant le graphe d'exécution et en utilisant l'accélération matérielle.
  • Prise en charge multiplateforme : Prend en charge les systèmes d'exploitation Windows, Linux, macOS, ainsi que diverses plateformes matérielles telles que CPU, GPU, FPGA.
  • Facilité d'intégration : Fournit des API dans plusieurs langages de programmation tels que C/C++, Python, Java, C#, facilitant l'intégration dans diverses applications.
  • Haute performance : Atteindre une inférence haute performance grâce à diverses techniques d'optimisation, telles que l'optimisation du graphe, la fusion d'opérateurs et l'optimisation de la mémoire.
  • Extensibilité : Permet aux utilisateurs de définir des opérateurs et des fournisseurs d'exécution personnalisés pour prendre en charge de nouvelles plateformes matérielles et de nouveaux algorithmes.

Principales caractéristiques

  • Prise en charge des modèles ONNX : Prend entièrement en charge la norme ONNX, permettant de charger et d'exécuter des modèles conformes aux spécifications ONNX.
  • Plusieurs fournisseurs d'exécution (Execution Providers, EPs) :
    • CPU EP : Utilise le CPU pour l'inférence, prenant en charge diverses optimisations du jeu d'instructions CPU (par exemple, AVX2, AVX512).
    • CUDA EP : Utilise le GPU NVIDIA pour l'inférence, en tirant parti de l'accélération CUDA.
    • TensorRT EP : Utilise NVIDIA TensorRT pour l'inférence, optimisant davantage les performances du GPU.
    • OpenVINO EP : Utilise la boîte à outils Intel OpenVINO pour l'inférence, optimisant les performances des CPU et GPU Intel.
    • DirectML EP : Utilise l'API Windows DirectML pour l'inférence, en tirant parti des ressources GPU sur Windows.
    • CoreML EP : Utilise le framework Apple CoreML pour l'inférence, optimisant les performances sur les appareils Apple.
    • Autres EP : Prend également en charge d'autres plateformes matérielles, telles que ARM NN, ACL, etc.
  • Optimisation du graphe : Optimise automatiquement le graphe du modèle ONNX, par exemple en fusionnant les opérateurs, en effectuant un repliement constant et en éliminant les nœuds, réduisant ainsi la charge de calcul et l'utilisation de la mémoire.
  • Fusion d'opérateurs : Fusionne plusieurs opérateurs en un seul, réduisant ainsi les frais de communication entre les opérateurs.
  • Prise en charge de la quantification : Prend en charge la quantification des modèles, convertissant les modèles à virgule flottante en modèles entiers, réduisant la taille du modèle et la charge de calcul, et améliorant la vitesse d'inférence.
  • Prise en charge des formes dynamiques : Prend en charge les modèles ONNX avec des formes dynamiques, permettant de traiter des données d'entrée de différentes tailles.
  • Options de session : Fournit de nombreuses options de session, permettant de contrôler divers aspects du processus d'inférence, tels que le nombre de threads, l'allocation de mémoire, le niveau d'optimisation du graphe, etc.
  • Outils de débogage : Fournit des outils de débogage pour aider les utilisateurs à analyser les goulots d'étranglement des performances des modèles ONNX.
  • Analyse des performances : Fournit des outils d'analyse des performances pour aider les utilisateurs à comprendre les indicateurs de performance des modèles ONNX, tels que le temps d'inférence, l'utilisation de la mémoire, etc.
  • Inférence distribuée : Prend en charge l'inférence distribuée, permettant de déployer des modèles ONNX sur plusieurs appareils pour l'inférence, augmentant ainsi le débit d'inférence.

Architecture

L'architecture d'ONNX Runtime comprend principalement les parties suivantes :

  1. Frontend : Responsable du chargement du modèle ONNX et de sa conversion en une représentation interne à ONNX Runtime.
  2. Optimiseur de graphe (Graph Optimizer) : Responsable de l'optimisation du graphe du modèle ONNX, par exemple la fusion d'opérateurs, le repliement constant, etc.
  3. Exécuteur (Executor) : Responsable de l'exécution du graphe du modèle ONNX, en distribuant les opérateurs à différentes plateformes matérielles pour l'exécution en fonction des différents fournisseurs d'exécution.
  4. Fournisseur d'exécution (Execution Provider) : Responsable de l'exécution des opérateurs sur une plateforme matérielle spécifique, telle que CPU, GPU, FPGA, etc.
  5. Session : Responsable de la gestion du cycle de vie du modèle ONNX, y compris le chargement du modèle, l'optimisation du modèle, l'exécution du modèle, la libération des ressources, etc.

Méthode d'utilisation

  1. Installer ONNX Runtime : ONNX Runtime peut être installé via pip, par exemple : pip install onnxruntime (version CPU) ou pip install onnxruntime-gpu (version GPU).
  2. Charger le modèle ONNX : Utilisez onnxruntime.InferenceSession pour charger le modèle ONNX.
  3. Préparer les données d'entrée : Convertissez les données d'entrée dans un format acceptable par ONNX Runtime, tel qu'un tableau NumPy.
  4. Exécuter l'inférence : Utilisez la méthode InferenceSession.run() pour exécuter l'inférence et obtenir les résultats de sortie.

Exemple de code (Python) :

import onnxruntime
import numpy as np

# Charger le modèle ONNX
session = onnxruntime.InferenceSession("model.onnx")

# Obtenir les informations d'entrée et de sortie
input_name = session.get_inputs()[0].name
output_name = session.get_outputs()[0].name

# Préparer les données d'entrée
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)

# Exécuter l'inférence
output_data = session.run([output_name], {input_name: input_data})

# Afficher les résultats de sortie
print(output_data)

Scénarios d'application

  • Reconnaissance d'image : Accélérer l'inférence des tâches de classification d'images, de détection d'objets, de segmentation d'images, etc.
  • Traitement du langage naturel : Accélérer l'inférence des tâches de classification de texte, de traduction automatique, de génération de texte, etc.
  • Reconnaissance vocale : Accélérer l'inférence des tâches de reconnaissance vocale, de synthèse vocale, etc.
  • Systèmes de recommandation : Accélérer l'inférence des modèles de recommandation, améliorant ainsi l'efficacité de la recommandation.
  • Autres tâches d'apprentissage automatique : Peut accélérer l'inférence de diverses tâches d'apprentissage automatique, telles que la régression, le clustering, etc.

Avantages

  • Haute performance : Atteindre une inférence haute performance grâce à diverses techniques d'optimisation.
  • Multiplateforme : Prend en charge plusieurs systèmes d'exploitation et plateformes matérielles.
  • Facilité d'intégration : Fournit des API dans plusieurs langages de programmation.
  • Flexible et extensible : Permet aux utilisateurs de définir des opérateurs et des fournisseurs d'exécution personnalisés.
  • Communauté active : Possède une communauté active, permettant d'obtenir un support technique et d'échanger des expériences.

Limites

  • Dépendance au format de modèle ONNX : Ne peut exécuter que les modèles au format ONNX, nécessitant la conversion des modèles d'autres formats au format ONNX.
  • La prise en charge de certains opérateurs peut être incomplète : Pour certains opérateurs spéciaux, la prise en charge d'ONNX Runtime peut être incomplète, nécessitant la définition d'opérateurs personnalisés par l'utilisateur.
  • Nécessite une certaine configuration et un certain réglage : Pour obtenir des performances optimales, il peut être nécessaire de configurer et de régler ONNX Runtime.

Conclusion

ONNX Runtime est un puissant accélérateur d'inférence de machine learning qui peut aider les utilisateurs à accélérer le processus d'inférence des modèles ONNX et à améliorer les performances des applications. Il présente des avantages tels que la haute performance, la multiplateforme, la facilité d'intégration, la flexibilité et l'extensibilité, et convient à diverses tâches d'apprentissage automatique.

Pour toutes les informations détaillées, veuillez vous référer au site officiel (https://github.com/microsoft/onnxruntime)