feat(memory): Ajout déchargement automatique mémoire sur FolzoCorp
- effi-stt: Déchargement Whisper après 300s inactivité (INACTIVITY_TIMEOUT) * Nouveaux endpoints: /unload, /reload, /stats * Modelo rechargé à la première requête - ComfyUI: Script monitor qui décharge VRAM après inactivité * Vérifie usage VRAM toutes les 60s * Exécute workflow UnloadAllModelsNode après 300s inactivité - Kreuzberg: Manager qui redémarre le container après seuil mémoire + inactivité * Restart si > 2GB pendant > 10min inactif - Documentation: docs/MEMOIRE-GESTION.md
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
# Gestion Mémoire - FolzoCorp
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Ce document décrit les mécanismes de gestion mémoire implementés sur **FolzoCorp** (192.168.1.11) pour optimiser l'utilisation RAM.
|
||||
|
||||
## Problème initial
|
||||
|
||||
- **RAM Totale**: 32 GB
|
||||
- **RAM Utilisée**: ~29 GB (93%)
|
||||
- **Swap utilisé**: 8 GB (100%)
|
||||
- **Cause principale**: ComfyUI (15.2 GB) + services permanentents
|
||||
|
||||
## Solutions implémentées
|
||||
|
||||
### 1. effi-stt (Whisper STT)
|
||||
|
||||
**Fichier**: `effi-stt/main.py`
|
||||
|
||||
**Mécanisme**: Déchargement automatique après inactivité
|
||||
|
||||
**Fonctionnement**:
|
||||
- Le modèle Whisper (`large-v3`) est chargé à la première utilisation
|
||||
- Après chaque requête, un timer de 300s (5 minutes) est démarré
|
||||
- Si aucune requête n'est reçue pendant ce délai, le modèle est déchargé
|
||||
- La mémoire est libérée via `gc.collect()`
|
||||
|
||||
**Nouveaux endpoints**:
|
||||
| Endpoint | Méthode | Description |
|
||||
|----------|---------|-------------|
|
||||
| `/unload` | POST | Déchargement manuel du modèle |
|
||||
| `/reload` | POST | Rechargement manuel du modèle |
|
||||
| `/stats` | GET | Statistiques (model_loaded, last_request_age) |
|
||||
|
||||
**Variables d'environnement**:
|
||||
| Variable | Défaut | Description |
|
||||
|----------|--------|-------------|
|
||||
| `INACTIVITY_TIMEOUT` | 300 | Timeout en secondes avant déchargement |
|
||||
|
||||
**Commandes**:
|
||||
```bash
|
||||
# Redémarrer avec les nouvelles variables
|
||||
cd effi-stt
|
||||
docker compose down
|
||||
docker compose up -d --build
|
||||
|
||||
# Vérifier le statut
|
||||
curl http://localhost:8200/stats
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. ComfyUI (Image + Audio Generation)
|
||||
|
||||
**Fichier**: `scripts/comfyui-unload-monitor.py`
|
||||
|
||||
**Mécanisme**: Monitoring externe + déchargement via API
|
||||
|
||||
**Fonctionnement**:
|
||||
- Script Python qui tourne en arrière-plan
|
||||
- Vérifie l'utilisation VRAM toutes les 60s
|
||||
- Après 300s (5 minutes) d'inactivité + VRAM utilisée:
|
||||
- Exécute un workflow pour décharger tous les modèles
|
||||
- Appelle `gc.collect()` et `torch.cuda.empty_cache()`
|
||||
|
||||
**Utilisation**:
|
||||
```bash
|
||||
# Lancer le monitor
|
||||
python3 scripts/comfyui-unload-monitor.py
|
||||
|
||||
# Avec paramètres personnalisés
|
||||
python3 scripts/comfyui-unload-monitor.py --timeout 600 --interval 30
|
||||
|
||||
# Mode debug
|
||||
python3 scripts/comfyui-unload-monitor.py --debug
|
||||
|
||||
# En arrière-plan (systemd)
|
||||
nohup python3 scripts/comfyui-unload-monitor.py > /var/log/comfyui-unload.log 2>&1 &
|
||||
```
|
||||
|
||||
**Démarrage automatique (systemd)**:
|
||||
```bash
|
||||
# Créer le service
|
||||
sudo tee /etc/systemd/system/comfyui-unload.service << EOF
|
||||
[Unit]
|
||||
Description=ComfyUI Model Unload Monitor
|
||||
After=network.target docker.service
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=folzo
|
||||
WorkingDirectory=/home/folzo/Documents/OpenCode/Projets/Effi
|
||||
ExecStart=/usr/bin/python3 scripts/comfyui-unload-monitor.py
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
# Activer le service
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable comfyui-unload
|
||||
sudo systemctl start comfyui-unload
|
||||
|
||||
# Vérifier le statut
|
||||
sudo systemctl status comfyui-unload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 3. Kreuzberg (Document Extraction)
|
||||
|
||||
**Fichier**: `scripts/kreuzberg-memory-manager.py`
|
||||
|
||||
**Mécanisme**: Restart automatique après inactivité + seuil mémoire
|
||||
|
||||
**Fonctionnement**:
|
||||
- Vérifie la mémoire du container toutes les 60s
|
||||
- Si mémoire > 2GB pendant > 10 minutes d'inactivité:
|
||||
- Redémarre le container kreuzberg
|
||||
- Libère toute la mémoire accumulée
|
||||
|
||||
**Note**: Kreuzberg est un service pre-built (image Rust), donc le déchargement interne n'est pas possible. Le restart container est la seule option pour libérer la mémoire.
|
||||
|
||||
**Utilisation**:
|
||||
```bash
|
||||
# Lancer le manager
|
||||
python3 scripts/kreuzberg-memory-manager.py
|
||||
|
||||
# Avec paramètres personnalisés
|
||||
python3 scripts/kreuzberg-memory-manager.py --timeout 600 --max-memory 1.5
|
||||
|
||||
# En arrière-plan (systemd)
|
||||
nohup python3 scripts/kreuzberg-memory-manager.py > /var/log/kreuzberg-mem.log 2>&1 &
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Impact mémoire attendu
|
||||
|
||||
| Service | Avant | Après (inactif) |
|
||||
|---------|-------|-----------------|
|
||||
| ComfyUI | 15.2 GB | ~500 MB (VRAM libérée) |
|
||||
| effi-stt | ~3 GB | ~100 MB (modèle déchargé) |
|
||||
| kreuzberg | 1 GB | ~100 MB (container redémarré) |
|
||||
| **Total** | **~20 GB** | **< 1 GB** |
|
||||
|
||||
---
|
||||
|
||||
## Surveillance
|
||||
|
||||
### Commandes utiles
|
||||
|
||||
```bash
|
||||
# Vérifier mémoire containers
|
||||
docker stats --no-stream
|
||||
|
||||
# Vérifier VRAM GPU
|
||||
rocm-smi --showmeminfo vram
|
||||
|
||||
# Statuts effi-stt
|
||||
curl http://localhost:8200/stats
|
||||
|
||||
# Logs du monitor ComfyUI
|
||||
tail -f /var/log/comfyui-unload.log
|
||||
|
||||
# Logs du manager Kreuzberg
|
||||
tail -f /var/log/kreuzberg-mem.log
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fichiers modifiés/créés
|
||||
|
||||
### Modifiés
|
||||
- `effi-stt/main.py` - Ajout timeout + déchargement
|
||||
- `effi-stt/Dockerfile` - Variable INACTIVITY_TIMEOUT
|
||||
- `effi-stt/docker-compose.yml` - Variable INACTIVITY_TIMEOUT
|
||||
|
||||
### Créés
|
||||
- `scripts/comfyui-unload-monitor.py` - Monitor déchargement ComfyUI
|
||||
- `scripts/kreuzberg-memory-manager.py` - Manager mémoire Kreuzberg
|
||||
- `docs/MEMOIRE-GESTION.md` - Cette documentation
|
||||
|
||||
---
|
||||
|
||||
## Limitations connues
|
||||
|
||||
1. **ComfyUI**: Le monitor utilise l'API ComfyUI. Si ComfyUI est complètement bloqué, le monitor pourrait ne pas fonctionner.
|
||||
|
||||
2. **Kreuzberg**: Le restart du container interrompt brièvement le service (~5-10s).
|
||||
|
||||
3. **effi-stt**: Le premier appel après déchargement sera plus lent (rechargement du modèle).
|
||||
|
||||
---
|
||||
|
||||
## Améliorations futures possibles
|
||||
|
||||
1. Intégrer les monitors dans Docker Compose avec des sidecars
|
||||
2. Ajouter des métriques Prometheus pour le monitoring
|
||||
3. Implémenter un agente Effi qui surveille et actionne selon les besoins
|
||||
Reference in New Issue
Block a user