Clasificador de pistachos (Kirmizi vs Siirt) usando Deep Learning con PyTorch Lightning y MLOps.
Pistachio Image Dataset - 2 clases (Kirmizi_Pistachio, Siirt_Pistachio). Se descarga automaticamente via kagglehub.
Editar config/configuracion.yaml (solo hiperparametros del modelo):
model_type:cnn_batchnormocnn_dropoutsemilla: semilla para reproducibilidadlearning_rate,batch_size,max_epochs,patiencedropout_ratewandb_project: nombre del proyecto en W&B
pip install -r requirements.txt
# Antes de usar W&B, hacer login una vez (o pasar --no-wandb)
wandb login
# Entrenamiento simple
python src/main.py configuracion.yaml
# Sin W&B (offline)
python src/main.py configuracion.yaml --no-wandb
# Smoke test (10% datos)
python src/main.py configuracion.yaml --no-wandb --data-fraction 0.1
# W&B Sweep (grid search)
python src/main.py configuracion.yaml --sweep
# Reanudar un sweep existente
python src/main.py configuracion.yaml --sweep-id <ID>
# Limitar ejecuciones del sweep
python src/main.py configuracion.yaml --sweep --count 5
# API de inferencia (desde la raiz del proyecto)
uvicorn src.api_inferencia:app --host 0.0.0.0 --port 8000
# Tests
pytest tests/ -vdocker build -t pistachio-mlops .
# Entrenamiento (auto --no-wandb si no hay WANDB_API_KEY)
docker run --rm --gpus all pistachio-mlops
# Entrenamiento sin GPU
docker run --rm pistachio-mlops
# Entrenamiento con W&B
docker run --rm -e WANDB_API_KEY=tu_key pistachio-mlops
# Smoke test (10% datos)
docker run --rm pistachio-mlops --data-fraction 0.1
# API de inferencia (el modelo debe estar en models/ al hacer build)
# El puerto interno se puede cambiar con -e PORT=9000
docker run --rm -p 8000:8000 -e MODE=api pistachio-mlopsGET /- Health checkPOST /predict- Clasifica una imagen de pistacho (multipart/form-data, campofile)
Ejemplo:
curl -X POST http://localhost:8000/predict -F "file=@pistacho.jpg"Respuesta:
{
"class": "Kirmizi_Pistachio",
"confidence": 0.92,
"probabilities": { "Kirmizi_Pistachio": 0.92, "Siirt_Pistachio": 0.08 }
}- Proyecto: https://wandb.ai/14farresa-/pistachio-mlops
- Report: https://api.wandb.ai/links/14farresa-/9smbs51w
| Modelo | LR | Batch | Test Acc | Test F1 |
|---|---|---|---|---|
| cnn_batchnorm | 0.001 | 64 | 0.9317 | 0.9294 |
| LR | Batch | Modelo | Test Acc | Test F1 |
|---|---|---|---|---|
| 0.001 | 32 | cnn_batchnorm | 0.931 | 0.929 |
| 0.001 | 32 | cnn_dropout | 0.891 | 0.888 |
| 0.01 | 32 | cnn_batchnorm | 0.929 | 0.926 |
| 0.01 | 32 | cnn_dropout | 0.599 | 0.375 |
| 0.001 | 64 | cnn_batchnorm | 0.922 | 0.920 |
| 0.001 | 64 | cnn_dropout | 0.916 | 0.914 |
| 0.01 | 64 | cnn_batchnorm | 0.925 | 0.923 |
| 0.01 | 64 | cnn_dropout | 0.599 | 0.375 |
Conclusion: BatchNorm supera significativamente a Dropout. LR=0.01 con Dropout colapsa (predice solo una clase).
Adrià Farrés