diff --git a/slides/fr/applications/_application3.qmd b/slides/fr/applications/_application3.qmd index 8869696..ccf73f0 100644 --- a/slides/fr/applications/_application3.qmd +++ b/slides/fr/applications/_application3.qmd @@ -180,7 +180,7 @@ data_path = "https://minio.lab.sspcloud.fr/projet-formation/diffusion/mlops/data # Charge le fichier Parquet dans un DataFrame pandas df = pd.read_parquet(data_path) -# Votre API URL +# URL de l'API api_url = "https://--api.lab.sspcloud.fr/predict" # Effectue les requêtes diff --git a/slides/fr/applications/_application5a.qmd b/slides/fr/applications/_application4a.qmd similarity index 100% rename from slides/fr/applications/_application5a.qmd rename to slides/fr/applications/_application4a.qmd diff --git a/slides/fr/applications/_application5b.qmd b/slides/fr/applications/_application4b.qmd similarity index 100% rename from slides/fr/applications/_application5b.qmd rename to slides/fr/applications/_application4b.qmd diff --git a/slides/fr/applications/_application4.qmd b/slides/fr/applications/_application5.qmd similarity index 96% rename from slides/fr/applications/_application4.qmd rename to slides/fr/applications/_application5.qmd index 09671a2..b40c48e 100644 --- a/slides/fr/applications/_application4.qmd +++ b/slides/fr/applications/_application5.qmd @@ -40,11 +40,11 @@ argo submit formation-mlops/hello_world.yaml -## Application 4 +## Application 5 :::{.nonincremental} :::: {.callout-tip collapse="true" icon=false} -## Partie 2 : décentralisation de l'optimisation des hyperparamètres +## Partie 2 : distriubtion de l'optimisation des hyperparamètres 1. Jetez un coup d'œil au fichier `argo_workflows/workflow.yml`. Que pensez-vous qu'il se passera lorsque nous soumettrons ce flux de travail ? 2. Modifiez la ligne surlignée de la même manière que dans l'application 3. diff --git a/slides/fr/index.qmd b/slides/fr/index.qmd index 33ef6fc..9a782bf 100644 --- a/slides/fr/index.qmd +++ b/slides/fr/index.qmd @@ -101,19 +101,19 @@ from: markdown+emoji . . . -:two: Un exemple concret: Prédiction du code APE pour les entreprises +:two: Un exemple concret: prédiction du code APE pour les entreprises . . . -:three: Déployer un modèle ML via une API +:three: Servir un modèle de ML à des utilisateurs . . . -:four: Distribuer l'optimisation des hyperparamètres +:four: Maintenance d'un modèle en production . . . -:five: Maintenance d'un modèle en production +:five: Distribuer l'optimisation des hyperparamètres ## Application 0 {.scrollable #app0} @@ -409,7 +409,127 @@ ojs_define(data_raw = df, data_prepro = df_prepro) {{< include applications/_application3.qmd >}} +## Bilan + +- `MLflow` est [**polyvalent**]{.orange} + - Utilisation dee [**frameworks custom**]{.blue2} (modulo une [**classe "interface"**]{.blue2}) + - [**Industrialisation**]{.blue2} de l'entraînement (fichier `MLproject`) + - [**Requêtage simple**]{.blue2} des modèles entraînés et stockés + +- [**Limite**]{.orange} : le modèle entraîné n'est pas [**accessible**]{.blue2} + - Requêtage simplifié... mais [**format non-pertinent**]{.blue2} pour tous les utilisateurs + - Le modèle n'est [**pas déployé**]{.blue2} + + + + + + + + + + + +# :four: Machine learning en production + +## Cycle de vie d'un modèle ML en production + +![Source: [martinfowler.com](martinfowler.com)](../img/ML-model-lifecycle.png){fig-align="center"} + +## Le défi de la responsabilité +::: {.nonincremental} + +- Le cycle de vie d'un modèle ML est [**complexe**]{.orange} +- Plusieurs [**parties prenantes**]{.orange} impliquées : + - [**Data scientist**]{.blue2} + - [**IT/DevOps**]{.blue2} + - [**Equipes métiers**]{.blue2} + +- [**Expertises**]{.orange} et [**vocabulaire**]{.orange} différents entre ces parties prenantes + +➡️ [**Communication**]{.orange} essentielle entre les équipes pour [**contrôler**]{.orange} le modèle en production +::: + +## Pourquoi surveiller un modèle en production ? +::: {.nonincremental} + +- Détecter des [**données biaisées**]{.orange} : adéquation entre les données de production et données d'entrainement +- Anticiper une [**instabilité du modèle**]{.orange} : performance du modèle stable au fil du temps +- [**Améliorer**]{.orange} de manière continue le modèle : ré-entrainements réguliers + +⚠️ Le mot [**surveillance**]{.red2} d'une application/modèle a des définitions différentes en fonction de l'équipe où l'on se trouve. +::: + +## Surveillance selon l'informaticien +::: {.nonincremental} + +- Surveiller une application est partie intégrante de l'approche [**DevOps**]{.orange} +- Contrôle [**technique**]{.orange} du modèle : + - Latence + - Mémoire + - Utilisation disque + - ... +::: + +## Surveillance selon le data scientist +::: {.nonincremental} + +- Surveiller un modèle ML est partie intégrante de l'approche [**MLOps**]{.orange} +- Contrôle [**méthodologique**]{.orange} du modèle +- Performance en [**temps réel**]{.orange} du modèle souvent impossible, utilisation de proxys : + - [**Data drift**]{.blue2} : la distribution des données d'entrée change dans le temps + - [**Concept drift**]{.blue2} : la relation modélisée change dans le temps +::: + +## Comment surveiller un modèle en production ? +::: {.nonincremental} + +- Intégration de [**logs**]{.orange} dans l'API +- Récupération et mise en forme des logs +- Suivi de [**métriques**]{.orange} de ML +- Mise en place d'un système d'[**alertes**]{.orange} +::: + +## Application 4 {.scrollable} + +{{< include applications/_application4a.qmd >}} + +## Observabilité du modèle grâce à un tableau de bord + +- Les logs de l'API contiennent maintenant des [**informations métier**]{.orange} +- Pour le [**traitement/stockage**]{.orange} des logs : pipeline [**ETL**]{.blue2} +- Pour analyser le comportement du moteur de codification : création d'un [**tableau de bord**]{.orange} +- Solutions multiples pour le [**tableau de bord**]{.orange} : [[**Grafana**]{.blue2}](https://grafana.com/), [[**Quarto Dashboards**]{.blue2}](https://quarto.org/docs/dashboards/), [[**Apache Superset**]{.blue2}](https://superset.apache.org/), ... + +## Un exemple de stack + +- [**ETL**]{.orange} sous forme d'un cron job qui parse les logs et les stocke au format `.parquet` +- Utilisation de [[**DuckDB**]{.orange}](https://duckdb.org/) pour requêter les fichiers `.parquet` +- ... et créer les composants d'un [**Quarto Dashboards**]{.orange} +- Le tableau de bord est un site statique à actualiser tous les jours par exemple + +## Un exemple de stack + +  +  +  +![](../img/dashboard-fr.png){fig-align="center"} + +## Application 4 {.scrollable} + +{{< include applications/_application4b.qmd >}} + +## Bilan + +- `MLflow` est [**polyvalent**]{.orange} + - Utilisation dee [**frameworks custom**]{.blue2} (modulo une [**classe "interface"**]{.blue2}) + - [**Industrialisation**]{.blue2} de l'entraînement (fichier `MLproject`) + - [**Requêtage simple**]{.blue2} des modèles entraînés et stockés + +- [**Limite**]{.orange} : le modèle entraîné n'est pas [**accessible**]{.blue2} + - Requêtage simplifié... mais [**format non-pertinent**]{.blue2} pour tous les utilisateurs + - Le modèle n'est [**pas déployé**]{.blue2} @@ -418,7 +538,8 @@ ojs_define(data_raw = df, data_prepro = df_prepro) -# :four: Distribuer l'optimisation des hyperparamètres + +# :five: Distribuer l'optimisation des hyperparamètres ## Entraînement distribué @@ -579,108 +700,16 @@ spec: - Autres outils d'orchestration natifs de Python : [**Apache Airflow**]{.orange}, [**Metaflow**]{.orange}, [**Prefect**]{.orange} -## Application 4 {.scrollable} - -{{< include applications/_application4.qmd >}} - - - - - - - - - - -# :five: Machine learning en production - -## Cycle de vie d'un modèle ML en production - -![Source: [martinfowler.com](martinfowler.com)](../img/ML-model-lifecycle.png){fig-align="center"} - -## Le défi de la responsabilité -::: {.nonincremental} - -- Le cycle de vie d'un modèle ML est [**complexe**]{.orange} -- Plusieurs [**parties prenantes**]{.orange} impliquées : - - [**Data scientist**]{.blue2} - - [**IT/DevOps**]{.blue2} - - [**Equipes métiers**]{.blue2} - -- [**Expertises**]{.orange} et [**vocabulaire**]{.orange} différents entre ces parties prenantes - -➡️ [**Communication**]{.orange} essentielle entre les équipes pour [**contrôler**]{.orange} le modèle en production -::: - -## Pourquoi surveiller un modèle en production ? -::: {.nonincremental} - -- Détecter des [**données biaisées**]{.orange} : adéquation entre les données de production et données d'entrainement -- Anticiper une [**instabilité du modèle**]{.orange} : performance du modèle stable au fil du temps -- [**Améliorer**]{.orange} de manière continue le modèle : ré-entrainements réguliers - -⚠️ Le mot [**surveillance**]{.red2} d'une application/modèle a des définitions différentes en fonction de l'équipe où l'on se trouve. -::: - -## Surveillance selon l'informaticien -::: {.nonincremental} - -- Surveiller une application est partie intégrante de l'approche [**DevOps**]{.orange} -- Contrôle [**technique**]{.orange} du modèle : - - Latence - - Mémoire - - Utilisation disque - - ... -::: - -## Surveillance selon le data scientist -::: {.nonincremental} - -- Surveiller un modèle ML est partie intégrante de l'approche [**MLOps**]{.orange} -- Contrôle [**méthodologique**]{.orange} du modèle -- Performance en [**temps réel**]{.orange} du modèle souvent impossible, utilisation de proxys : - - [**Data drift**]{.blue2} : la distribution des données d'entrée change dans le temps - - [**Concept drift**]{.blue2} : la relation modélisée change dans le temps -::: - -## Comment surveiller un modèle en production ? -::: {.nonincremental} - -- Intégration de [**logs**]{.orange} dans l'API -- Récupération et mise en forme des logs -- Suivi de [**métriques**]{.orange} de ML -- Mise en place d'un système d'[**alertes**]{.orange} -::: - ## Application 5 {.scrollable} -{{< include applications/_application5a.qmd >}} - -## Observabilité du modèle grâce à un tableau de bord - -- Les logs de l'API contiennent maintenant des [**informations métier**]{.orange} -- Pour le [**traitement/stockage**]{.orange} des logs : pipeline [**ETL**]{.blue2} -- Pour analyser le comportement du moteur de codification : création d'un [**tableau de bord**]{.orange} -- Solutions multiples pour le [**tableau de bord**]{.orange} : [[**Grafana**]{.blue2}](https://grafana.com/), [[**Quarto Dashboards**]{.blue2}](https://quarto.org/docs/dashboards/), [[**Apache Superset**]{.blue2}](https://superset.apache.org/), ... +{{< include applications/_application5.qmd >}} -## Un exemple de stack -- [**ETL**]{.orange} sous forme d'un cron job qui parse les logs et les stocke au format `.parquet` -- Utilisation de [[**DuckDB**]{.orange}](https://duckdb.org/) pour requêter les fichiers `.parquet` -- ... et créer les composants d'un [**Quarto Dashboards**]{.orange} -- Le tableau de bord est un site statique à actualiser tous les jours par exemple -## Un exemple de stack -  -  -  -![](../img/dashboard-fr.png){fig-align="center"} -## Application 5 {.scrollable} -{{< include applications/_application5b.qmd >}} # Conclusion @@ -698,4 +727,3 @@ spec: - Stratégie : [**changement incrémental**]{.orange} - [**Formation**]{.blue2} - Application à des [**projets pilotes**]{.blue2} -