33800 Docs

← Retour

Proposition : Optimisations AI Orchestrator

Date : 09/02/2026 Projet : ai-orchestrator (/stock_8to/33800-stack/projects/ai-orchestrator/app/main.py) Statut : EN ATTENTE DE VALIDATION


Problèmes identifiés

1. Bug : Perte de priorité au requeue

Quand un job échoue et est remis en queue, la priorité est lue depuis job_data.get("priority", 0). Si le champ est absent ou null dans le dict retourné par db_get_job(), la priorité retombe à 0 (normal) au lieu de conserver la priorité originale (ex: 1 = haute).

Lignes concernées : 3310, 3462

2. Limite parallélisme trop basse

max(1, min(5, count)) clamp à 5 max. Avec une 3090 (24 Go) + 2070 Super (8 Go), on peut faire plus pour les petits modèles.

Ligne concernée : 966

3. GPU1 décharge les modèles inutilement

La RTX 2070 Super ne fait QUE du Ollama (les autres tools GPU1 comme bark, musicgen, etc. sont des tools séparés qui stop_tool Ollama quand ils démarrent). Mais quand seul Ollama tourne, le modèle se décharge après le timeout par défaut d'Ollama (5 min), ce qui force un rechargement au prochain job.

4. Rechargement inutile si même modèle dans la queue

Ollama décharge/recharge le modèle entre les jobs même si le prochain job utilise le même modèle. On ne passe pas keep_alive dans les requêtes API.


Corrections proposées

Fix 1 : Préserver la priorité au requeue

Fichier : main.py

Ligne 3310 — remplacer :

await queue_push_job(job_id, job_data.get("priority", 0))

par :

await queue_push_job(job_id, job_data.get("priority") or 0)

Mais surtout, db_get_job() retourne dict(row) depuis PostgreSQL, et la table ai_jobs a bien une colonne priority. Donc job_data["priority"] devrait toujours exister. Le vrai fix est d'utiliser job_data["priority"] directement (comme c'est déjà fait ligne 3515).

Changements :

Fix 2 : Monter le max parallèle à 10

Fichier : main.py

Ligne 966 :

count = max(1, min(5, count))

count = max(1, min(10, count))

On pourra ensuite setter la valeur souhaitée via l'API POST /api/worker/parallel?count=8.

Avec mistral:latest (~4.5 Go VRAM), on peut théoriquement :

Note : OLLAMA_NUM_PARALLEL est aussi mis à jour sur win11 (ligne 975), Ollama utilisera cette valeur pour son propre scheduling interne.

Fix 3 : keep_alive long sur GPU1 (dédié Ollama)

Fichier : main.py

Dans execute_ollama_job(), ajouter keep_alive dans les requêtes API Ollama.

Changements dans execute_ollama_job() :

Après la ligne 2295 (api_url = f"http://{WIN11_HOST}:{port}"), ajouter :

# GPU1 (port 11435) is dedicated to Ollama - keep model loaded forever
# GPU0 (port 11434) is shared with other tools - keep model 30min
keep_alive = -1 if port == 11435 else "30m"

Puis ajouter "keep_alive": keep_alive dans chaque request_data dict :

Fix 4 : Pas de rechargement si même modèle (déjà géré par Ollama + keep_alive)

Avec le fix 3 (keep_alive), ce problème se résout de lui-même :

Aucun code supplémentaire nécessaire.


Résumé des modifications

Fix Lignes modifiées Impact
Priorité requeue 3310, 3462 Bug fix — jobs haute priorité gardent leur priorité
Max parallèle 966 Passe de 5 à 10 max
keep_alive GPU1 2295+, 2309, 2353, 2412 Modèle reste chargé sur GPU1 dédié

Fichier modifié : main.py uniquement Risque : Faible — pas de changement d'architecture, juste des paramètres Déploiement : git push → CI/CD redéploie le container ai-orchestrator