diff --git a/.nojekyll b/.nojekyll index 1dc16cd..7a224bd 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -71582447 \ No newline at end of file +a8743ef5 \ No newline at end of file diff --git a/search.json b/search.json index 2f274a9..a5b0d21 100644 --- a/search.json +++ b/search.json @@ -60,7 +60,7 @@ "href": "slides/fr/index.html#app0", "title": "Une introduction au MLOps avec MLflow", "section": "Application 0", - "text": "Application 0\n\nSans GitAvec Git\n\n\n\n\n\nPréparation de l’environnement de travail\n\n\n\n\nCréez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.\nLancez un service MLflow en cliquant sur cette URL.\nLancez un service Jupyter-python en cliquant sur cette URL.\nOuvrez le service Jupyter-python et saisissez le mot de passe du service.\nVous êtes prêt !\n\n\n\n\n\n\n\n\n\n\nPréparation de l’environnement de travail\n\n\n\n\nOn suppose que vous possédez un compte Github et que vous avez déjà créé un token. Forkez le repo de la formation en cliquant ici.\nCréez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.\nLancez un service MLflow en cliquant sur cette URL.\nLancez un service Jupyter-python en cliquant sur cette URL.\nOuvrez le service Jupyter-python et saisissez le mot de passe du service.\nDans Jupyter, ouvrez un terminal et clonez votre dépôt que vous venez de fork (modifiez les deux premières lignes) :\nGIT_REPO=formation-mlops\nGIT_USERNAME=InseeFrLab\n\ngit clone https://github.com/$GIT_USERNAME/$GIT_REPO.git\ncd $GIT_REPO\nInstallez les packages nécessaires pour la formation :\npip install -r requirements.txt\npython -m nltk.downloader stopwords\nVous êtes prêt !" + "text": "Application 0\n\nSans GitAvec Git\n\n\n\n\n\nPréparation de l’environnement de travail\n\n\n\n\nCréez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.\nLancez un service MLflow en cliquant sur cette URL.\nLancez un service VSCode-python en cliquant sur cette URL.\nOuvrez le service VSCode-python et saisissez le mot de passe du service.\nVous êtes prêt !\n\n\n\n\n\n\n\n\n\n\nPréparation de l’environnement de travail\n\n\n\n\nSi ce n’est pas déjà fait, créez un compte Github. Créez une copie du dépôt de la formation dans votre espace personnel en forkant le dépôt.\nSi ce n’est pas déjà fait, créez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.\nLancez un service MLflow en cliquant sur cette URL.\nLancez un service VSCode-python en cliquant sur cette URL.\nOuvrez le service VSCode-python et saisissez le mot de passe du service.\nDans VSCode, ouvrez un terminal et clonez le dépôt que vous venez de fork (modifiez les deux premières lignes) :\nGIT_REPO=formation-mlops\nGIT_USERNAME=InseeFrLab\n\ngit clone https://github.com/$GIT_USERNAME/$GIT_REPO.git\ncd $GIT_REPO\nInstallez les packages nécessaires pour la formation :\npip install -r requirements.txt\npython -m nltk.downloader stopwords\nVous êtes prêt !" }, { "objectID": "slides/fr/index.html#tracking-server", @@ -95,7 +95,14 @@ "href": "slides/fr/index.html#application-1", "title": "Une introduction au MLOps avec MLflow", "section": "Application 1", - "text": "Application 1\n\n\n\nIntroduction aux concepts de MLflow\n\n\n\n\nDans JupyterLab, ouvrez le notebook situé à l’emplacement formation-mlops/notebooks/mlflow-introduction.ipynb.\nExécutez le notebook cellule par cellule. Si vous avez terminé plus tôt, explorez l’interface utilisateur de MLflow et essayez de créer vos propres expériences à partir du code d’exemple fourni dans le notebook." + "text": "Application 1\n\n\n\nIntroduction aux concepts de MLflow\n\n\n\n\nDans VSCode, ouvrez le notebook situé à l’emplacement formation-mlops/notebooks/mlflow-introduction.ipynb.\nExécutez le notebook cellule par cellule.\nSi vous avez terminé plus tôt, explorez l’interface utilisateur de MLflow et essayez de créer vos propres expérimentations à partir du code d’exemple fourni dans le notebook. Par exemple, essayez d’ajouter d’autres hyperparamètres à la procédure de grid-search." + }, + { + "objectID": "slides/fr/index.html#bilan", + "href": "slides/fr/index.html#bilan", + "title": "Une introduction au MLOps avec MLflow", + "section": "Bilan", + "text": "Bilan\n\nMLflow simplifie le suivi de l’entraînement de modèles\n\nGarde trace des expérimentations et de leurs outputs\nIntégration simple avec les principaux frameworks de ML\n\nLimites\n\nComment utiliser des frameworks custom (non-nativement intégrés) ?\nComment passer de l’expérimentation à la mise en production ?" }, { "objectID": "slides/fr/index.html#contexte-1", @@ -116,7 +123,7 @@ "href": "slides/fr/index.html#données-utilisées", "title": "Une introduction au MLOps avec MLflow", "section": "Données utilisées", - "text": "Données utilisées\n\nDonnéesBrutesPré-traitée\n\n\n\nUn cas d’utilisation simple avec seulement 2 variables :\n\nDescription textuelle de l’activité - text\nCode APE vrai labelisé par le moteur de règles – nace (732 modalités)\n\nPrétraitements standards :\n\nPassage en minuscules\nSuppression de la ponctuation\nSuppression des nombres\nSuppression des mots vide de sens\nRacinisation (stemming)\n…\n\n\n\n\n\nviewof table_data = Inputs.table(transpose(data_raw), {\n rows: 22\n})\n\n\n\n\n\n\n\n\n\nviewof table_data_prepro = Inputs.table(transpose(data_prepro), {\n rows: 22\n})" + "text": "Données utilisées\n\nDonnéesBrutesPré-traitée\n\n\n\nUn cas d’utilisation simple avec seulement 2 variables :\n\nDescription textuelle de l’activité - text\nCode APE vrai labelisé par le moteur de règles – nace (732 modalités)\n\nPrétraitements standards :\n\nPassage en minuscules\nSuppression de la ponctuation\nSuppression des nombres\nSuppression des stop words\nRacinisation (stemming)\n…\n\n\n\n\n\nviewof table_data = Inputs.table(transpose(data_raw), {\n rows: 22\n})\n\n\n\n\n\n\n\n\n\nviewof table_data_prepro = Inputs.table(transpose(data_prepro), {\n rows: 22\n})" }, { "objectID": "slides/fr/index.html#mlflow-avec-framework-non-standard", @@ -144,28 +151,42 @@ "href": "slides/fr/index.html#application-2", "title": "Une introduction au MLOps avec MLflow", "section": "Application 2", - "text": "Application 2\n\nSans GitAvec Git\n\n\n\n\n\nPartie 1 : Des notebooks à un projet de type package\n\n\n\n\nLancez un service VSCode en cliquant sur cette URL. Ouvrez le service et saisissez le mot de passe du service.\nTous les scripts liés à notre modèle personnalisé sont stockés dans le dossier src. Consultez-les. Regardez également le fichier MLproject.\nExécutez un entraînement du modèle à l’aide de MLflow. Pour ce faire, ouvrez un terminal ( -> Terminal -> New Terminal) et exécutez la commande suivante :\nexport MLFLOW_EXPERIMENT_NAME=\"nace-prediction\"\nmlflow run ~/work/formation-mlops/ --env-manager=local \\\n -P remote_server_uri=$MLFLOW_TRACKING_URI \\\n -P experiment_name=$MLFLOW_EXPERIMENT_NAME\nDans l’interface de MLflow, examinez les résultats de votre exécution précédente :\n\nExperiments -> nace-prediction -> <nom_run>\n\nVous avez entraîné le modèle avec certains paramètres par défaut. Dans le fichier MLproject, vérifiez les paramètres disponibles. Ré-entraînez un modèle avec différents paramètres (par exemple, dim = 25).\n\n\n\nCliquez pour voir la commande \n\nmlflow run ~/work/formation-mlops/ --env-manager=local \\\n -P remote_server_uri=$MLFLOW_TRACKING_URI \\\n -P experiment_name=$MLFLOW_EXPERIMENT_NAME \\\n -P dim=25\n\n\nDans MLflow, comparez les 2 modèles en traçant l’exactitude par rapport à un paramètre que vous avez modifié (par exemple dim)\n\nSélectionnez les 2 expériences -> Compare -> Scatter Plot -> Select your X and Y axis\n\n\n\n\n\n\n\n\n\n\n\nPartie 1 : Des notebooks à un projet de type package\n\n\n\n\nLancez un service VSCode en cliquant sur cette URL. Ouvrez le service et saisissez le mot de passe du service.\nDans VSCode, ouvrez un terminal ( -> Terminal -> New Terminal) et réalisez les étapes 6 et 7 de l’application 0 (clone et installation de packages).\nTous les scripts liés à notre modèle personnalisé sont stockés dans le dossier src. Consultez-les. Regardez également le fichier MLproject.\nExécutez un entraînement du modèle à l’aide de MLflow. Dans un terminal, exécutez la commande suivante :\nexport MLFLOW_EXPERIMENT_NAME=\"nace-prediction\"\nmlflow run ~/work/formation-mlops/ --env-manager=local \\\n -P remote_server_uri=$MLFLOW_TRACKING_URI \\\n -P experiment_name=$MLFLOW_EXPERIMENT_NAME\nDans l’interface de MLflow, examinez les résultats de votre exécution précédente :\n\nExperiments -> nace-prediction -> <nom_experience>\n\nVous avez entraîné le modèle avec certains paramètres par défaut. Dans le fichier MLproject, vérifiez les paramètres disponibles. Ré-entraînez un modèle avec différents paramètres (par exemple, dim = 25).\n\n\n\nCliquez pour voir la commande \n\nmlflow run ~/work/formation-mlops/ --env-manager=local \\\n -P remote_server_uri=$MLFLOW_TRACKING_URI \\\n -P experiment_name=$MLFLOW_EXPERIMENT_NAME \\\n -P dim=25\n\n\nDans MLflow, comparez les 2 modèles en traçant l’exactitude par rapport à un paramètre que vous avez modifié (par exemple dim)\n\nSélectionnez les 2 expériences -> Compare -> Scatter Plot -> Select your X and Y axis" + "text": "Application 2\n\n\n\n\nPartie 1 : Utilisation d’un modèle personnalisé\n\n\n\nTous les scripts liés à notre modèle personnalisé sont stockés dans le dossier src. Consultez-les. En particulier, le script train.py est responsable de l’entraînement du modèle. Quelles sont les principales différences avec l’application 1 ?\nPourquoi pouvons-nous dire que le modèle MLflow intègre le preprocessing ?" }, { "objectID": "slides/fr/index.html#application-2-1", "href": "slides/fr/index.html#application-2-1", "title": "Une introduction au MLOps avec MLflow", "section": "Application 2", - "text": "Application 2\n\n\n\n\nPartie 2 : Distribution et interrogation d’un modèle personnalisé\n\n\n\nExplorez attentivement le fichier src/train.py. Quelles sont les principales différences avec l’application 1 ?\nPourquoi pouvons-nous dire que le modèle MLflow intègre le preprocessing ?\nDans MLflow, enregistrez votre dernier modèle en tant que fasttext pour le rendre facilement interrogeable depuis l’API Python.\nCréez un script predict_mlflow.py dans le dossier src du projet. Ce script doit :\n\nCharger la version 1 du modèle fasttext\nUtiliser le modèle pour prédire les codes NACE d’une liste donnée de descriptions d’activité (par exemple, [\"vendeur d'huitres\", \"boulanger\"]).\n\n\n💡 N’oubliez pas de lire la documentation de la fonction predict() de la classe personnalisée (src/fasttext_wrapper.py) pour comprendre le format attendu des entrées !\n\n\nCliquez pour voir le contenu du script \n\n\n\npredict_mlflow.py\n\nimport mlflow\n\nmodel_name = \"fasttext\"\nversion = 1\n\nmodel = mlflow.pyfunc.load_model(\n model_uri=f\"models:/{model_name}/{version}\"\n)\n\nlist_libs = [\"vendeur d'huitres\", \"boulanger\"]\n\nresults = model.predict(list_libs, params={\"k\": 1})\nprint(results)\n\n\n\nExécutez votre script predict_mlflow.py.\n\n\n\nCliquez pour voir la commande \n\npython formation-mlops/src/predict_mlflow.py\n\n\nAssurez-vous que les deux descriptions suivantes donnent la même prédiction principale : \"COIFFEUR\" et \"coiffeur, & 98789\".\nModifiez la valeur du paramètre k et essayez de comprendre comment la structure de la sortie a changé en conséquence." + "text": "Application 2\n\n\n\n\nPartie 2 : Des notebooks à un projet de type package\n\n\n\nLe script train.py est également responsable du logging des expérimentations dans MLFlow. Notez la manière dont les paramètres de chaque expérimentation vont être passés à la fonction d’entraînement à l’appel du script.\nAfin de rendre la procédure d’entraînement d’un modèle plus reproductible, MLFlow met à disposition la commande mlflow run. Le fichier MLproject spécifie la commande et les paramètres qui vont lui être passées. Inspectez ce fichier.\nExécutez un entraînement du modèle à l’aide de MLFlow. Pour ce faire, ouvrez un terminal ( -> Terminal -> New Terminal) et exécutez la commande suivante :\nexport MLFLOW_EXPERIMENT_NAME=\"nace-prediction\"\nmlflow run ~/work/formation-mlops/ --env-manager=local \\\n -P remote_server_uri=$MLFLOW_TRACKING_URI \\\n -P experiment_name=$MLFLOW_EXPERIMENT_NAME\nDans l’interface de MLflow, examinez les résultats de votre exécution précédente :\n\nExperiments -> nace-prediction -> <nom_run>\n\nVous avez entraîné le modèle avec certains paramètres par défaut. Dans le fichier MLproject, vérifiez les paramètres disponibles. Ré-entraînez un modèle avec différents paramètres (par exemple, dim = 25).\n\n\n\nCliquez pour voir la commande \n\nmlflow run ~/work/formation-mlops/ --env-manager=local \\\n -P remote_server_uri=$MLFLOW_TRACKING_URI \\\n -P experiment_name=$MLFLOW_EXPERIMENT_NAME \\\n -P dim=25\n\n\nDans MLflow, comparez les 2 modèles en traçant la métrique accuracy par rapport à un paramètre que vous avez modifié (par exemple dim)\n\nSélectionnez les 2 expériences -> Compare -> Scatter Plot -> Select your X and Y axis\n\nEnregistrez le modèle avec la meilleure accuracy en tant que fasttext pour le rendre facilement interrogeable depuis Python." + }, + { + "objectID": "slides/fr/index.html#application-2-2", + "href": "slides/fr/index.html#application-2-2", + "title": "Une introduction au MLOps avec MLflow", + "section": "Application 2", + "text": "Application 2\n\n\n\n\nPartie 3 : Requêtage du modèle entraîné en local\n\n\n\nCréez un script predict_mlflow.py dans le dossier src du projet. Ce script doit :\n\nCharger la version 1 du modèle fasttext\nUtiliser le modèle pour prédire les codes NACE d’une liste donnée de descriptions d’activité (par exemple, [\"vendeur d'huitres\", \"boulanger\"]).\n\n\n💡 N’oubliez pas de lire la documentation de la fonction predict() de la classe personnalisée (src/fasttext_wrapper.py) pour comprendre le format attendu des entrées !\n\n\nCliquez pour voir le contenu du script \n\n\n\npredict_mlflow.py\n\nimport mlflow\n\nmodel_name = \"fasttext\"\nversion = 1\n\nmodel = mlflow.pyfunc.load_model(\n model_uri=f\"models:/{model_name}/{version}\"\n)\n\nlist_libs = [\"vendeur d'huitres\", \"boulanger\"]\n\nresults = model.predict(list_libs, params={\"k\": 1})\nprint(results)\n\n\n\nExécutez votre script predict_mlflow.py.\n\n\n\nCliquez pour voir la commande \n\npython formation-mlops/src/predict_mlflow.py\n\n\nAssurez-vous que les deux descriptions suivantes donnent la même prédiction principale : \"COIFFEUR\" et \"coiffeur, & 98789\".\nModifiez la valeur du paramètre k et essayez de comprendre comment la structure de la sortie a changé en conséquence." + }, + { + "objectID": "slides/fr/index.html#bilan-1", + "href": "slides/fr/index.html#bilan-1", + "title": "Une introduction au MLOps avec MLflow", + "section": "Bilan", + "text": "Bilan\n\nMLflow est polyvalent\n\nUtilisation dee frameworks custom (modulo une classe “interface”)\nIndustrialisation de l’entraînement (fichier MLproject)\nRequêtage simple des modèles entraînés et stockés\n\nLimite : le modèle entraîné n’est pas accessible\n\nRequêtage simplifié… mais format non-pertinent pour tous les utilisateurs\nLe modèle n’est pas déployé" }, { "objectID": "slides/fr/index.html#mise-en-service-du-modèle", "href": "slides/fr/index.html#mise-en-service-du-modèle", "title": "Une introduction au MLOps avec MLflow", "section": "Mise en service du modèle", - "text": "Mise en service du modèle\n\nUne fois qu’un modèle de machine learning a été développé, il doit être déployé pour servir ses utilisateurs finaux.\n\nQuelle est l’infrastructure de production ?\nQui sont les utilisateurs finaux ?\nTraitement par lots (batch) par rapport au traitement en ligne (online)" + "text": "Mise en service du modèle\n\nUne fois qu’un modèle de machine learning a été développé, il doit servir ses utilisateurs finaux.\n\nQuel format pertinent pour rendre accessible aux utilisateurs finaux ?\nTraitement par lots (batch) par rapport au traitement en ligne (online)\nQuelle infrastructure pour le de déploiement ?" }, { - "objectID": "slides/fr/index.html#configuration-standard", - "href": "slides/fr/index.html#configuration-standard", + "objectID": "slides/fr/index.html#configuration-envisagée", + "href": "slides/fr/index.html#configuration-envisagée", "title": "Une introduction au MLOps avec MLflow", - "section": "Configuration standard", - "text": "Configuration standard\n\nInfrastructure de production : cluster Kubernetes\nLe modèle peut servir diverses applications\n\nRendre le modèle accessible via une API\n\nTraitement en ligne (online serving)\n\nLes applications client envoient une requête à l’API et reçoivent une réponse rapide" + "section": "Configuration envisagée", + "text": "Configuration envisagée\n\nLe modèle peut servir diverses applications\n\nRendre le modèle accessible via une API\n\nTraitement en ligne (online serving)\n\nLes applications client envoient une requête à l’API et reçoivent une réponse rapide\n\nInfrastructure de déploiement : cluster Kubernetes" }, { "objectID": "slides/fr/index.html#exposer-un-modèle-via-une-api", @@ -175,25 +196,32 @@ "text": "Exposer un modèle via une API" }, { - "objectID": "slides/fr/index.html#exécuter-une-api-dans-un-conteneur", - "href": "slides/fr/index.html#exécuter-une-api-dans-un-conteneur", + "objectID": "slides/fr/index.html#pourquoi-exposer-un-modèle-via-une-api-rest", + "href": "slides/fr/index.html#pourquoi-exposer-un-modèle-via-une-api-rest", "title": "Une introduction au MLOps avec MLflow", - "section": "Exécuter une API dans un conteneur", - "text": "Exécuter une API dans un conteneur\n\nConteneur : environnement autonome et isolé qui encapsule le modèle, ses dépendances et le code de l’API\nLes conteneurs offrent une grande portabilité et scalabilité pour distribuer le modèle de manière efficace.\nLe fichier Dockerfile est utilisé pour configurer et construire le conteneur Docker." + "section": "Pourquoi exposer un modèle via une API REST ?", + "text": "Pourquoi exposer un modèle via une API REST ?\n\nSimplicité : porte d’entrée unique qui cache la complexité sous-jacente du modèle\nStandardisation : requêtes HTTP, agnostiques au langage de programmation utilisé\nPassage à l’échelle : adaptation à la charge de requêtes concurrentes\nModularité : séparation de la gestion du modèle et de sa mise à disposition" + }, + { + "objectID": "slides/fr/index.html#exposer-un-modèle-via-une-api-1", + "href": "slides/fr/index.html#exposer-un-modèle-via-une-api-1", + "title": "Une introduction au MLOps avec MLflow", + "section": "Exposer un modèle via une API", + "text": "Exposer un modèle via une API" }, { - "objectID": "slides/fr/index.html#développement-avec-larchitecture-docker", - "href": "slides/fr/index.html#développement-avec-larchitecture-docker", + "objectID": "slides/fr/index.html#exécuter-une-api-dans-un-conteneur", + "href": "slides/fr/index.html#exécuter-une-api-dans-un-conteneur", "title": "Une introduction au MLOps avec MLflow", - "section": "Développement avec l’architecture Docker", - "text": "Développement avec l’architecture Docker\n\n\n\n\n\n\n\nSource: R. Krispin" + "section": "Exécuter une API dans un conteneur", + "text": "Exécuter une API dans un conteneur\n\nConteneur : environnement autonome et isolé qui encapsule le modèle, ses dépendances et le code de l’API\nAvantages : portabilité et scalabilité pour distribuer le modèle de manière efficace" }, { "objectID": "slides/fr/index.html#déploiement-dune-api-sur-kubernetes", "href": "slides/fr/index.html#déploiement-dune-api-sur-kubernetes", "title": "Une introduction au MLOps avec MLflow", "section": "Déploiement d’une API sur Kubernetes", - "text": "Déploiement d’une API sur Kubernetes\n\n\n3 fichiers principaux sont nécessaires pour déployer une API :\n\ndeployment.yaml : définit le fonctionnement de l’API (image du conteneur, ressources et variables d’environnement)\nservice.yaml : établit un point de terminaison réseau interne stable pour l’API.\ningress.yaml : fournit un point d’entrée pour les clients externes afin d’accéder à l’API." + "text": "Déploiement d’une API sur Kubernetes" }, { "objectID": "slides/fr/index.html#application-3", @@ -203,11 +231,11 @@ "text": "Application 3\n\nDéploiement manuelDéploiement continu\n\n\n\n\n\nDéploiement manuel d’un modèle ML en tant qu’API\n\n\n\n\nNous avons construit une API REST très simpliste à l’aide de FastAPI. Tous les fichiers sous-jacents se trouvent dans le dossier app. Consultez-les.\nOuvrez le Dockerfile pour voir comment l’image est construite. L’image est automatiquement reconstruite et publiée via Github Actions, si vous êtes intéressé, jetez un coup d’œil à .github/workflows/build_image.yml. Dans le cadre de cette formation, nous allons tous utiliser cette même image.\nOuvrez le fichier kubernetes/deployment.yml et modifiez les lignes surlignées comme suit :\n\n\n\ndeployment.yml\n\ncontainers:\n- name: api\n image: inseefrlab/formation-mlops-api:main\n imagePullPolicy: Always\n env:\n - name: MLFLOW_TRACKING_URI\n value: https://user-<namespace>-<pod_id>.user.lab.sspcloud.fr\n - name: MLFLOW_MODEL_NAME\n value: fasttext\n - name: MLFLOW_MODEL_VERSION\n value: \"1\"\n\n\nOuvrez le fichier kubernetes/ingress.yml et modifiez (deux fois) l’URL du point de terminaison de l’API pour qu’elle soit de la forme <votre_prénom>-<votre_nom>-api.lab.sspcloud.fr.\nAppliquez les trois contrats Kubernetes contenus dans le dossier kubernetes/ dans un terminal pour déployer l’API\n\nkubectl apply -f formation-mlops/kubernetes/\n\nAccédez à votre API en utilisant l’URL définie dans votre fichier ingress.yml.\nAffichez la documentation de votre API en ajoutant /docs à votre URL.\nTestez votre API !\nRéentrainez un nouveau modèle et déployez ce nouveau modèle dans votre API\n\n\n\nCliquez pour voir les étapes \n\n\nEntrainez un modèle.\nEnregistrez le modèle dans MLflow.\nAjustez votre variable d’environnement MLFLOW_MODEL_NAME ou MLFLOW_MODEL_VERSION (si vous n’avez pas modifié le nom du modèle) dans le fichier deployment.yml.\nAppliquez les nouveaux contrats Kubernetes pour mettre à jour l’API\n\nkubectl apply -f formation-mlops/kubernetes/\n\nRafraîchissez votre API et vérifiez sur la page d’accueil qu’elle est désormais basée sur la nouvelle version du modèle.\n\n\n\n\n\n\n\n\n\n\n\nDéploiement continu d’un modèle ML en tant qu’API\n\n\n\n⚠️ Les précédentes applications doivent avoir été réalisées avec l’option Git pour pouvoir suivre celle-ci.\nPrécedement, vous avez déployé votre modèle manuellement. Grâce à ArgoCD il est possible de déployer un modèle de manière continu, ainsi chaque modification d’un fichier présent dans le dossier kubernetes/ va entrainer le redéploiement automatique en se synchronisation avec votre dépôt Github. Pour vous en convaincre, suivez les étapes ci dessous :\n\nLancez un service ArgoCD en cliquant sur cette URL. Ouvrez le service, saisissez l’identifiant (admin) et le mot de passe du service.\nReprenez les 4 premières étapes du déploiement manuel.\nFaite un commit des changements effectués et pousser vers votre dépôt Github.\nOuvrez le template argocd/template-argocd.yml et modifiez les lignes surlignées :\n\n\n\ntemplate-argocd.yml\n\nspec:\n project: default\n source:\n repoURL: https://github.com/<your-github-id>/formation-mlops.git\n targetRevision: HEAD\n path: kubernetes\n destination:\n server: https://kubernetes.default.svc\n namespace: <your-namespace>\n\n\nDans ArgoCD, cliquez sur New App puis Edit as a YAML. Copiez-collez le contenu de argocd/template-argocd.yml et cliquez sur Create.\nAccédez à votre API en utilisant l’URL définie dans votre fichier ingress.yml.\nAffichez la documentation de votre API en ajoutant /docs à votre URL.\nTestez votre API !\nRéentrainez un nouveau modèle et déployez automatiquement ce nouveau modèle dans votre API\n\n\n\nCliquez pour voir les étapes \n\n\nEntrainez un modèle.\nEnregistrez le modèle dans MLflow.\nAjustez votre variable d’environnement MLFLOW_MODEL_NAME ou MLFLOW_MODEL_VERSION (si vous n’avez pas modifié le nom du modèle) dans le fichier deployment.yml.\nFaite un commit de ces changements et poussez les sur votre dépôt Github.\nPatientez 5 minutes qu’ArgoCD synchronise automatiquement les changements depuis votre dépôt Github ou bien forcez la synchronisation. Rafraîchissez votre API et vérifiez sur la page d’accueil qu’elle est désormais basée sur la nouvelle version du modèle." }, { - "objectID": "slides/fr/index.html#entraînement-parallèle", - "href": "slides/fr/index.html#entraînement-parallèle", + "objectID": "slides/fr/index.html#entraînement-distribué", + "href": "slides/fr/index.html#entraînement-distribué", "title": "Une introduction au MLOps avec MLflow", - "section": "Entraînement parallèle", - "text": "Entraînement parallèle\n\nAvec notre configuration, nous pouvons entraîner des modèles un par un et enregistrer toutes les informations pertinentes sur le serveur MLflow Tracking.\nEt si nous voulions entraîner plusieurs modèles en même temps, par exemple pour optimiser les hyperparamètres ?" + "section": "Entraînement distribué", + "text": "Entraînement distribué\n\nAvec notre configuration, nous pouvons entraîner des modèles un par un et enregistrer toutes les informations pertinentes sur le serveur MLflow Tracking.\nEt si nous voulions entraîner plusieurs modèles en même temps, par exemple pour optimiser les hyperparamètres ?" }, { "objectID": "slides/fr/index.html#automatisation-du-workflow", diff --git a/sitemap.xml b/sitemap.xml index cd101d0..264d96f 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,10 +2,10 @@ https://github.com/InseeFrLab/formation-mlops/slides/fr/index.html - 2023-11-23T09:34:22.042Z + 2023-12-14T14:31:50.281Z https://github.com/InseeFrLab/formation-mlops/slides/en/index.html - 2023-11-23T09:32:22.478Z + 2023-12-14T14:31:41.345Z diff --git a/slides/fr/index.html b/slides/fr/index.html index b94988f..0352572 100644 --- a/slides/fr/index.html +++ b/slides/fr/index.html @@ -560,8 +560,8 @@

Application 0

  1. Créez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.
  2. Lancez un service MLflow en cliquant sur cette URL.
  3. -
  4. Lancez un service Jupyter-python en cliquant sur cette URL.
  5. -
  6. Ouvrez le service Jupyter-python et saisissez le mot de passe du service.
  7. +
  8. Lancez un service VSCode-python en cliquant sur cette URL.
  9. +
  10. Ouvrez le service VSCode-python et saisissez le mot de passe du service.
  11. Vous êtes prêt !
@@ -578,12 +578,12 @@

Application 0

    -
  1. On suppose que vous possédez un compte Github et que vous avez déjà créé un token. Forkez le repo de la formation en cliquant ici.

  2. -
  3. Créez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.

  4. +
  5. Si ce n’est pas déjà fait, créez un compte Github. Créez une copie du dépôt de la formation dans votre espace personnel en forkant le dépôt.

  6. +
  7. Si ce n’est pas déjà fait, créez un compte sur le SSP Cloud en utilisant votre adresse e-mail professionnelle.

  8. Lancez un service MLflow en cliquant sur cette URL.

  9. -
  10. Lancez un service Jupyter-python en cliquant sur cette URL.

  11. -
  12. Ouvrez le service Jupyter-python et saisissez le mot de passe du service.

  13. -
  14. Dans Jupyter, ouvrez un terminal et clonez votre dépôt que vous venez de fork (modifiez les deux premières lignes) :

    +
  15. Lancez un service VSCode-python en cliquant sur cette URL.

  16. +
  17. Ouvrez le service VSCode-python et saisissez le mot de passe du service.

  18. +
  19. Dans VSCode, ouvrez un terminal et clonez le dépôt que vous venez de fork (modifiez les deux premières lignes) :

    GIT_REPO=formation-mlops
     GIT_USERNAME=InseeFrLab
     
    @@ -669,13 +669,29 @@ 

    Application 1

      -
    1. Dans JupyterLab, ouvrez le notebook situé à l’emplacement formation-mlops/notebooks/mlflow-introduction.ipynb.
    2. -
    3. Exécutez le notebook cellule par cellule. Si vous avez terminé plus tôt, explorez l’interface utilisateur de MLflow et essayez de créer vos propres expériences à partir du code d’exemple fourni dans le notebook.
    4. +
    5. Dans VSCode, ouvrez le notebook situé à l’emplacement formation-mlops/notebooks/mlflow-introduction.ipynb.
    6. +
    7. Exécutez le notebook cellule par cellule.
    8. +
    9. Si vous avez terminé plus tôt, explorez l’interface utilisateur de MLflow et essayez de créer vos propres expérimentations à partir du code d’exemple fourni dans le notebook. Par exemple, essayez d’ajouter d’autres hyperparamètres à la procédure de grid-search.
+ +
+

Bilan

+
    +
  • MLflow simplifie le suivi de l’entraînement de modèles +
      +
    • Garde trace des expérimentations et de leurs outputs
    • +
    • Intégration simple avec les principaux frameworks de ML
    • +
  • +
  • Limites +
      +
    • Comment utiliser des frameworks custom (non-nativement intégrés) ?
    • +
    • Comment passer de l’expérimentation à la mise en production ?
    • +
  • +
@@ -721,17 +737,17 @@

Données utilisées

  • Passage en minuscules
  • Suppression de la ponctuation
  • Suppression des nombres
  • -
  • Suppression des mots vide de sens
  • -
  • Racinisation (stemming)
  • +
  • Suppression des stop words
  • +
  • Racinisation (stemming)
  • - +
    @@ -741,9 +757,9 @@

    Données utilisées

    - +
    @@ -803,7 +819,6 @@

    MLflow avec framework non standard

    return self.my_model.predict(model_input)
    -

    De l’expérimentation à la production

    @@ -825,71 +840,42 @@

    De l’expérimentation à la production

    Application 2

    -
    - -
    -
    +
    -

    Partie 1 : Des notebooks à un projet de type package

    +

    Partie 1 : Utilisation d’un modèle personnalisé

    -
      -
    1. Lancez un service VSCode en cliquant sur cette URL. Ouvrez le service et saisissez le mot de passe du service.

    2. -
    3. Tous les scripts liés à notre modèle personnalisé sont stockés dans le dossier src. Consultez-les. Regardez également le fichier MLproject.

    4. -
    5. Exécutez un entraînement du modèle à l’aide de MLflow. Pour ce faire, ouvrez un terminal ( -> Terminal -> New Terminal) et exécutez la commande suivante :

      -
      export MLFLOW_EXPERIMENT_NAME="nace-prediction"
      -mlflow run ~/work/formation-mlops/ --env-manager=local \
      -    -P remote_server_uri=$MLFLOW_TRACKING_URI \
      -    -P experiment_name=$MLFLOW_EXPERIMENT_NAME
    6. -
    7. Dans l’interface de MLflow, examinez les résultats de votre exécution précédente :

      -
        -
      • Experiments -> nace-prediction -> <nom_run>
      • -
    8. -
    9. Vous avez entraîné le modèle avec certains paramètres par défaut. Dans le fichier MLproject, vérifiez les paramètres disponibles. Ré-entraînez un modèle avec différents paramètres (par exemple, dim = 25).

    10. -
    -
    - -Cliquez pour voir la commande - -
    mlflow run ~/work/formation-mlops/ --env-manager=local \
    -    -P remote_server_uri=$MLFLOW_TRACKING_URI \
    -    -P experiment_name=$MLFLOW_EXPERIMENT_NAME \
    -    -P dim=25
    -
    -
      -
    1. Dans MLflow, comparez les 2 modèles en traçant l’exactitude par rapport à un paramètre que vous avez modifié (par exemple dim) -
        -
      • Sélectionnez les 2 expériences -> Compare -> Scatter Plot -> Select your X and Y axis
      • -
    2. +
    3. Tous les scripts liés à notre modèle personnalisé sont stockés dans le dossier src. Consultez-les. En particulier, le script train.py est responsable de l’entraînement du modèle. Quelles sont les principales différences avec l’application 1 ?
    4. +
    5. Pourquoi pouvons-nous dire que le modèle MLflow intègre le preprocessing ?
    -
    -
    +
    +
    +

    Application 2

    +
    -

    Partie 1 : Des notebooks à un projet de type package

    +

    Partie 2 : Des notebooks à un projet de type package

    -
      -
    1. Lancez un service VSCode en cliquant sur cette URL. Ouvrez le service et saisissez le mot de passe du service.

    2. -
    3. Dans VSCode, ouvrez un terminal ( -> Terminal -> New Terminal) et réalisez les étapes 6 et 7 de l’application 0 (clone et installation de packages).

    4. -
    5. Tous les scripts liés à notre modèle personnalisé sont stockés dans le dossier src. Consultez-les. Regardez également le fichier MLproject.

    6. -
    7. Exécutez un entraînement du modèle à l’aide de MLflow. Dans un terminal, exécutez la commande suivante :

      -
      export MLFLOW_EXPERIMENT_NAME="nace-prediction"
      -mlflow run ~/work/formation-mlops/ --env-manager=local \
      -    -P remote_server_uri=$MLFLOW_TRACKING_URI \
      -    -P experiment_name=$MLFLOW_EXPERIMENT_NAME
    8. +
    9. Le script train.py est également responsable du logging des expérimentations dans MLFlow. Notez la manière dont les paramètres de chaque expérimentation vont être passés à la fonction d’entraînement à l’appel du script.

    10. +
    11. Afin de rendre la procédure d’entraînement d’un modèle plus reproductible, MLFlow met à disposition la commande mlflow run. Le fichier MLproject spécifie la commande et les paramètres qui vont lui être passées. Inspectez ce fichier.

    12. +
    13. Exécutez un entraînement du modèle à l’aide de MLFlow. Pour ce faire, ouvrez un terminal ( -> Terminal -> New Terminal) et exécutez la commande suivante :

      +
      export MLFLOW_EXPERIMENT_NAME="nace-prediction"
      +mlflow run ~/work/formation-mlops/ --env-manager=local \
      +    -P remote_server_uri=$MLFLOW_TRACKING_URI \
      +    -P experiment_name=$MLFLOW_EXPERIMENT_NAME
    14. Dans l’interface de MLflow, examinez les résultats de votre exécution précédente :

        -
      • Experiments -> nace-prediction -> <nom_experience>
      • +
      • Experiments -> nace-prediction -> <nom_run>
    15. Vous avez entraîné le modèle avec certains paramètres par défaut. Dans le fichier MLproject, vérifiez les paramètres disponibles. Ré-entraînez un modèle avec différents paramètres (par exemple, dim = 25).

    @@ -897,38 +883,33 @@

    Application 2

    Cliquez pour voir la commande -
    mlflow run ~/work/formation-mlops/ --env-manager=local \
    -    -P remote_server_uri=$MLFLOW_TRACKING_URI \
    -    -P experiment_name=$MLFLOW_EXPERIMENT_NAME \
    -    -P dim=25
    +
    mlflow run ~/work/formation-mlops/ --env-manager=local \
    +    -P remote_server_uri=$MLFLOW_TRACKING_URI \
    +    -P experiment_name=$MLFLOW_EXPERIMENT_NAME \
    +    -P dim=25
    -
      -
    1. Dans MLflow, comparez les 2 modèles en traçant l’exactitude par rapport à un paramètre que vous avez modifié (par exemple dim) +
        +
      1. Dans MLflow, comparez les 2 modèles en traçant la métrique accuracy par rapport à un paramètre que vous avez modifié (par exemple dim)
        • Sélectionnez les 2 expériences -> Compare -> Scatter Plot -> Select your X and Y axis
      2. +
      3. Enregistrez le modèle avec la meilleure accuracy en tant que fasttext pour le rendre facilement interrogeable depuis Python.
    -
    -
    -
    -
    +

    Application 2

    -

    Partie 2 : Distribution et interrogation d’un modèle personnalisé

    +

    Partie 3 : Requêtage du modèle entraîné en local

      -
    1. Explorez attentivement le fichier src/train.py. Quelles sont les principales différences avec l’application 1 ?
    2. -
    3. Pourquoi pouvons-nous dire que le modèle MLflow intègre le preprocessing ?
    4. -
    5. Dans MLflow, enregistrez votre dernier modèle en tant que fasttext pour le rendre facilement interrogeable depuis l’API Python.
    6. Créez un script predict_mlflow.py dans le dossier src du projet. Ce script doit :
      1. Charger la version 1 du modèle fasttext
      2. @@ -944,31 +925,31 @@

        Application 2

        predict_mlflow.py
        -
        import mlflow
        -
        -model_name = "fasttext"
        -version = 1
        -
        -model = mlflow.pyfunc.load_model(
        -    model_uri=f"models:/{model_name}/{version}"
        -)
        -
        -list_libs = ["vendeur d'huitres", "boulanger"]
        -
        -results = model.predict(list_libs, params={"k": 1})
        -print(results)
        +
        import mlflow
        +
        +model_name = "fasttext"
        +version = 1
        +
        +model = mlflow.pyfunc.load_model(
        +    model_uri=f"models:/{model_name}/{version}"
        +)
        +
        +list_libs = ["vendeur d'huitres", "boulanger"]
        +
        +results = model.predict(list_libs, params={"k": 1})
        +print(results)
    -
      +
      1. Exécutez votre script predict_mlflow.py.
      Cliquez pour voir la commande -
      python formation-mlops/src/predict_mlflow.py
      +
      python formation-mlops/src/predict_mlflow.py
      -
        +
        1. Assurez-vous que les deux descriptions suivantes donnent la même prédiction principale : "COIFFEUR" et "coiffeur, & 98789".
        2. Modifiez la valeur du paramètre k et essayez de comprendre comment la structure de la sortie a changé en conséquence.
        @@ -976,78 +957,87 @@

        Application 2

    +
    +
    +

    Bilan

    +
      +
    • MLflow est polyvalent +
        +
      • Utilisation dee frameworks custom (modulo une classe “interface”)
      • +
      • Industrialisation de l’entraînement (fichier MLproject)
      • +
      • Requêtage simple des modèles entraînés et stockés
      • +
    • +
    • Limite : le modèle entraîné n’est pas accessible +
        +
      • Requêtage simplifié… mais format non-pertinent pour tous les utilisateurs
      • +
      • Le modèle n’est pas déployé
      • +
    • +
    -
    -

    3️⃣ Déployer un modèle ML via une API

    +
    +

    3️⃣ Servir un modèle de ML à des utilisateurs

    Mise en service du modèle

      -
    • Une fois qu’un modèle de machine learning a été développé, il doit être déployé pour servir ses utilisateurs finaux. +
    • Une fois qu’un modèle de machine learning a été développé, il doit servir ses utilisateurs finaux.
        -
      • Quelle est l’infrastructure de production ?
      • -
      • Qui sont les utilisateurs finaux ?
      • +
      • Quel format pertinent pour rendre accessible aux utilisateurs finaux ?
      • Traitement par lots (batch) par rapport au traitement en ligne (online)
      • +
      • Quelle infrastructure pour le de déploiement ?
    -
    -

    Configuration standard

    +
    +

    Configuration envisagée

      -
    • Infrastructure de production : cluster Kubernetes

    • -
    • Le modèle peut servir diverses applications

      +
    • Le modèle peut servir diverses applications
      • Rendre le modèle accessible via une API
    • -
    • Traitement en ligne (online serving)

      +
    • Traitement en ligne (online serving)
      • Les applications client envoient une requête à l’API et reçoivent une réponse rapide
    • +
    • Infrastructure de déploiement : cluster Kubernetes

    Exposer un modèle via une API

    +
    +
    +

    Pourquoi exposer un modèle via une API REST ?

    +
      +
    • Simplicité : porte d’entrée unique qui cache la complexité sous-jacente du modèle

    • +
    • Standardisation : requêtes HTTP, agnostiques au langage de programmation utilisé

    • +
    • Passage à l’échelle : adaptation à la charge de requêtes concurrentes

    • +
    • Modularité : séparation de la gestion du modèle et de sa mise à disposition

    • +
    +
    +
    +

    Exposer un modèle via une API

    +

    Exécuter une API dans un conteneur

    • Conteneur : environnement autonome et isolé qui encapsule le modèle, ses dépendances et le code de l’API

    • -
    • Les conteneurs offrent une grande portabilité et scalabilité pour distribuer le modèle de manière efficace.

    • -
    • Le fichier Dockerfile est utilisé pour configurer et construire le conteneur Docker.

    • +
    • Avantages : portabilité et scalabilité pour distribuer le modèle de manière efficace

    -
    -

    Développement avec l’architecture Docker

    -
    -
    -

    -
    -
    - -

    Déploiement d’une API sur Kubernetes

    - -
      -
    • 3 fichiers principaux sont nécessaires pour déployer une API : -
        -
      • deployment.yaml : définit le fonctionnement de l’API (image du conteneur, ressources et variables d’environnement)
      • -
      • service.yaml : établit un point de terminaison réseau interne stable pour l’API.
      • -
      • ingress.yaml : fournit un point d’entrée pour les clients externes afin d’accéder à l’API.
      • -
    • -
    -
    + +

    Application 3

    - +
    -
    +
    @@ -1064,23 +1054,23 @@

    Application 3

    deployment.yml
    -
    containers:
    -- name: api
    -    image: inseefrlab/formation-mlops-api:main
    -    imagePullPolicy: Always
    -    env:
    -    - name: MLFLOW_TRACKING_URI
    -        value: https://user-<namespace>-<pod_id>.user.lab.sspcloud.fr
    -    - name: MLFLOW_MODEL_NAME
    -        value: fasttext
    -    - name: MLFLOW_MODEL_VERSION
    -        value: "1"
    +
    containers:
    +- name: api
    +    image: inseefrlab/formation-mlops-api:main
    +    imagePullPolicy: Always
    +    env:
    +    - name: MLFLOW_TRACKING_URI
    +        value: https://user-<namespace>-<pod_id>.user.lab.sspcloud.fr
    +    - name: MLFLOW_MODEL_NAME
    +        value: fasttext
    +    - name: MLFLOW_MODEL_VERSION
    +        value: "1"
    1. Ouvrez le fichier kubernetes/ingress.yml et modifiez (deux fois) l’URL du point de terminaison de l’API pour qu’elle soit de la forme <votre_prénom>-<votre_nom>-api.lab.sspcloud.fr.
    2. Appliquez les trois contrats Kubernetes contenus dans le dossier kubernetes/ dans un terminal pour déployer l’API
    -
    kubectl apply -f formation-mlops/kubernetes/
    +
    kubectl apply -f formation-mlops/kubernetes/
    1. Accédez à votre API en utilisant l’URL définie dans votre fichier ingress.yml.
    2. Affichez la documentation de votre API en ajoutant /docs à votre URL.
    3. @@ -1097,7 +1087,7 @@

      Application 3

    4. Ajustez votre variable d’environnement MLFLOW_MODEL_NAME ou MLFLOW_MODEL_VERSION (si vous n’avez pas modifié le nom du modèle) dans le fichier deployment.yml.
    5. Appliquez les nouveaux contrats Kubernetes pour mettre à jour l’API
    -
    kubectl apply -f formation-mlops/kubernetes/
    +
    kubectl apply -f formation-mlops/kubernetes/
    1. Rafraîchissez votre API et vérifiez sur la page d’accueil qu’elle est désormais basée sur la nouvelle version du modèle.
    @@ -1107,7 +1097,7 @@

    Application 3

    -
    +
    @@ -1127,15 +1117,15 @@

    Application 3

    template-argocd.yml
    -
    spec:
    -  project: default
    -  source:
    -    repoURL: https://github.com/<your-github-id>/formation-mlops.git
    -    targetRevision: HEAD
    -    path: kubernetes
    -  destination:
    -    server: https://kubernetes.default.svc
    -    namespace: <your-namespace>
    +
    spec:
    +  project: default
    +  source:
    +    repoURL: https://github.com/<your-github-id>/formation-mlops.git
    +    targetRevision: HEAD
    +    path: kubernetes
    +  destination:
    +    server: https://kubernetes.default.svc
    +    namespace: <your-namespace>
    1. Dans ArgoCD, cliquez sur New App puis Edit as a YAML. Copiez-collez le contenu de argocd/template-argocd.yml et cliquez sur Create.
    2. @@ -1165,12 +1155,12 @@

      Application 3

    -
    -

    4️⃣ Décentraliser l’optimisation des hyperparamètres

    +
    +

    4️⃣ Distribuer l’optimisation des hyperparamètres

    -
    -

    Entraînement parallèle

    +
    +

    Entraînement distribué

    • Avec notre configuration, nous pouvons entraîner des modèles un par un et enregistrer toutes les informations pertinentes sur le serveur MLflow Tracking.
    • Et si nous voulions entraîner plusieurs modèles en même temps, par exemple pour optimiser les hyperparamètres ?
    • @@ -1207,18 +1197,18 @@

      Argo workflows

    Bonjour le monde

    -
    apiVersion: argoproj.io/v1alpha1
    -kind: Workflow                  # nouveau type de spécification k8s
    -metadata:
    -  generateName: hello-world-    # nom de la spécification du workflow
    -spec:
    -  entrypoint: whalesay          # invoque le modèle whalesay
    -  templates:
    -    - name: whalesay            # nom du modèle
    -      container:
    -        image: docker/whalesay
    -        command: [ cowsay ]
    -        args: [ "bonjour le monde" ]
    +
    apiVersion: argoproj.io/v1alpha1
    +kind: Workflow                  # nouveau type de spécification k8s
    +metadata:
    +  generateName: hello-world-    # nom de la spécification du workflow
    +spec:
    +  entrypoint: whalesay          # invoque le modèle whalesay
    +  templates:
    +    - name: whalesay            # nom du modèle
    +      container:
    +        image: docker/whalesay
    +        command: [ cowsay ]
    +        args: [ "bonjour le monde" ]

    Que se passe-t-il ?

    @@ -1252,26 +1242,26 @@

    Paramètres

  • Les modèles peuvent prendre des paramètres d’entrée
  • -
    apiVersion: argoproj.io/v1alpha1
    -kind: Workflow
    -metadata:
    -  generateName: hello-world-parameters-
    -spec:
    -  entrypoint: whalesay
    -  arguments:
    -    parameters:
    -    - name: message
    -      value: bonjour le monde
    -
    -  templates:
    -  - name: whalesay
    -    inputs:
    -      parameters:
    -      - name: message       # déclaration du paramètre
    -    container:
    -      image: docker/whalesay
    -      command: [cowsay]
    -      args: ["{{inputs.parameters.message}}"]
    +
    apiVersion: argoproj.io/v1alpha1
    +kind: Workflow
    +metadata:
    +  generateName: hello-world-parameters-
    +spec:
    +  entrypoint: whalesay
    +  arguments:
    +    parameters:
    +    - name: message
    +      value: bonjour le monde
    +
    +  templates:
    +  - name: whalesay
    +    inputs:
    +      parameters:
    +      - name: message       # déclaration du paramètre
    +    container:
    +      image: docker/whalesay
    +      command: [cowsay]
    +      args: ["{{inputs.parameters.message}}"]
    @@ -1280,30 +1270,30 @@

    Workflows à plusieurs étapes

  • Les workflows à plusieurs étapes peuvent être spécifiés (steps ou dag)
  • -
    apiVersion: argoproj.io/v1alpha1
    -kind: Workflow
    -metadata:
    -  generateName: steps-
    -spec:
    -  entrypoint: hello-hello-hello
    -
    -  # Cette spécification contient deux modèles : hello-hello-hello et whalesay
    -  templates:
    -  - name: hello-hello-hello
    -    # Au lieu d'exécuter uniquement un conteneur
    -    # Ce modèle a une séquence d'étapes
    -    steps:
    -    - - name: hello1            # hello1 est exécuté avant les étapes suivantes
    -        template: whalesay
    -    - - name: hello2a           # double tiret => exécuté après l'étape précédente
    -        template: whalesay
    -      - name: hello2b           # tiret simple => exécuté en parallèle avec l'étape précédente
    -        template: whalesay
    -  - name: whalesay              # nom du modèle
    -    container:
    -      image: docker/whalesay
    -      command: [ cowsay ]
    -      args: [ "bonjour le monde" ]
    +
    apiVersion: argoproj.io/v1alpha1
    +kind: Workflow
    +metadata:
    +  generateName: steps-
    +spec:
    +  entrypoint: hello-hello-hello
    +
    +  # Cette spécification contient deux modèles : hello-hello-hello et whalesay
    +  templates:
    +  - name: hello-hello-hello
    +    # Au lieu d'exécuter uniquement un conteneur
    +    # Ce modèle a une séquence d'étapes
    +    steps:
    +    - - name: hello1            # hello1 est exécuté avant les étapes suivantes
    +        template: whalesay
    +    - - name: hello2a           # double tiret => exécuté après l'étape précédente
    +        template: whalesay
    +      - name: hello2b           # tiret simple => exécuté en parallèle avec l'étape précédente
    +        template: whalesay
    +  - name: whalesay              # nom du modèle
    +    container:
    +      image: docker/whalesay
    +      command: [ cowsay ]
    +      args: [ "bonjour le monde" ]
    @@ -1393,29 +1383,29 @@

    Application 4

    hello_world.yml
    -
    apiVersion: argoproj.io/v1alpha1
    -kind: Workflow
    -metadata:
    -  generateName: hello-world-
    -  labels:
    -    workflows.argoproj.io/archive-strategy: "false"
    -  annotations:
    -    workflows.argoproj.io/description: |
    -      Ceci est un exemple simple de "Hello World".
    -      Vous pouvez également l'exécuter en Python : https://couler-proj.github.io/couler/examples/#hello-world
    -spec:
    -  entrypoint: whalesay
    -  templates:
    -  - name: whalesay
    -    container:
    -      image: docker/whalesay:latest
    -      command: [cowsay]
    -      args: ["hello world"]
    +
    apiVersion: argoproj.io/v1alpha1
    +kind: Workflow
    +metadata:
    +  generateName: hello-world-
    +  labels:
    +    workflows.argoproj.io/archive-strategy: "false"
    +  annotations:
    +    workflows.argoproj.io/description: |
    +      Ceci est un exemple simple de "Hello World".
    +      Vous pouvez également l'exécuter en Python : https://couler-proj.github.io/couler/examples/#hello-world
    +spec:
    +  entrypoint: whalesay
    +  templates:
    +  - name: whalesay
    +    container:
    +      image: docker/whalesay:latest
    +      command: [cowsay]
    +      args: ["hello world"]
    1. Soumettez le workflow “Hello World” via un terminal dans VSCode :
    -
    argo submit formation-mlops/hello_world.yaml
    +
    argo submit formation-mlops/hello_world.yaml
    1. Ouvrez l’interface utilisateur d’Argo Workflows. Trouvez les logs du workflow que vous venez de lancer. Vous devriez voir le logo Docker .
    @@ -1441,12 +1431,12 @@

    Application 4

    workflow.yml
    -
    parameters:
    -    # Le serveur de suivi MLflow est responsable de l'enregistrement des hyper-paramètres et des métriques du modèle.
    -    - name: mlflow-tracking-uri
    -    value: https://user-<namespace>-<pod_id>.user.lab.sspcloud.fr
    -    - name: mlflow-experiment-name
    -    value: nace-prediction
    +
    parameters:
    +    # Le serveur de suivi MLflow est responsable de l'enregistrement des hyper-paramètres et des métriques du modèle.
    +    - name: mlflow-tracking-uri
    +    value: https://user-<namespace>-<pod_id>.user.lab.sspcloud.fr
    +    - name: mlflow-experiment-name
    +    value: nace-prediction
    1. Soumettez le flux de travail et observez les tâches s’exécuter en direct dans l’interface utilisateur.
    2. @@ -1455,7 +1445,7 @@

      Application 4

      Cliquez pour voir la commande -
      argo submit formation-mlops/argo_workflows/workflow.yml
      +
      argo submit formation-mlops/argo_workflows/workflow.yml
      1. Une fois que toutes les tâches sont terminées, visualisez les logs de l’ensemble du flux de travail.
      2. @@ -1485,7 +1475,7 @@

        Application 5

        -
        https://minio.lab.sspcloud.fr/projet-formation/diffusion/mlops/data/data_to_classify.parquet
        +
        https://minio.lab.sspcloud.fr/projet-formation/diffusion/mlops/data/data_to_classify.parquet