Capítulo 2: Control de Versiones de Datos (DVC)
Introducción
DVC (Data Version Control) amplía las capacidades de Git para manejar archivos grandes, conjuntos de datos y modelos de aprendizaje automático. Permite la reproducibilidad al rastrear datos y modelos junto con el código.
¿Por qué DVC?
El problema de los archivos grandes en Git
Beneficios de DVC
| Característica | Beneficio |
|---|---|
| Comandos similares a Git | Flujo de trabajo familiar para desarrolladores |
| Almacenamiento externo | Los datos permanecen fuera de Git |
| Deduplicación | Los mismos datos se almacenan una sola vez |
| Pipelines | Flujos de trabajo de ML reproducibles |
| Almacenamiento remoto | Soporte para S3, GCS, Azure, SSH |
Configuración de DVC
Instalación
# Usando pip
pip install dvc
# Con soporte para almacenamiento remoto
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]" # Todos los remotos
# Inicializar DVC en su proyecto
cd your-project
dvc init
git add .dvc .dvcignore
git commit -m "Initialize DVC"
Estructura de directorios de DVC
Después de la inicialización:
your-project/
├── .dvc/
│ ├── config # Configuración de DVC
│ ├── .gitignore # Archivos que DVC ignora en su propia carpeta
│ └── cache/ # Caché local (ignorado por git)
├── .dvcignore # Archivos que DVC debe ignorar
└── ...
Seguimiento de datos con DVC
Seguimiento básico de datos
# Añadir un archivo de datos al seguimiento de DVC
dvc add data/training_data.csv
# Esto crea:
# - data/training_data.csv.dvc (archivo de metadatos)
# - data/.gitignore (evita que git rastree el archivo real)
# Añadir los archivos DVC a git
git add data/training_data.csv.dvc data/.gitignore
git commit -m "data: track training data with DVC"
Entendiendo los archivos .dvc
# data/training_data.csv.dvc
outs:
- md5: a3f2b1c4d5e6f7g8h9i0j1k2
size: 1073741824
path: training_data.csv
El archivo .dvc contiene:
- md5: Hash del contenido del archivo
- size: Tamaño del archivo en bytes
- path: Ruta relativa al archivo
Seguimiento de directorios
# Rastrear directorios completos
dvc add data/images/
# Crea data/images.dvc
git add data/images.dvc data/.gitignore
git commit -m "data: add image dataset"
Configuración de almacenamiento remoto
Configuración de remoto S3
# Añadir remoto S3
dvc remote add -d myremote s3://mybucket/dvc-storage
# Configurar credenciales (o usar roles IAM)
dvc remote modify myremote access_key_id 'YOUR_ACCESS_KEY'
dvc remote modify myremote secret_access_key 'YOUR_SECRET_KEY'
# O usar perfil de AWS
dvc remote modify myremote profile myprofile
# Habilitar caché para operaciones más rápidas
dvc remote modify myremote cache true
Configuración de remoto GCS
# Añadir remoto de Google Cloud Storage
dvc remote add -d myremote gs://mybucket/dvc-storage
# Autenticarse usando cuenta de servicio
dvc remote modify myremote credentialpath /path/to/credentials.json
Configuración de remoto Azure Blob
# Añadir remoto de Azure Blob Storage
dvc remote add -d myremote azure://mycontainer/dvc-storage
# Configurar cuenta
dvc remote modify myremote account_name 'myaccount'
dvc remote modify myremote account_key 'mykey'
Remoto local (para desarrollo)
# Usar directorio local como remoto (útil para desarrollo)
dvc remote add -d local /shared/dvc-storage
# O unidad de red
dvc remote add -d network //server/dvc-storage
Subida y descarga de datos
Subir datos al remoto
# Subir todos los datos rastreados al remoto predeterminado
dvc push
# Subir archivo específico
dvc push data/training_data.csv.dvc
# Subir a remoto específico
dvc push -r myremote
Descargar datos del remoto
# Descargar todos los datos del remoto predeterminado
dvc pull
# Descargar archivo específico
dvc pull data/training_data.csv.dvc
# Descargar de remoto específico
dvc pull -r myremote
Cambiar a una versión específica
# Cambiar a otro commit/branch de git
git checkout v1.0.0
# Descargar la versión de datos correspondiente
dvc checkout
Pipelines en DVC
¿Por qué pipelines?
Los pipelines definen la secuencia de pasos de procesamiento de datos, haciendo que los experimentos sean reproducibles.
Definición de 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
Archivo de parámetros
# params.yaml
prepare:
seed: 42
split_ratio: 0.2
featurize:
max_features: 1000
train:
n_estimators: 100
max_depth: 10
learning_rate: 0.1
Ejecución de pipelines
# Ejecutar todo el pipeline
dvc repro
# Ejecutar etapa específica
dvc repro train
# Forzar ejecución (ignorar caché)
dvc repro -f
# Visualizar pipeline
dvc dag
Visualización del pipeline
$ dvc dag
+----------+
| prepare |
+----------+
*
*
*
+-----------+
| featurize |
+-----------+
*
*
*
+---------+
| train |
+---------+
*
*
*
+----------+
| evaluate |
+----------+
Experimentos con DVC
Ejecución de experimentos
# Ejecutar experimento con parámetros modificados
dvc exp run --set-param train.n_estimators=200
# Ejecutar múltiples experimentos en cola
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
# Ejecutar experimentos en cola
dvc exp run --run-all
# Listar experimentos
dvc exp show
Comparación de experimentos
# Mostrar experimentos con métricas
dvc exp show --md
# Comparar experimentos específicos
dvc exp diff exp-abc123 exp-def456
Gestión de experimentos
# Aplicar experimento al workspace
dvc exp apply exp-abc123
# Crear rama desde experimento
dvc exp branch exp-abc123 feature/best-model
# Eliminar experimentos
dvc exp remove exp-abc123
Métricas y gráficos en DVC
Definición de métricas
# 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)
Visualización de métricas
# Mostrar métricas
dvc metrics show
# Comparar métricas entre commits
dvc metrics diff HEAD~1
Creación de gráficos
# src/models/evaluate.py
import json
# Datos de la curva 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)
# Generar gráficos
dvc plots show
# Comparar gráficos entre experimentos
dvc plots diff exp-abc123 exp-def456
Buenas prácticas
1. Organice los directorios de datos
data/
├── raw/ # Datos originales, inmutables
├── interim/ # Transformaciones intermedias
├── processed/ # Datos finales y limpios para modelado
└── external/ # Datos de fuentes externas
2. Use nombres significativos para archivos .dvc
# Bueno: nombres descriptivos
dvc add data/customer_transactions_2024.parquet
# Evite: nombres genéricos
dvc add data/data.csv
3. Versione los datos con metadatos
# Etiquetar versiones de datos con git
git tag -a "data-v1.0.0" -m "Initial training dataset"
git push origin data-v1.0.0
4. Documente las fuentes de datos
# data/README.md o data/sources.yaml
sources:
customer_transactions:
description: "Historial de transacciones de clientes"
source: "Base de datos de producción PostgreSQL"
refresh_frequency: "diario"
columns:
- name: transaction_id
type: string
description: "Identificador único de transacción"
- name: amount
type: float
description: "Monto de la transacción en USD"
5. Automatice las operaciones de DVC
# .github/workflows/dvc.yml
name: DVC Pipeline
on:
push:
branches: [main]
jobs:
dvc-pipeline:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: iterative/setup-dvc@v1
- name: Configure DVC remote
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: Pull data
run: dvc pull
- name: Run pipeline
run: dvc repro
- name: Push results
run: dvc push
Resolución de problemas
Problemas comunes
# Error: "Unable to acquire lock"
rm .dvc/lock
# Error: "Checkout failed"
dvc checkout -f
# Error: "Push failed" (large files)
dvc push --jobs 4 # Subidas en paralelo
# Verificar estado de la caché
dvc cache dir
# Limpiar caché no utilizada
dvc gc -w
Puntos clave
Summary
- DVC amplía Git para archivos grandes sin saturar el repositorio
- Use almacenamiento remoto para colaboración en equipo (S3, GCS, Azure)
- Defina pipelines para flujos de trabajo de ML reproducibles
- Rastree experimentos con los comandos DVC exp
- Versione los datos junto con el código para reproducibilidad total
- Automatice operaciones de DVC en pipelines CI/CD
Ejercicio práctico
- Inicialice DVC en un proyecto nuevo
- Configure almacenamiento remoto S3 o local
- Rastrear un conjunto de datos con DVC
- Cree un pipeline sencillo de 3 etapas
- Ejecute experimentos con diferentes parámetros
Siguiente: Capítulo 3: Versionado de Modelos