AI Deploy - Tutoriel - Déployer un modèle ONNX avec FastAPI
Découvrez comment déployer le modèle DenseNet au format ONNX pour une inférence optimisée
Objectif
L'objectif de ce tutoriel est de vous montrer comment déployer un modèle ONNX pour une inférence optimisée grâce à AI Deploy.
Pour cela, vous allez utiliser un modèle DenseNet entraîné sur le jeu de données CIFAR-10 pour classifier des images, ainsi que le framework Python FastAPI pour créer l'API. Développer une API vous permettra d'utiliser votre modèle de Machine Learning pour l'inférence. Vous apprendrez également à construire et à utiliser une image Docker personnalisée pour un déploiement FastAPI.
Pour plus d'informations sur la façon d'entraîner DenseNet sur un jeu de données CIFAR-10, reportez-vous à la documentation suivante.
Voici un aperçu de l'API de classification d'images :
Prérequis
- Un projet AI Deploy créé au sein d'un projet Public Cloud
- Un utilisateur pour AI Deploy
- Docker installé sur votre ordinateur local ou une instance Docker Public Cloud déployée
- Quelques connaissances sur la construction d'images et les Dockerfile
- Vos poids obtenus après le fine-tuning du modèle DenseNet sur le jeu de données CIFAR-10 (reportez-vous à la partie « Export ONNX model for inference » du notebook sur le fine-tuning de DenseNet)
En pratique
Vous allez suivre différentes étapes pour construire votre app FastAPI.
- Plus d'informations sur les capacités de FastAPI sont disponibles ici.
- Un lien direct vers le code complet est disponible ici.
Avertissement
Vous devez avoir préalablement créé un conteneur Object Storage densenet-cifar10-onnx-model lors de l'entraînement de votre modèle via AI Notebooks.
Vérifiez que ce conteneur contient bien vos poids DenseNet au format ONNX. Ils seront nécessaires au déploiement de l'API !
Nous allons ici principalement voir comment écrire le code app.py, le fichier requirements.txt et le Dockerfile.
Créer l'app FastAPI
Créez un fichier Python nommé app.py.
À l'intérieur de ce fichier, importez les modules requis :
Initialisez une instance de FastAPI :
Chargez le modèle DenseNet au format ONNX :
Créez le dictionnaire avec l'index et le nom des classes :
Trouvez plus d'informations sur ces ID et noms de classes dans le notebook tutoriel.
Définissez la fonction Python qui traite les images en entrée :
Créez la fonction Python permettant d'obtenir le résultat de la prédiction :
Définissez la méthode GET :
Créez la méthode POST :
Écrire le fichier requirements.txt de l'application
Le fichier requirements.txt nous permettra d'indiquer tous les modules nécessaires au fonctionnement de notre application. Ce fichier sera utile lors de l'écriture du Dockerfile.
Écrire le Dockerfile de l'application
Votre Dockerfile doit commencer par l'instruction FROM indiquant l'image parente à utiliser. Dans notre cas, nous choisissons de partir d'une image python:3.10 :
Créez le répertoire personnel et ajoutez-y vos fichiers :
Installez le fichier requirements.txt qui contient les modules Python nécessaires à l'aide d'une commande pip install ... :
Définissez votre commande de lancement par défaut pour démarrer l'application :
Attribuez les droits d'accès corrects à l'utilisateur OVHcloud (42420:42420) :
Construire l'image Docker depuis le Dockerfile
Depuis le répertoire contenant votre Dockerfile, exécutez l'une des commandes suivantes pour construire l'image de votre application :
-
La première commande construit l'image en utilisant l'architecture par défaut de votre système. Cela peut fonctionner si votre machine utilise déjà l'architecture
linux/amd64, qui est requise pour exécuter des containers avec nos produits AI. Cependant, sur des systèmes avec une architecture différente (par exempleARM64surApple Silicon), l'image résultante ne sera pas compatible et ne pourra pas être déployée. -
La seconde commande cible explicitement l'architecture
linux/amd64afin de garantir la compatibilité avec nos services AI. Elle nécessitebuildx, qui n'est pas installé par défaut. Si vous n'avez jamais utilisébuildxauparavant, vous pouvez l'installer en exécutant :docker buildx install
L'argument point . indique que votre contexte de build (emplacement du Dockerfile et des autres fichiers nécessaires) est le répertoire courant.
L'argument -t vous permet de choisir l'identifiant à donner à votre image. Les identifiants d'image sont généralement composés d'un nom et d'un tag de version <name>:<version>. Pour cet exemple, nous avons choisi densenet-onnx-fastapi:latest.
Envoyer l'image vers le registre partagé
Avertissement Le registre partagé d'AI Deploy ne doit être utilisé qu'à des fins de test. Pensez à rattacher votre propre registre Docker. Plus d'informations à ce sujet sont disponibles ici. Les images envoyées vers ce registre sont réservées aux workloads AI Tools et ne seront pas accessibles pour des usages externes.
Afin d'exécuter des containers utilisant les produits AI, veuillez vous assurer que l'image Docker que vous allez envoyer respecte l'architecture cible linux/amd64. Vous pouvez, par exemple, construire votre image en utilisant buildx comme suit :
docker buildx build --platform linux/amd64 ...Trouvez l'adresse de votre registre partagé en lançant cette commande :
Connectez-vous au registre partagé avec vos identifiants habituels d'utilisateur AI Platform :
Envoyez l'image compilée vers le registre partagé :
Lancer l'app AI Deploy
La commande suivante démarre une nouvelle app exécutant votre app FastAPI :
Notes
-
--gpu 1: l'utilisation du modèle nécessite un GPU (device="cuda"). Veuillez choisir au moins 1 GPU. -
Pensez à ajouter l'attribut
--unsecure-httpsi vous souhaitez que votre application soit accessible sans authentification.
Interagir avec l'API déployée via le dashboard
En cliquant sur le lien de votre app AI Deploy, vous arriverez sur la page suivante.
Comment interagir avec votre API ?
Vous pouvez ajouter /docs à la fin de l'URL de votre app.
Dans notre exemple, l'URL est la suivante : https://1207af6f-1f5f-4c57-9c64-8738b89a16c8.app.gra.ai.cloud.ovh.net/docs
Elle fournit un dashboard complet pour interagir avec l'API !
Pour pouvoir envoyer une image à classifier, sélectionnez /uploadimage/ dans l'encart vert. Cliquez sur Try it out et ajoutez l'image de votre choix dans la zone dédiée.
Pour obtenir le résultat de la prédiction, cliquez sur le bouton Execute.
Félicitations ! Vous avez obtenu les résultats de la prédiction avec les labels et les scores de confiance.
Aller plus loin
- Vous pouvez imaginer déployer une app de segmentation d'images grâce à ce tutoriel.
- N'hésitez pas à utiliser Streamlit pour déployer une app Speech-to-Text.
Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.