fix(etl): fiabilise airflow-init, borne les DAGs ML et ajoute la CI Airflow
Airflow / Lint et intégrité des DAGs (push) Successful in 1m10s
Airflow / Construction de l'image (push) Successful in 1m47s

This commit is contained in:
Dorian
2026-09-21 11:18:02 +02:00
parent 6f6f451eb4
commit 901ceffd72
10 changed files with 205 additions and 40 deletions
+16 -9
View File
@@ -1,14 +1,15 @@
"""DAG d'entrainement du modele LightGBM (issue #115).
Pas de planification : reentrainer est couteux et sa cadence n'est pas une decision prise
(cf. `docs/architecture/20-backend.md`). Declenchement manuel depuis l'UI ou la CLI Airflow en
attendant. `ml_score` (DAG separe, planifie toutes les heures) reutilise le modele que ce DAG
ecrit, il ne reentraine jamais rien lui-meme.
Pas de planification : reentrainer est couteux et sa cadence n'est pas une decision prise, en
particulier tant que `train.py` ecrase le modele sans comparer ses metriques a l'ancien (cf.
`docs/architecture/10-infra.md`, section Airflow). Declenchement manuel depuis l'UI ou la CLI
Airflow en attendant. `ml_score` (DAG separe, planifie toutes les heures) reutilise le modele que
ce DAG ecrit, il ne reentraine jamais rien lui-meme.
"""
from __future__ import annotations
from datetime import datetime
from datetime import datetime, timedelta
from airflow.models.dag import DAG
from airflow.operators.bash import BashOperator
@@ -22,15 +23,21 @@ with DAG(
schedule=None,
start_date=datetime(2026, 1, 1),
catchup=False,
# Deux entrainements simultanes ecriraient le meme fichier modele.
max_active_runs=1,
tags=["ml"],
) as dag:
# `--frozen --no-dev` : l'environnement `/opt/ml/.venv` est fige a la construction de l'image
# (groupe `dev` exclu). Sans `--no-dev` ici, `uv run` resynchronise ruff/mypy a chaque
# execution : un acces reseau evitable, sur le chemin d'execution d'une tache planifiee.
# `--no-sync` : l'environnement `/opt/ml/.venv` est fige a la construction de l'image, `uv run`
# ne le resynchronise pas (sinon `enervision-ml` est reconstruit a chaque tache).
# `env -u VIRTUAL_ENV` : l'image de base positionne celui d'Airflow, que `uv` signale a chaque
# execution sans qu'il change quoi que ce soit.
BashOperator(
task_id="train",
bash_command=(
"cd /opt/ml && uv run --frozen --no-dev python -m enervision_ml.train "
"cd /opt/ml && env -u VIRTUAL_ENV uv run --no-sync python -m enervision_ml.train "
f"--model-output {MODEL_PATH} --mlflow-tracking-uri {MLFLOW_TRACKING_URI}"
),
# Un entrainement complet dure quelques minutes ; une connexion pendue ne doit pas
# immobiliser un slot du scheduler indefiniment.
execution_timeout=timedelta(hours=1),
)