Files
Effi/docs/MEMOIRE-GESTION.md
T
Folzo f69dda5e20 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
2026-04-12 09:26:29 +02:00

203 lines
5.3 KiB
Markdown

# 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