Fix Multi-GPU AI Orchestrator - Fiabilisation complete
Date : 09/02/2026
Status : TERMINE
Commits : c2bca5d, 511508f, 80e265c, 70e100d, 236fc9a
Contexte
Apres l'ajout de la RTX 2070 Super (session 07/02), le systeme multi-GPU avait 6 bugs critiques empechant un fonctionnement fiable.
Modifications effectuees
1. Registre Windows (win11)
- Supprime
HKCU\Environment\CUDA_VISIBLE_DEVICES=1 qui forcait TOUS les outils sur la RTX 2070 Super (8 Go) au lieu de la RTX 3090 (24 Go)
- Wan2.1 (12-18 Go VRAM) sur 2070 = OOM garanti
2. start_tool() - CUDA injection (app/main.py)
- Avant:
.bat files pas wrappees avec CUDA_VISIBLE_DEVICES
- Apres: TOUS les outils recoivent
set CUDA_VISIBLE_DEVICES={gpu_id} && ...
3. finally block - active_tools cleanup (app/main.py)
- Avant:
active_tools[gpu_id] = None apres CHAQUE job → orchestrateur "oubliait" les serveurs actifs
- Apres: seuls les CLI tools (sadtalker, wan21, facefusion) liberent le GPU. Les serveurs (ollama, comfyui, etc.) restent marques actifs
4. Worker concurrent par GPU (app/main.py)
- Avant: worker mono-tache, bloquait les 2 GPUs pendant un job
- Apres:
asyncio.create_task() par GPU, dispatch concurrent. GPU0 peut travailler pendant que GPU1 execute un autre job
5. Validation GPU au demarrage (app/main.py lifespan)
- Ajout check
get_all_gpu_status() au startup
- Log des GPUs disponibles avec VRAM libre et temperature
- Warning si win11 inaccessible ou 0 GPUs detectes
6. Cache GPU status + pre-check (app/main.py)
- Cache nvidia-smi 30s (
get_cached_gpu_status()) pour eviter spam SSH
- Pre-check GPU avant chaque job: si GPU unreachable → requeue au lieu d'executer
7. refresh_tools_status fix (app/main.py)
- Avant: reset active_tools AVANT scan → perte de tracking pendant le scan
- Apres: scan dans
new_active, puis apply atomiquement
8. VRAM-aware scheduling (commit 511508f)
- Worker intelligent: estime la VRAM par outil/modele (embeddings 400MB, 7B 4500MB, wan21 18GB...)
- Server tools (ollama): concurrent, jusqu'a 10 requetes par GPU
- Exclusive tools: un seul job par GPU, pas de fallback vers un autre GPU
- Fallback GPU uniquement pour ollama (remapping ollama ↔ ollama-gpu1)
- RTX 3090 pour les gros jobs, RTX 2070S en support pour les embeddings
9. GPU attribution (commit 70e100d)
- Colonne
gpu_id ajoutee a la table ai_jobs (ALTER TABLE)
- Chaque job enregistre quel GPU l'a execute (0=RTX 3090, 1=RTX 2070S)
- Dashboard: badge GPU vert/orange sur chaque job card + details modal
- Logs:
job_completed job_id=xxx gpu=GPU0 processing_time_ms=xxx
10. Fix exclusive GPU fallback (commit 236fc9a)
- Les outils exclusifs (wan21, musicgen, comfyui...) ne tentent que leur GPU configure
- Evite le dispatch musicgen→GPU1 puis requeue immediat
- Sleep requeue passe de 2s a 5s pour reduire le busy loop
11. Dashboard ameliorations (commit 80e265c)
- Suppression selecteur "parallel jobs" (plus pertinent avec VRAM-aware)
- CSS mobile responsive pour la barre de filtres
- Badge GPU par job
Fichiers modifies
app/main.py : multiples iterations
ai-jobs.html : dashboard
Verification
curl https://ai-orchestrator.33800.nowhere84.com/api/gpu → 2 GPUs avec donnees live
- Test concurrent: wan21 GPU0 + ollama embeddings GPU1 en parallele ✅
- GPU attribution visible dans API:
"gpu_id": 0 pour wan21 ✅
- Musicgen attend GPU0 sans fallback GPU1 ✅
Point d'attention
- Ollama GPU1 (port 11435) ne demarre pas sur win11 → a investiguer separement