ENSAE 3A - 2023/2024
Tendance à la spécialisation : data analyst, data engineer, ML Engineer…
Rôle d’interface entre métier et équipes techniques
Origine : communauté des développeurs logiciels
Constats :
Conséquence : un ensemble de règles informelles, conventionnellement acceptées comme produisant des logiciels fiables, évolutifs et maintenables
L’activité du datascientist tend à se rapprocher de celle du développeur :
projets intenses en code
projets collaboratifs et de grande envergure
complexification des données et des infrastructures
déploiement d’applications pour valoriser les modèles
Linux
Git
Git
Tout le contenu du cours est en open-source
Python
1️⃣ Travail collaboratif avec Git
2️⃣ Qualité du code
3️⃣ Structure des projets
4️⃣ Traitement des données volumineuses
5️⃣ Favoriser la portabilité d’une application
Git
Que versionne-t-on ?
.html
, .pdf
, modèles…)Note
Pour définir des règles qui évitent de committer tel ou tel fichier, on utilise un fichier nommé .gitignore
.
Si on mélange du code et des éléments annexes (output, données…) dans un même dossier, il faut consacrer du temps à ce fichier.
Le site gitignore.io
peut vous fournir des modèles.
N’hésitez pas à y ajouter des règles conservatrices (par exemple *.csv
), comme cela est expliqué dans la documentation utilitR
.
Format des commits
Git
facilite le travail collaboratif
Git
: modèle des branchesGitHub
/ GitLab
: Issues, Pull Requests, Forks
Issue : soumettre un problème ou une suggestion aux développeurs d’un projet
Pull Request : proposer aux développeurs d’un projet d’intégrer des modifications
Fork : faire la copie d’un projet existant dans son espace personnel
Description plus détaillée : ici
D’une vision utilitariste du code à une vision du code comme outil de communication
Favoriser la lisibilité et la maintenabilité
Faciliter la réutilisation
Adopter les standards communautaires
Utiliser des fonctions
(Auto-)documenter son code
“Good coding style is like correct punctuation: you can manage without it, butitsuremakesthingseasiertoread”
Astuce
Règle d’or
Il faut utiliser une fonction dès qu’on utilise une même portion de code plus de deux fois (don’t repeat yourself (DRY))
Règles pour écrire des fonctions pertinentes
Documenter le pourquoi plutôt que le comment
Privilégier l’auto-documentation via des nommages pertinents
Comment bien documenter un script ?
Favoriser la lisibilité et la maintenabilité
Enjeux spécifiques à la data science
Favoriser une structure modulaire selon l’état du projet
Adopter les standards communautaires
(Auto-)documenter son projet
Premier niveau : structuration du code
Adopter une structure type package
main
) orchestre les traitements├── report.ipynb
├── correlation.png
├── data.csv
├── data2.csv
├── fig1.png
├── figure 2 (copy).png
├── report.pdf
├── partial data.csv
├── script.py
└── script_final.py
├── data
│ ├── raw
│ │ ├── data.csv
│ │ └── data2.csv
│ └── interim
│ └── partial data.csv
├── notebooks
│ └── report.ipynb
├── src
| ├── script.py
│ └── script_final.py
└── reports
├── report.pdf
└── figures
├── fig1.png
├── figure 2 (copy).png
├── figure10.png
└── correlation.png
├── data
│ ├── raw
│ │ ├── dpe_logement_202103.csv
│ │ └── dpe_logement_202003.csv
│ └── interim
│ └── dpe_logement_merged_preprocessed.csv
├── notebooks
│ └── report.ipynb
├── src
| ├── main.R
| ├── preprocessing.R
│ └── generate_plots.R
└── reports
├── report.pdf
└── figures
├── histogram_energy_diagnostic.png
├── barplot_consumption_pcs.png
├── correlation_matrix.png
└── correlation.png
Favoriser l’auto-documentation via des nommages pertinents
Inclure un fichier README.md
à la racine du projet
Si open-source : inclure une licence
1️⃣ Infrastructures de données
2️⃣ Formats de données
3️⃣ Frameworks de traitement de données
Historiquement : stockage dans des bases de données
80’s : essor des bases de données relationnelles
CSV
, JSON
, XML
) sont utiles pour :
Parquet
: propriétésParquet
: partitionnementParquet
ne résout pas tout
Utiliser un format de données adapté (Parquet
)
Utiliser des outils informatiques adaptés
Arrow
/ DuckDB
)Spark
)On a construit un projet lisible, structuré et versionné
Peut-on partager notre projet ?
Python
sur son posteConflits de version : différents projets peuvent requérir des versions différentes d’un même package
Version de Python
fixe, celle de l’installation système
Reproductibilité limitée : difficile de dire quel projet nécessite quel package
Portabilité limitée : difficile de fixer dans un fichier les dépendances spécifiques à un projet
Python
et des packagesImplémentation standard : venv
Une implémentation populaire en data science : conda
D’autres implémentations existent : virtualenv, pyenv…
venv
: utilisationvenv
fait partie de la librairie standard de Python
Utilisation basique (sous Linux
)
python -m venv myenv
source myenv/bin/activate
pip install scikit-learn
deactivate
requirements.txt
à la racine du projet (à commit !)
pip freeze > requirements.txt
pip install -r requirements.txt
requirements.txt
Python
non-géréeDocker
est largement prédominantDocker
: installationDocker
: outil en ligne de commande (CLI)
Dockerfile
# Image Docker de base
FROM python:3.11
# Définition du répertoire de travail
WORKDIR /code
# Copie des fichiers nécessaires sur l'image
COPY requirements.txt /code/requirements.txt
# Installation des dépendances
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt && \
python -m spacy download en_core_web_sm
COPY app/ code/app
# Commande lancée par l'image au runtime
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"]
Docker
: fonctionnementDocker
en pratiqueDocker
DataOps : construction de pipelines de données
MLOps : déploiement et maintenance de modèles de ML
6️⃣ Déploiement
7️⃣ MLOps
Une API (application programming interface ou « interface de programmation d’application ») est une interface logicielle qui permet de « connecter » un logiciel ou un service à un autre logiciel ou service afin d’échanger des données et des fonctionnalités.
Python
, scikit-learn
, Docker
, etc. sont des APIsGET
, POST
, etc.) (ex : rues contenant “comédie”)Dépend essentiellement de l’infrastructure à disposition
Propriétés recherchées :
Solution : utiliser un orchestrateur de conteneurs
SSP Cloud
: KubernetesGitHub
: GitHub ActionsGitLab
: GitLab CI/CDSSP Cloud
: ArgoCDGitHub Actions
.yaml
qui paramétrise le runner
.github/workflows/
.github/workflows/ci.yaml
name: Build Docker image
on:
push:
branches:
- main
tags:
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ensae-reproductibilite/api-titanic
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v5
with:
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
ArgoCD
Kubernetes
SSP Cloud
: Argo WorkflowsReproductibilité
Contrôle de version
Automatisation
Collaboration
Monitoring
SSP Cloud
: MLFlowMLflow
:
Kubernetes
MLFlow
: vue d’ensembleMLFlow
: Tracking serverMLFlow
: ModelsMLFlow
: Model registryMLFlow
)MLFlow
)Surveiller une application est partie intégrante de l’approche DevOps
Contrôle technique de l’API :
Surveiller un modèle ML est partie intégrante de l’approche MLOps
Contrôle méthodologique du modèle
Performance en temps réel du modèle souvent impossible, utilisation de proxys :
Intégration de logs dans l’API
Récupération et mise en forme des logs
Suivi de métriques de ML
Mise en place d’un système d’alertes
MLFlow
Bonnes pratiques pour la mise en production des projets de data science
Comment favoriser la portabilité ?