Seguimiento de Experimentos
train.py — 2 líneas para capturar todo automáticamente
train_diet_classifier.py
Python
from clearml import Task from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments # === 2 líneas que capturan TODO: git diff, requirements, args, métricas === task = Task.init( project_name="NLP", task_name="diet-classifier-distilbert-v2", tags=["distilbert", "multilingual", "prod-candidate"] ) # Hiperparámetros → capturados y comparables entre runs params = task.connect({ "learning_rate": 3e-5, "batch_size": 32, "epochs": 4, "warmup_steps": 500, "weight_decay": 0.01, "num_labels": 8, # 8 restricciones dietéticas }) model = AutoModelForSequenceClassification.from_pretrained( "distilbert-base-multilingual-cased", num_labels=params["num_labels"] ) # Training — ClearML captura loss/acc/f1 por época automáticamente trainer = Trainer(model=model, args=TrainingArguments(...), ...) trainer.train() # Subir modelo como artefacto versionado task.upload_artifact("best_model", artifact_object="./results/best_checkpoint") task.upload_artifact("confusion_matrix", artifact_object=cm_df) # DataFrame
| Experimento | LR | Batch | Épocas | F1 Macro | Accuracy | Duración | Estado |
|---|---|---|---|---|---|---|---|
| diet-clf-v2 #47 BEST | 3e-5 | 32 | 4 | 0.924 | 93.1% | 42m | Completed |
| diet-clf-v2 #43 | 5e-5 | 32 | 3 | 0.901 | 91.4% | 35m | Completed |
| diet-clf-v2 #39 | 1e-5 | 16 | 5 | 0.887 | 89.8% | 67m | Completed |
| diet-clf-v1 #12 | 2e-5 | 64 | 3 | 0.856 | 87.2% | 29m | Baseline |
| diet-clf-v2 #48 | 4e-5 | 32 | 4 | — | — | 18m (est.) | Running |
Pipeline Reproducible
PipelineController — preprocess → train → evaluate → deploy
Run: pipeline-diet-v1.4 · Iniciado: 2026-06-16 09:12 · Estado: running
preprocess
✓ completado
42K registros
→
fine-tune
⟳ running
época 3/4
→
evaluate
◎ en cola
gpu-queue
→
deploy
◎ condicional
F1 > 0.90
pipeline_nutrisense.py
Python
from clearml import PipelineController pipe = PipelineController( name="diet-classifier-pipeline", project="NLP", version="1.4" ) pipe.add_step(name="preprocess", base_task_project="NLP", base_task_name="data-preprocess", parameter_override={"General/dataset_version": "v3.0", "General/max_samples": 42000}) pipe.add_step(name="fine-tune", parents=["preprocess"], base_task_project="NLP", base_task_name="train-distilbert", parameter_override={"General/lr": 3e-5, "General/epochs": 4}) # Deploy solo si F1 macro supera umbral clínico pipe.add_step(name="deploy", parents=["evaluate"], base_task_name="deploy-fastapi-model", pre_execute_callback=lambda p, n, _: p.get_step("evaluate").get_metric("eval", "f1_macro") > 0.90) pipe.start() # lanzado en gpu-queue, sin SSH
F1 Macro por época — run #47 vs #43
F1 por clase — run #47 · mejor modelo
Optimización de Hiperparámetros (BOHB)
47 trials · 4 workers paralelos · Bayesian + Hyperband
General/learning_rate
Rango: 1e-5 → 1e-3
3e-5
✓ óptimo
General/batch_size
Valores: 16, 32, 64
32
✓ óptimo
General/warmup_steps
Rango: 0 → 1000
500
General/weight_decay
Rango: 0.0 → 0.1
0.01
Versionado de Datasets
Dataset.create() — inmutable, trazable, heredable
v3.0 LATEST
customer-diet-records-v3
42.000 registros
8 clases
1.2 GB
✓ finalizado · inmutable
v2.1 STABLE
customer-diet-records-v2
38.800 registros
860 MB
Usado en 23 experimentos
v1.0 ARCHIVED
customer-diet-records-v1
21.300 registros
Solo reproducibilidad histórica
Agente Remoto GPU
clearml-agent daemon --queue gpu-queue --docker --gpus all
gpu-queue g4dn.xlarge
Activo
diet-clf-v2 #48 (fine-tune)
74%
evaluate-model #49
—
cpu-queue m5.xlarge
3 tasks
preprocess-v3.1
✓
HPO controller
94%
setup-agent.sh
bash
# En el servidor GPU de NutriSense (VPC privada) pip install clearml-agent # Configurar credenciales ClearML self-hosted clearml-agent init # apunta a http://clearml.nutrisense.internal:8080 # Lanzar agente con Docker isolation — sin SSH, reproducible clearml-agent daemon \ --queue gpu-queue \ --docker nvidia/cuda:11.8-cudnn8-runtime-ubuntu20.04 \ --gpus all \ --detached # Los DS lanzan experimentos desde su laptop, el agente ejecuta en GPU # No más: "funciona en mi máquina"