[PYTHON] Créez un environnement d'analyse de données avec Kedro + MLflow + Github Actions
introduction
- J'ai construit un environnement d'analyse de données avec Kedro + MLflow + Github Actions, alors j'ai écrit mes impressions.
Contexte
** = "Problèmes lors de la création d'un bloc-notes qui est tout dans un fichier dans un environnement local pour chaque expérience (lightgbm_02_YYYYMMDD.ipynb, etc.)" **
- Vous vous retrouvez avec un cahier énorme et complexe
- Prétraitement, apprentissage de modèles, évaluation de modèles ...
- Difficile de diviser la personne responsable (même si dans de nombreux cas vous ferez tout tout seul)
- L'entretien est épicé
- → Si vous divisez par traitement, vous ne comprendrez pas bien la dépendance cette fois
- La révision du code est douloureuse
- Les cahiers sont difficiles à différencier
- S'il s'agit d'un cahier, vous ne pouvez pas appliquer de formateur de code ou de vérificateur
- La gestion des expériences est difficile
- Je veux les lister (il est difficile d'ouvrir et de se souvenir de chaque carnet)
- → Il est difficile de maintenir la liste manuellement (plus il y a d'essais)
- Cela ne fonctionne pas ou le résultat change dans l'environnement d'une autre personne (lors de la recréation à partir d'un environnement propre)
- Si vous reprenez l'affaire d'une personne et clonez le maître, cela ne fonctionnera pas
- Les résultats dépendent des données locales non validées
Ce que j'ai fait
Introduction de Kedro en tant qu'outil de pipeline
### Qu'est-ce que Kedro? ・ Méthode d'introduction
* (Référence) [Introduction au pipeline d'apprentissage automatique avec Kedro](https://qiita.com/noko_qii/items/2395d3a3dbcd9410e5e7)
Bonne chose
- En définissant d'abord le nœud (, data In / Out) / pipeline, il était facile de diviser le responsable + facile à maintenir.
- C'était bien de pouvoir d'abord faire correspondre la reconnaissance In / Out pour chaque processus.
- Les règles de dénomination ont d'abord été décidées et connues
- Facile à travailler avec un ordinateur portable
$ kedro jupyter notebook --allow-root --port=8888 --ip=0.0.0.0 &
from kedro.framework.context import load_context
proj_path = '../../../'
context = load_context(proj_path)
# df = catalog.load("XXX")
parameters = context.params
- J'ai pu visualiser le pipeline en utilisant kedor-viz
- J'ai pu gérer les informations d'identification avec credential.yaml
Les défis restants
- Je m'inquiète de savoir quand pipeline (script)
- Les data scientists ont fait de plus en plus d'essais et d'erreurs dans les notebooks → Les data ingénieurs faisaient des pipelines de temps en temps, mais le nombre de corrections était important et c'était un fardeau.
- Je veux ré-exécuter le pipeline à partir du milieu (cela semble possible, mais cela n'a pas été étudié)
- kedro-viz n'est pas mis à jour automatiquement (il se charge au redémarrage)
- Je veux couper la librairie quelque part (en supposant que la lecture soit du côté du notebook ainsi que du côté src)
- Je souhaite exécuter des travaux en parallèle
- Dans la recherche de paramètres, vous pouvez créer un lien avec optuna
Introduction de MLflow en tant qu'outil de gestion d'expériences
### Qu'est-ce que MLflow? ・ Méthode d'introduction
* (Référence) [Introduction à la gestion des expériences avec MLflow](https://future-architect.github.io/articles/20200626/)
Bonne chose
- Voir le lien ci-dessus
- Même si je l'écrivais de manière à ce qu'il soit ignoré dans MLflow, le cahier entier pourrait être perdu.
- → Il peut être préférable de le gérer avec une feuille de calcul (, excel) quand c'est le premier chaos, et de passer à MLflow quand il devient solide dans une certaine mesure.
Les défis restants
- Coopération avec Kedro
- Je souhaite lier automatiquement les informations des paramètres de Kedro eters.yaml et pipeline.py.
- Utilisez-vous la gestion des versions de journal?
Introduction des actions Github en tant qu'outil CI
### Qu'est-ce que les actions Github? ・ Méthode d'introduction
* (Référence) [CI / CD pour essayer avec la nouvelle fonction "GitHub Actions" de GitHub](https://knowledge.sakura.ad.jp/23478/)
Bonne chose
- Le fonctionnement de la branche principale (principale) a été garanti.
- J'ai pu créer un modèle reproductible (car l'ID de validation se déplace également avec une coupe transversale claire dans un bel environnement à chaque fois)
Les défis restants
- Chaque construction est lourde. Dois-je faire bon usage du cache?
- Apprentissage intensif ・ Tenez compte de la configuration lors de l'utilisation du GPU
Autre
- Introduction du formateur et du vérificateur de code
- (Référence) Exécuter le formateur lors de la pré-validation
- Les vérifications sont exécutées au moment de la validation, il est donc important d'introduire dès le début
- Si vous utilisez un conteneur, placez-le dans le conteneur avec Git (car Python est requis)
- Considérez comment l'utiliser correctement avec le chèque du côté CI
- Transformé en application Web avec AWS Elastic Beanstalk
- Je voulais construire avec S3 + API Gateway + Lambda parce que le sans serveur était bon, mais j'ai abandonné en raison de la limite de taille du fichier
- Vous pouvez utiliser EFS, mais c'est un peu comme si vous deviez en faire un environnement VPC.
- S'il s'agit d'un "conteneur sans serveur (ou plutôt, je veux juste dormir quand il n'y a pas de demande)", Cloud Run ou GAE avec GCP?
en conclusion
- Il y a encore de nombreux défis à relever, mais j'aimerais continuer à essayer diverses choses afin d'exécuter le cycle d'apprentissage automatique rapidement et sûrement tout en accompagnant le data scientist.
- Au fait, le contenu de cet article a été pris comme note d'accompagnement lorsque j'ai essayé de développer un modèle pour prédire le résultat d'une course de chevaux en jouant avec mes amis. Je publierai probablement le code une fois qu'il sera un peu plus propre. (Légèrement modifié par rapport à la structure de répertoires par défaut de Kedro.)