Ce projet implémente un système de gestion de file d'attente intelligent pour contrôler l'accès à Lucie, notre modèle de langage (LLM) entraîné from scratch. Face à l'intérêt croissant pour les modèles de langage open source et la nécessité de gérer efficacement les ressources de calcul, ce système permet d'offrir une expérience utilisateur optimale tout en maintenant la stabilité du service.
Lucie est déployée via une interface basée sur open web-ui, permettant au public de tester et d'interagir avec le modèle. Cependant, pour garantir des performances optimales et une expérience utilisateur de qualité, nous devons limiter le nombre d'accès simultanés tout en assurant une distribution équitable du temps d'utilisation.
- Gestion des ressources : Optimise l'utilisation des ressources GPU/CPU nécessaires pour faire fonctionner le modèle
- Équité d'accès : Assure une distribution équitable du temps d'accès entre les utilisateurs
- Expérience utilisateur : Offre une visibilité claire sur le temps d'attente et la disponibilité
- Stabilité : Évite la surcharge du système en contrôlant le nombre d'utilisateurs simultanés
- Gestion de 50 sessions utilisateurs simultanées
- Sessions limitées à 20 minutes pour maximiser le nombre d'utilisateurs servis
- Système de "draft" de 5 minutes permettant une transition fluide entre les utilisateurs
- Mécanisme de file d'attente transparent avec notifications en temps réel
- Intégration seamless avec l'interface open web-ui
🧪 Rapport de Tests - 2025-01-09 22:10:17 - 25/34 PASSED
- 🔄 File d'attente en temps réel
- 👥 Gestion de 50 utilisateurs simultanés
- ⏲️ Sessions de 20 minutes
- 🎟️ Système de réservation temporaire (draft)
- 📊 Métriques en temps réel
- 🔔 Notifications via Redis Pub/Sub
- FastAPI : APIrest et Websocket
- Redis : Cache et pub/sub
- Celery : Gestion des tâches asynchrones
- Docker : Service management
- Python 3.12+
- Docker et Docker Compose
- Poetry
dev run [--host] [--port] [--reload]
dev docker-up # Démarre les services
dev docker-down # Stop services
dev docker-logs # Affiche les logs
test run [--cov] [--html] [test_path]
test docker [--logs] [--test-only]
# Exécuter les tests et mettre à jour le README
test update-doc [test_path]
# Mettre à jour le README avec le dernier rapport sans relancer les tests
test update-doc --insert
Option | Description |
---|---|
--logs |
Affiche les logs détaillés des tests |
--test-only |
Affiche uniquement les résultats des tests (sans logs Docker) |
--cov |
Active la couverture de code |
--html |
Génère un rapport HTML de couverture |
--insert |
Met à jour le README avec le dernier rapport sans relancer les tests |
option | description |
---|---|
format black [--check] | Formatage avec black |
format isort | Tri des imports |
format lint | Vérification avec flake8 |
format all | Exécute tous les formatages |
load-test single USER_ID
load-test group --size 50
load-test load --users 200 --batch-size 20 --delay 5
- Tests unitaires : Teste les composants individuellement
- Tests d'intégration : Vérifie l'interaction entre les composants
- Tests API : Valide les endpoints HTTP
- Tests de charge : Évalue les performances sous charge
poetry run test run
poetry run test run --cov --html
poetry run test docker
Endpoint | Méthode | Description |
---|---|---|
/queue/join/{user_id} |
POST | Rejoindre la file d'attente |
/queue/confirm/{user_id} |
POST | Confirmer la connexion |
/queue/leave/{user_id} |
POST | Quitter la file |
/queue/status/{user_id} |
GET | Obtenir le statut |
/queue/metrics |
GET | Obtenir les métriques |
- Waiting : En attente dans la file (position > 0)
- Draft : Slot disponible et temporairement réservé (5 minutes pour confirmer)
- Connected : Session active (20 minutes)
- Disconnected : Déconnecté du système
Waiting → Draft
: Quand un slot devient disponibleDraft → Connected
: Après confirmation dans les 5 minutesDraft → Waiting
: Si pas de confirmation dans les 5 minutes (retour en file)Connected → Disconnected
: Après 20 minutes ou déconnexion manuelle
Canal | Description | Exemple de message |
---|---|---|
queue_status:{user_id} |
En attente | {"status": "waiting", "position": 5} |
queue_status:{user_id} |
Slot disponible | {"status": "draft", "duration": 300} |
queue_status:{user_id} |
Connexion confirmée | {"status": "connected", "session_duration": 1200} |
queue_status:{user_id} |
Session expirée | {"status": "disconnected", "reason": "session_timeout"} |
queue_status:{user_id} |
Draft expiré | {"status": "waiting", "reason": "draft_timeout", "position": 5} |
- Utilisateur rejoint la file
{
"user_id": "user123",
"status": "waiting",
"position": 5,
"estimated_wait": 600
}
- Slot devient disponible
{
"user_id": "user123",
"status": "slot_available",
"duration": 300,
"expires_at": "2024-01-20T15:30:00Z"
}
- Connexion confirmée
{
"user_id": "user123",
"status": "connected",
"session_duration": 1200,
"expires_at": "2024-01-20T16:00:00Z"
}
- Notification d'expiration imminente
{
"user_id": "user123",
"status": "expiring_soon",
"remaining_time": 60,
"session_type": "active"
}
- Notification de déconnexion
{
"user_id": "user123",
"status": "disconnected",
"reason": "session_timeout",
"requeue_position": 3
}
- Slot -> Place disponible pour un utilisateur actif dans le système
- Draft -> Période de réservation temporaire (5 minutes) pendant laquelle un utilisateur peut confirmer sa connexion
- Session -> Durée de connexion active (20 minutes) pendant laquelle un utilisateur peut utiliser le système
- File d'attente -> Liste ordonnée des utilisateurs en attente d'un slot
- Pub/Sub -> Système de publication/souscription de Redis permettant la communication en temps réel, c'est mieux que le websocket quand la communication est unidirectionnel (notification)
Le projet utilise un Makefile pour automatiser l'installation et la configuration de l'environnement de développement.
Commande | Description |
---|---|
make setup |
Installation complète (pyenv, Python 3.12, Poetry, dépendances) |
make install-pyenv |
Installation de pyenv |
make install-python |
Installation de Python 3.12.1 via pyenv |
make install-poetry |
Installation de Poetry |
make install-deps |
Installation des dépendances du projet |
make dev |
Démarrage du serveur de développement |
make test |
Exécution des tests |
make docker-up |
Démarrage des services Docker |
make docker-down |
Arrêt des services Docker |
make clean |
Nettoyage des fichiers temporaires et caches |
- Installation complète automatique :
make setup
source ~/.bashrc
- Installation étape par étape :
# Installation de pyenv
make install-pyenv
source ~/.bashrc
# Installation de Python 3.12
make install-python
# Installation de Poetry
make install-poetry
# Installation des dépendances
make install-deps
# Démarrer le serveur de développement
make dev
# Lancer les tests
make test
# Démarrer les services Docker
make docker-up
# Arrêter les services Docker
make docker-down
# Nettoyer les fichiers temporaires et caches
make clean
Pour voir toutes les commandes disponibles :
make help