Skip to content

fix: résoudre les timeouts MLflow/MinIO dans le script de ré-entraînement#213

Merged
alanconqrepo merged 1 commit into
mainfrom
feat/mlflow-retrain-timeout-fix
May 15, 2026
Merged

fix: résoudre les timeouts MLflow/MinIO dans le script de ré-entraînement#213
alanconqrepo merged 1 commit into
mainfrom
feat/mlflow-retrain-timeout-fix

Conversation

@alanconqrepo
Copy link
Copy Markdown
Owner

Problème

L'exécution de train_iris.py via l'endpoint /retrain partait systématiquement en timeout. L'investigation avec des timestamps [TIMING] a permis d'identifier plusieurs causes cumulatives.

Causes identifiées

Cause Impact
MLFLOW_HTTP_REQUEST_TIMEOUT non défini Timeout par défaut 120s sur chaque appel HTTP MLflow
AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY absents du container API log_model pendait 15s — boto3 parcourt tous les credential providers avant d'abandonner
Bucket mlflow inexistant dans MinIO NoSuchBucket à chaque tentative d'upload d'artifact
MINIO_SECRET_KEY généré comme clé aléatoire séparée dans init_env.sh SignatureDoesNotMatch hors Docker (docker-compose injecte MINIO_ROOT_PASSWORD à la place)
log_metric() appelé en boucle (~23 fois) ~23 requêtes HTTP au lieu de 1 appel log_metrics() batch
Emoji 🏃 dans les messages de fin de run MLflow Crash charmap Windows → mlflow_run_id perdu silencieusement

Corrections

documentation/Scripts/train_iris.py

  • MLFLOW_HTTP_REQUEST_TIMEOUT=8 par défaut via setdefault
  • load_dotenv(find_dotenv()) — charge le .env quelle que soit le répertoire d'exécution
  • Wrapper UTF-8 sys.stdout/stderr pour neutraliser le crash charmap Windows
  • Credentials MinIO consolidés en section 1 avec fallback AWS_* > MINIO_ROOT_* > MINIO_*
  • Substitution automatique mlflow: / minio:localhost: hors Docker (détection /.dockerenv)
  • log_metrics() batch au lieu de log_metric() en boucle
  • Signature MLflow explicite via predict_proba() (float) — supprime le warning integer columns
  • Timestamps [TIMING] sur chaque étape pour diagnostiquer les futures lenteurs

docker-compose.yml

  • Ajout de MLFLOW_S3_ENDPOINT_URL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY dans le service API

docker/mlflow-entrypoint.sh

  • Création automatique du bucket mlflow dans MinIO au démarrage du service (boto3)

scripts/init_env.sh

  • MINIO_SECRET_KEY = MINIO_ROOT_PASSWORD (plus de clé générée séparément)
  • Génération de MLFLOW_TRACKING_USERNAME, MLFLOW_TRACKING_PASSWORD, MLFLOW_FLASK_SERVER_SECRET_KEY, MLFLOW_S3_ENDPOINT_URL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

.env.example

  • Documentation des nouvelles variables MLflow/MinIO avec commentaires

Test

# Depuis l'hôte (les hostnames Docker sont remplacés automatiquement)
$env:TRAIN_START_DATE = "2025-01-01"
$env:TRAIN_END_DATE   = "2025-12-31"
$env:OUTPUT_MODEL_PATH = ".\test_output.pkl"
cd documentation\Scripts
python .\train_iris.py

🤖 Generated with Claude Code

@alanconqrepo alanconqrepo merged commit 3bf930e into main May 15, 2026
2 of 4 checks passed
… les credentials

Problèmes identifiés lors de l'exécution du script de ré-entraînement :
- MLFLOW_HTTP_REQUEST_TIMEOUT non défini → timeout par défaut 120s
- Credentials MinIO absents du container API → log_model pendait 15s (boto3 explore tous les providers)
- Bucket 'mlflow' inexistant dans MinIO → NoSuchBucket à l'upload d'artifact
- Crash charmap Windows sur l'emoji 🏃 dans les messages de fin de run MLflow
- MINIO_SECRET_KEY généré comme clé séparée → SignatureDoesNotMatch hors Docker
- Chaque appel log_metric() individuel → ~23 requêtes HTTP au lieu de 1

Corrections :
- Ajout MLFLOW_HTTP_REQUEST_TIMEOUT=8 par défaut dans le script
- Ajout AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / MLFLOW_S3_ENDPOINT_URL dans le service API (docker-compose.yml)
- Création automatique du bucket 'mlflow' dans mlflow-entrypoint.sh au démarrage
- Wrapper UTF-8 sys.stdout/stderr pour neutraliser le crash charmap
- MINIO_SECRET_KEY = MINIO_ROOT_PASSWORD dans init_env.sh (cohérent avec docker-compose)
- log_metrics() batch au lieu de log_metric() en boucle
- Signature MLflow explicite via predict_proba() (float) pour éviter le warning integer columns
- Substitution automatique mlflow:/minio: → localhost: hors Docker (détection /.dockerenv)
- load_dotenv(find_dotenv()) pour charger le .env quelle que soit le répertoire d'exécution
- Nouvelles variables dans .env.example : MLFLOW_TRACKING_USERNAME, MLFLOW_TRACKING_PASSWORD, MLFLOW_FLASK_SERVER_SECRET_KEY, MLFLOW_S3_ENDPOINT_URL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant