MLOops!.. I Did It Again Monter une plateforme AI sur les infras OVHCloud
A presentation at Very Tech Trip in February 2023 in Paris, France by Jean-Luc Tromparent
MLOops!.. I Did It Again Monter une plateforme AI sur les infras OVHCloud
Jean-Luc Tromparent Bienvenue! Embarquement immédiat pour un voyage vers les réseaux profonds @JLT @jlt@piaille.fr Principal engineer @ hellowork.com Dev & Ops & Data
Hello World ! http://yann.lecun.com/exdb/mnist/
Hello World ! http://yann.lecun.com/exdb/mnist/
Accuracy 𝑝𝑟é𝑑𝑖𝑐𝑡𝑖𝑜𝑛𝑠 𝑐𝑜𝑟𝑟𝑒𝑐𝑡𝑒𝑠 = 𝑛𝑜𝑚𝑏𝑟𝑒 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑟é𝑑𝑖𝑐𝑡𝑖𝑜𝑛𝑠 Error rate 𝑝𝑟é𝑑𝑖𝑐𝑡𝑖𝑜𝑛𝑠 𝑒𝑟𝑟𝑜𝑛é𝑒𝑠 = 𝑛𝑜𝑚𝑏𝑟𝑒 𝑡𝑜𝑡𝑎𝑙 𝑑𝑒 𝑝𝑟é𝑑𝑖𝑐𝑡𝑖𝑜𝑛𝑠
Leaderboard MNIST https://paperswithcode.com/sota/imageclassification-on-mnist TIENS… Et si on clonait ce repo ?
❯ git clone https://github.com/ansh941/MnistSimpleCNN.git Clonage dans ‘MnistSimpleCNN’… remote: Enumerating objects: 519, done. remote: Counting objects: 100% (12/12), done. remote: Compressing objects: 100% (9/9), done. remote: Total 519 (delta 6), reused 3 (delta 3), pack-reused 507 Réception d’objets: 100% (519/519), 622.69 Mio | 6.34 Mio/s, fait. Résolution des deltas: 100% (39/39), fait. ~ on master [?] on ☁ (gra) took 1m40s Git clone MnistSimpleCNN ❯ cd 212K 4,0K 625M 116M 742M MnistSimpleCNN ; du -h -d 1 ./code ./logs ./.git ./data .
DVC : Data Version Control Objectif: rendre reproductible la production de modèles
DVC : commandes de base Tracker des fichiers de données en symbiose avec git dvc init dvc add data.csv dvc commit dvc checkout dvc push dvc pull
Exemple : on veut tracker data.csv avec dvc dvc init dvc add data.csv dvc commit dvc checkout dvc push dvc pull git ./.git ./data.csv ./train.py
Initialisation du cache /.dvc dvc init dvc add data.csv dvc commit dvc checkout dvc push dvc pull ./.dvc/config ./.dvc/cache ./.git ./data.csv ./train.py git git
Tracking d’un fichier ou répertoire avec dvc dvc init dvc add data.csv dvc commit dvc checkout dvc push dvc pull ./.dvc/config ./.dvc/cache ./.git ./.gitignore ./data.csv ./data.csv.dvc ./train.py git copie git dvc git git hash
Synchronisation du cache dvc avec un remote storage dvc init dvc add data.csv dvc commit dvc checkout dvc push dvc pull
DVC : remote storage Support de 12 technos différentes (azure storage, S3, google drive..) Config pour Object Storage @OVH ❯ dvc remote add -d myremote s3://mycontainer ❯ dvc remote modify myremote endpointurl https://s3.gra.io.cloud.ovh.net ❯ cat .dvc/config [core] remote = myremote [‘remote “myremote”’] url = s3://mycontainer endpointurl = https://s3.gra.io.cloud.ovh.net Variables d’environnement ❯ export AWS_ACCESS_KEY_ID= c93c571d5214a9482157491bd4a5 ❯ export AWS_SECRET_ACCESS_KEY= **************************** ❯ export AWS_DEFAULT_REGION=gra
DVC : Mise en place d’un pipeline de training Refactoring de l’exemple convnet de la librairie Keras: https://github.com/keras-team/keras-io/blob/master/examples/vision/mnist_convnet.py dataset mnist (helper keras) hyper paramètres mnist_convnet.py metrics
On découpe le code en étape dataset mnist (helper keras) hyper paramètres train.py metrics mnist_convnet.py model.h5 evaluate.py metrics
On place les hyperparamètres dans un fichier yaml dataset mnist (helper keras) ❌ hyper paramètres metrics mnist_convnet.py params.yaml train.py model.h5 evaluate.py metrics
On charge les datasets depuis le filesystem ❌ dataset mnist (helper keras) ❌ hyper paramètres metrics mnist_convnet.py params.yaml train.py model.h5 evaluate.py data/train data/test metrics
On identifie les dépendances que DVC va tracker ❌ dataset mnist (helper keras) ❌ hyper paramètres metrics mnist_convnet.py params.yaml train.py model.h5 evaluate.py data/train data/test metrics
.. toutes les dépendances (y compris le code) ❌ dataset mnist (helper keras) ❌ hyper paramètres metrics mnist_convnet.py params.yaml train.py model.h5 evaluate.py data/train data/test metrics
Définition du pipeline ❯ dvc stage add -n train \ -p epochs,depth,dropout \ -d src/train.py \ -d data \ -o models/model.h5 \ python src/train.py On peut ensuite lancer le pipeline avec « dvc repro » dvc.yaml stages: train: cmd: python src/train.py deps: - data - src/train.py params: - epochs - depth - dropout outs: - models/model.h5
Continous Machine Learning • Gitflow for datascience • Auto report for ML experiment • Unifier le pilotage des ressources de différents cloud providers
CML –Continous Machine Learning gitlab-ci.yaml stages: - launch - train launch-runner: stage: launch image: iterativeai/cml:0-dvc2-base1 script: - | cml runner launch \ —cloud=aws \ –cloud-region=eu-west1 \ —cloud-type=xl \ —labels=cml-gpu train-and-report: stage: train needs: [launch-runner] tags: [cml-gpu] image: iterativeai/cml:0-dvc2-base1-gpu script: - dvc pull - dvc repro - dvc metrics diff —show-md > report.md - cml comment create report.md
Le plan est prêt ! Déploiement d’un cluster k8s ovh avec IAC: terraform puis helm pour l’operateur GPU de nvidia Lancement du runner dans un container k8s en utilisant cml runner launch Pipeline d’entrainement exploitant dvc repro
Je ne dirais pas que c’est un échec…
Je ne dirais pas que c’est un échec… 🤔 Temps de démarrage k8s
Je ne dirais pas que c’est un échec… 🤔 😨 Temps de démarrage k8s CML mis à dispo sous forme d’image docker peu stable 0-dvc2-base1 == latest (cml 0.18.17)
Je ne dirais pas que c’est un échec… 🤔 😨 😱 Temps de démarrage k8s CML mis à dispo sous forme d’image docker peu stable 0-dvc2-base1 == latest (cml 0.18.17) Le runner qui s’enregistre et qui stop tout de suite … sans logs
Je ne dirais pas que c’est un échec… 🤔 😨 😱 Temps de démarrage k8s CML mis à dispo sous forme d’image docker peu stable 0-dvc2-base1 == latest (cml 0.18.17) Le runner qui s’enregistre et qui stop tout de suite … sans logs
Introducing AIRunner https://gitlab.com/verytechtrip/airunner AIRunner = tensorflow-gpu + dvc 2.42.0 + cml 0.18.17 + gitlab-runner Merci aux Équipes d’OVHcloud AI Training Inspiré de: • https://github.com/ovh/ai-training-examples • https://github.com/MaximeWeyl/ai-images-sources
AIRunner gitlab-ci.yaml launch-runner: stage: launch before_script: - curl https://cli.gra.training.ai.cloud.ovh.net/install.sh | bash - /root/bin/ovhai login -u ${OVHAI_USER} -p ${OVHAI_PASSWORD} script: - | /root/bin/ovhai job run \ —flavor ai1-1-gpu \ —gpu 1 \ —env CI_SERVER_URL=”$CI_SERVER_URL” \ —env CI_API_V4_URL=”$CI_API_V4_URL” \ —env CI_PROJECT_ID=”$CI_PROJECT_ID” \ —env REPO_TOKEN=”$REPO_TOKEN” \ —env RUNNER_TAG=”airunner” \ “registry.gitlab.com/verytechtrip/airunner:1.0.0”
Démo https://gitlab.com/verytechtrip/mlops It’s DEMO TIME!
Démo https://gitlab.com/verytechtrip/mlops It’s DEMO TIME! • • • • • • • • DVC: stocker et versionner un dataset DVC: définir un pipeline d’apprentissage … lancé depuis gitlab … sur une infra GPU … que l’on peut paralléliser … pour obtenir rapidement un rapport … partagé avec l’équipe … qui va pouvoir collaborer sur la mise au point du modèle via des merge requests
We are hiring ! Find me online : @JLT @jlt@piaille.fr jltrom Take out the good stuff : https://gitlab.com/verytechtrip/