Chapitre 2 : Contrôle de version des données (DVC)
Introduction
DVC (Contrôle de Version des Données) étend les capacités de Git pour gérer de gros fichiers, ensembles de données et modèles d'apprentissage automatique. Il permet la reproductibilité en suivant les données et les modèles en parallèle avec le code.
Pourquoi DVC ?
Le problème des gros fichiers dans Git
Avantages de DVC
| Fonctionnalité | Avantage |
|---|---|
| Commandes similaires à Git | Flux de travail familier pour les développeurs |
| Stockage externe | Les données restent en dehors de Git |
| Déduplication | Les mêmes données sont stockées une seule fois |
| Pipelines | Flux de travail ML reproductibles |
| Stockage distant | Support S3, GCS, Azure, SSH |
Configuration de DVC
Installation
# Utilisation de pip
pip install dvc
# Avec support de stockage distant
pip install "dvc[s3]" # Amazon S3
pip install "dvc[gs]" # Google Cloud Storage
pip install "dvc[azure]" # Azure Blob Storage
pip install "dvc[ssh]" # SSH remote
pip install "dvc[all]" # Tous les remotes
# Initialiser DVC dans votre projet
cd your-project
dvc init
git add .dvc .dvcignore
git commit -m "Initialiser DVC"
Structure du répertoire DVC
Après l'initialisation :
your-project/
├── .dvc/
│ ├── config # Configuration DVC
│ ├── .gitignore # Fichiers que DVC ignore dans son propre dossier
│ └── cache/ # Cache local (ignoré par git)
├── .dvcignore # Fichiers que DVC doit ignorer
└── ...
Suivi des données avec DVC
Suivi de données de base
# Ajouter un fichier de données au suivi DVC
dvc add data/training_data.csv
# Cela crée :
# - data/training_data.csv.dvc (fichier de métadonnées)
# - data/.gitignore (empêche git de suivre le fichier réel)
# Ajouter les fichiers DVC à git
git add data/training_data.csv.dvc data/.gitignore
git commit -m "data : suivre les données d'entraînement avec DVC"
Comprendre les fichiers .dvc
# data/training_data.csv.dvc
outs:
- md5: a3f2b1c4d5e6f7g8h9i0j1k2
size: 1073741824
path: training_data.csv
Le fichier .dvc contient :
- md5 : Hachage du contenu du fichier
- size : Taille du fichier en octets
- path : Chemin relatif vers le fichier
Suivi des répertoires
# Suivre des répertoires entiers
dvc add data/images/
# Crée data/images.dvc
git add data/images.dvc data/.gitignore
git commit -m "data : ajouter le jeu de données d'images"
Configuration du stockage distant
Configuration d'un stockage S3
# Ajouter un stockage distant S3
dvc remote add -d myremote s3://mybucket/dvc-storage
# Configurer les identifiants (ou utiliser des rôles IAM)
dvc remote modify myremote access_key_id 'YOUR_ACCESS_KEY'
dvc remote modify myremote secret_access_key 'YOUR_SECRET_KEY'
# Ou utiliser le profil AWS
dvc remote modify myremote profile myprofile
# Activer le cache pour des opérations plus rapides
dvc remote modify myremote cache true
Configuration d'un stockage GCS
# Ajouter un stockage distant Google Cloud Storage
dvc remote add -d myremote gs://mybucket/dvc-storage
# Authentification avec un compte de service
dvc remote modify myremote credentialpath /path/to/credentials.json
Configuration d'un stockage Azure Blob
# Ajouter un stockage distant Azure Blob Storage
dvc remote add -d myremote azure://mycontainer/dvc-storage
# Configurer le compte
dvc remote modify myremote account_name 'myaccount'
dvc remote modify myremote account_key 'mykey'
Stockage local (pour le développement)
# Utiliser un répertoire local comme stockage distant (utile pour le développement)
dvc remote add -d local /shared/dvc-storage
# Ou un lecteur réseau
dvc remote add -d network //server/dvc-storage
Pousser et tirer des données
Pousser des données vers le stockage distant
# Pousser toutes les données suivies vers le stockage distant par défaut
dvc push
# Pousser un fichier spécifique
dvc push data/training_data.csv.dvc
# Pousser vers un stockage distant spécifique
dvc push -r myremote
Tirer des données depuis le stockage distant
# Tirer toutes les données depuis le stockage distant par défaut
dvc pull
# Tirer un fichier spécifique
dvc pull data/training_data.csv.dvc
# Tirer depuis un stockage distant spécifique
dvc pull -r myremote
Vérifier une version spécifique
# Passer à un autre commit/branche git
git checkout v1.0.0
# Vérifier la version de données correspondante
dvc checkout
Pipelines DVC
Pourquoi des pipelines ?
Les pipelines définissent la séquence des étapes de traitement des données, rendant les expériences reproductibles.
Définir des pipelines
# dvc.yaml
stages:
prepare:
cmd: python src/data/prepare.py
deps:
- src/data/prepare.py
- data/raw/
params:
- prepare.seed
- prepare.split_ratio
outs:
- data/processed/train.csv
- data/processed/test.csv
featurize:
cmd: python src/features/featurize.py
deps:
- src/features/featurize.py
- data/processed/train.csv
- data/processed/test.csv
params:
- featurize.max_features
outs:
- data/features/train_features.pkl
- data/features/test_features.pkl
train:
cmd: python src/models/train.py
deps:
- src/models/train.py
- data/features/train_features.pkl
params:
- train.n_estimators
- train.max_depth
- train.learning_rate
outs:
- models/model.pkl
metrics:
- metrics/train_metrics.json:
cache: false
evaluate:
cmd: python src/models/evaluate.py
deps:
- src/models/evaluate.py
- models/model.pkl
- data/features/test_features.pkl
metrics:
- metrics/eval_metrics.json:
cache: false
plots:
- metrics/plots/:
cache: false
Fichier de paramètres
# params.yaml
prepare:
seed: 42
split_ratio: 0.2
featurize:
max_features: 1000
train:
n_estimators: 100
max_depth: 10
learning_rate: 0.1
Exécution des pipelines
# Exécuter l'ensemble du pipeline
dvc repro
# Exécuter une étape spécifique
dvc repro train
# Forcer l'exécution (ignorer le cache)
dvc repro -f
# Visualiser le pipeline
dvc dag
Visualisation du pipeline
$ dvc dag
+----------+
| prepare |
+----------+
*
*
*
+-----------+
| featurize |
+-----------+
*
*
*
+---------+
| train |
+---------+
*
*
*
+----------+
| evaluate |
+----------+
Expériences avec DVC
Exécution d'expériences
# Exécuter une expérience avec des paramètres modifiés
dvc exp run --set-param train.n_estimators=200
# Exécuter plusieurs expériences en file d'attente
dvc exp run --queue --set-param train.n_estimators=100
dvc exp run --queue --set-param train.n_estimators=200
dvc exp run --queue --set-param train.n_estimators=300
# Exécuter les expériences en file d'attente
dvc exp run --run-all
# Lister les expériences
dvc exp show
Comparaison des expériences
# Afficher les expériences avec les métriques
dvc exp show --md
# Comparer des expériences spécifiques
dvc exp diff exp-abc123 exp-def456
Gestion des expériences
# Appliquer une expérience à l'espace de travail
dvc exp apply exp-abc123
# Créer une branche à partir d'une expérience
dvc exp branch exp-abc123 feature/best-model
# Supprimer des expériences
dvc exp remove exp-abc123
Métriques et graphiques DVC
Définir des métriques
# src/models/train.py
import json
metrics = {
"accuracy": 0.92,
"f1_score": 0.89,
"auc_roc": 0.95
}
with open("metrics/train_metrics.json", "w") as f:
json.dump(metrics, f)
Visualisation des métriques
# Afficher les métriques
dvc metrics show
# Comparer les métriques entre les commits
dvc metrics diff HEAD~1
Création de graphiques
# src/models/evaluate.py
import json
# Données de la courbe ROC
roc_data = [
{"fpr": 0.0, "tpr": 0.0},
{"fpr": 0.1, "tpr": 0.6},
{"fpr": 0.2, "tpr": 0.8},
{"fpr": 1.0, "tpr": 1.0}
]
with open("metrics/plots/roc.json", "w") as f:
json.dump(roc_data, f)
# Générer des graphiques
dvc plots show
# Comparer des graphiques entre les expériences
dvc plots diff exp-abc123 exp-def456
Bonnes pratiques
1. Organiser les répertoires de données
data/
├── raw/ # Données originales, immuables
├── interim/ # Transformations intermédiaires
├── processed/ # Données finales, propres pour la modélisation
└── external/ # Données provenant de sources externes
2. Utiliser des noms de fichiers .dvc significatifs
# Bon : Noms descriptifs
dvc add data/customer_transactions_2024.parquet
# À éviter : Noms génériques
dvc add data/data.csv
3. Versionner les données avec des métadonnées
# Taguer les versions de données avec git
git tag -a "data-v1.0.0" -m "Jeu de données d'entraînement initial"
git push origin data-v1.0.0
4. Documenter les sources de données
# data/README.md ou data/sources.yaml
sources:
customer_transactions:
description: "Historique des transactions clients"
source: "Base de données PostgreSQL de production"
refresh_frequency: "quotidienne"
columns:
- name: transaction_id
type: string
description: "Identifiant unique de la transaction"
- name: amount
type: float
description: "Montant de la transaction en USD"
5. Automatiser les opérations DVC
# .github/workflows/dvc.yml
name: Pipeline DVC
on:
push:
branches: [main]
jobs:
dvc-pipeline:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: iterative/setup-dvc@v1
- name: Configurer le stockage distant DVC
run: |
dvc remote modify --local myremote access_key_id ${{ secrets.AWS_ACCESS_KEY }}
dvc remote modify --local myremote secret_access_key ${{ secrets.AWS_SECRET_KEY }}
- name: Tirer les données
run: dvc pull
- name: Exécuter le pipeline
run: dvc repro
- name: Pousser les résultats
run: dvc push
Dépannage
Problèmes courants
# Erreur : "Impossible d'acquérir le verrou"
rm .dvc/lock
# Erreur : "Échec de la vérification"
dvc checkout -f
# Erreur : "Échec de la poussée" (gros fichiers)
dvc push --jobs 4 # Téléversements parallèles
# Vérifier l'état du cache
dvc cache dir
# Nettoyer le cache inutilisé
dvc gc -w
Points clés à retenir
Résumé
- DVC étend Git pour les gros fichiers sans encombrer le dépôt
- Utiliser le stockage distant pour la collaboration en équipe (S3, GCS, Azure)
- Définir des pipelines pour des flux de travail ML reproductibles
- Suivre les expériences avec les commandes DVC exp
- Versionner les données en parallèle avec le code pour une reproductibilité complète
- Automatiser les opérations DVC dans les pipelines CI/CD
Exercice pratique
- Initialiser DVC dans un nouveau projet
- Configurer un stockage distant S3 ou local
- Suivre un ensemble de données avec DVC
- Créer un pipeline simple en 3 étapes
- Exécuter des expériences avec différents paramètres
Suivant : Chapitre 3 : Versionnage des modèles