C

NutriSense AI — MLOps Dashboard

Clasificador de restricciones dietéticas · distilbert-base-multilingual-cased · 8 clases
ClearML Self-Hosted Experimentos: 47 Pipeline v1.4 GPU: g4dn.xlarge Dataset: v3.0
F1 Macro (best)
0.924
▲ +0.031 vs baseline
Accuracy
93.1%
▲ +2.8 pp
Experimentos HPO
47
BOHB · 4 workers
Muestras Dataset
42K
v3.0 · +3.2K nuevas
Latencia Inferencia
38ms
p95 · batch=1
🔬
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
0.95 0.90 0.85 run #47 (best) run #43 ép.1 ép.2 ép.3 ép.4
F1 por clase — run #47 · mejor modelo
0.96 0.94 0.97 0.91 0.95 0.93 0.87 0.97 DM Cel HTA Alerg Veg Vegan IRC N/A
🎯
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
2026-06-10 · hereda de v2 · +3.200 historiales (Hospital Quirónsalud Madrid)
42.000 registros
8 clases
1.2 GB
✓ finalizado · inmutable
v2.1 STABLE
customer-diet-records-v2
2026-04-22 · revisión etiquetas (nutricionistas) · deduplicado
38.800 registros
860 MB
Usado en 23 experimentos
v1.0 ARCHIVED
customer-diet-records-v1
2026-01-15 · dataset inicial · sin deduplicar
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"