Construire une API LLM haute performance et prête pour la production avec FastAPI : Un guide étape par étape
Construire une API LLM haute performance et prête pour la production avec FastAPI : Un guide étape par étape
FastAPI, un framework web Python moderne et haute performance, est populaire pour sa facilité d'utilisation, sa rapidité et sa documentation API générée automatiquement. Il excelle particulièrement dans la construction d'API backend pour les applications LLM (Large Language Model). Cet article vous guidera étape par étape dans la construction d'une API LLM prête pour la production avec FastAPI, et explorera quelques bonnes pratiques.
Pourquoi choisir FastAPI ?
FastAPI offre les avantages clés suivants lors de la construction d'une API pour les applications LLM :
- Haute performance : Basé sur ASGI, FastAPI peut gérer des requêtes à haute concurrence, ce qui est essentiel pour les applications LLM qui nécessitent une réponse rapide.
- Support asynchrone : FastAPI prend en charge nativement les mots-clés
asyncetawait, ce qui facilite la gestion des opérations asynchrones, comme l'appel à l'inférence LLM, en évitant de bloquer le thread principal. - Documentation API automatique : FastAPI utilise OpenAPI et JSON Schema pour générer automatiquement une documentation API interactive (Swagger UI), ce qui permet aux développeurs de tester et d'utiliser facilement votre API.
- Validation des données : FastAPI utilise Pydantic pour la validation des données, garantissant l'exactitude des paramètres de requête et réduisant les erreurs.
- Injection de dépendances : Le système d'injection de dépendances de FastAPI facilite la gestion et le partage des ressources, comme les modèles LLM.
- Communauté active : FastAPI possède une communauté vaste et active, ce qui permet d'obtenir de nombreuses ressources et un support important.
Préparatifs
-
Installer Python : Assurez-vous d'avoir installé Python 3.7 ou une version ultérieure.
-
Installer FastAPI et Uvicorn : Utilisez pip pour installer FastAPI et Uvicorn (serveur ASGI) :
pip install fastapi uvicorn -
Choisir un modèle LLM : Choisissez le modèle LLM que vous souhaitez utiliser. Il peut s'agir d'un modèle OpenAI ou d'un modèle open source, tel que TinyLlama. Si vous choisissez OpenAI, vous devez obtenir une clé API OpenAI. Si vous choisissez TinyLlama, vous devez télécharger le fichier du modèle.
Étape 1 : Créer une application FastAPI
Créez un fichier nommé main.py et ajoutez le code suivant :
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
app = FastAPI(title="LLM API", description="Une API simple pour interagir avec les LLM.")
class InputText(BaseModel):
text: str
class OutputText(BaseModel):
generated_text: str
Ce code définit une application FastAPI et définit deux modèles Pydantic : InputText pour recevoir le texte d'entrée et OutputText pour renvoyer le texte généré.
Étape 2 : Ajouter la logique d'inférence LLM
Selon le modèle LLM que vous avez choisi, ajoutez la logique d'inférence correspondante. Voici un exemple d'utilisation de l'API OpenAI :
import openai
import os
# Obtenir la clé API OpenAI
openai.api_key = os.environ.get("OPENAI_API_KEY") # Il est recommandé d'utiliser les variables d'environnement
```@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Génère du texte basé sur le texte d'entrée en utilisant OpenAI.
"""
try:
response = openai.Completion.create(
engine="text-davinci-003", # Choisir le modèle
prompt=input_text.text,
max_tokens=150,
n=1,
stop=None,
temperature=0.7,
)
generated_text = response.choices[0].text.strip()
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Ce code définit une route /generate qui reçoit un objet InputText en entrée, appelle l'API OpenAI pour générer du texte et renvoie le texte généré sous forme d'objet OutputText. Notez qu'il faut remplacer text-davinci-003 par le modèle approprié que vous avez choisi.
Si vous utilisez des modèles locaux comme TinyLlama, vous devez installer les bibliothèques correspondantes, par exemple transformers, et charger le modèle en mémoire. Voici un exemple de code :
from transformers import pipeline
import torch
generator = pipeline('text-generation', model="TinyLlama/TinyLlama-1.1B-Chat-v1.0", torch_dtype=torch.bfloat16, device_map="auto")
@app.post("/generate", response_model=OutputText)
async def generate_text(input_text: InputText):
"""
Génère du texte basé sur le texte d'entrée en utilisant TinyLlama.
"""
try:
generated_text = generator(input_text.text, max_length=50, do_sample=True, temperature=0.7)[0]['generated_text']
return OutputText(generated_text=generated_text)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
Étape 3 : Exécuter l'application FastAPI
Exécutez l'application FastAPI avec Uvicorn :
uvicorn main:app --reload
```Ceci lancera un serveur local, et vous pourrez accéder à la documentation API générée automatiquement en visitant `http://127.0.0.1:8000/docs` dans votre navigateur. L'argument `--reload` permet de redémarrer automatiquement le serveur après chaque modification du code, ce qui facilite le développement.
## Étape 4 : Tester l'API
Utilisez la documentation de l'API ou des outils comme curl pour tester votre API. Par exemple, utilisez curl pour envoyer une requête POST :
```bash
curl -X POST -H "Content-Type: application/json" -d '{"text": "Tell me a joke about cats."}' http://127.0.0.1:8000/generate
Vous devriez recevoir une réponse JSON contenant le texte généré.
Étape 5 : Déploiement en production
Déployez votre application FastAPI en environnement de production, par exemple :
- Docker: Utilisez Docker pour conteneuriser votre application, ce qui facilite le déploiement et la gestion.
- Plateforme cloud: Déployez sur une plateforme cloud, comme AWS, Google Cloud Platform ou Azure. Azure Cosmos DB et Azure Functions, mentionnés dans le texte, peuvent être utilisés pour construire une API serverless. Modal peut également être utilisé pour déployer des applications FastAPI à mise à l'échelle automatique.
- Serveur: Déployez sur votre propre serveur.
Meilleures pratiques
- Utiliser des variables d'environnement pour stocker les informations sensibles: Ne codez pas en dur les informations sensibles comme les clés API dans votre code, utilisez plutôt des variables d'environnement.
- Ajouter des journaux (logging): Utilisez le module de journalisation pour enregistrer l'état de fonctionnement de l'API, ce qui facilite le débogage et la surveillance.
- Ajouter la gestion des erreurs: Utilisez des blocs
try...exceptpour gérer les exceptions potentielles et renvoyer des messages d'erreur appropriés. - Limitation du débit (Rate limiting): Utilisez un limiteur de débit pour empêcher l'utilisation abusive de l'API. FastAPI propose quelques bibliothèques de limitation de débit prêtes à l'emploi.
- Cache: Pour les requêtes répétées, vous pouvez utiliser le cache pour améliorer les performances.
- Surveillance (Monitoring): Utilisez des outils de surveillance pour surveiller les performances et la disponibilité de l'API.
Astuces avancées
- Traitement asynchrone: Pour l'inférence LLM qui prend du temps, utilisez les mots-clés
asyncetawaitpour le traitement asynchrone, afin d'éviter de bloquer le thread principal. - Réponse en flux (Streaming response): L'utilisation de la réponse en flux (StreamingResponse) permet de renvoyer le texte généré en temps réel, ce qui améliore l'expérience utilisateur.
- Multithreading/Multiprocessing: Pour l'inférence LLM gourmande en CPU, vous pouvez utiliser le multithreading ou le multiprocessing pour améliorer les performances.
- Accélération GPU: Si votre modèle LLM prend en charge l'accélération GPU, vous pouvez utiliser CUDA ou d'autres bibliothèques d'accélération GPU pour augmenter la vitesse d'inférence.





