Saltar al contenido principal

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ísticaBeneficio
Comandos similares a GitFlujo de trabajo familiar para desarrolladores
Almacenamiento externoLos datos permanecen fuera de Git
DeduplicaciónLos mismos datos se almacenan una sola vez
PipelinesFlujos de trabajo de ML reproducibles
Almacenamiento remotoSoporte 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
  1. DVC amplía Git para archivos grandes sin saturar el repositorio
  2. Use almacenamiento remoto para colaboración en equipo (S3, GCS, Azure)
  3. Defina pipelines para flujos de trabajo de ML reproducibles
  4. Rastree experimentos con los comandos DVC exp
  5. Versione los datos junto con el código para reproducibilidad total
  6. Automatice operaciones de DVC en pipelines CI/CD

Ejercicio práctico​

  1. Inicialice DVC en un proyecto nuevo
  2. Configure almacenamiento remoto S3 o local
  3. Rastrear un conjunto de datos con DVC
  4. Cree un pipeline sencillo de 3 etapas
  5. Ejecute experimentos con diferentes parámetros

Siguiente: Capítulo 3: Versionado de Modelos