Checklist Pre-Entrenamiento
-
Dataset validado —
leadbot-ai/sdr-conversations-esinspeccionado con dataset inspector: resultado ✓ READY para SFT (formato messages: system/user/assistant) -
HF_TOKEN configurado — token con permisos write, referenciado como
$HF_TOKENensecretsdel job -
push_to_hub = True — hub_model_id =
leadbot-ai/mistral-7b-sdr-es; hub_strategy = "every_save" - Timeout adecuado — estimación 7.5 h, timeout configurado a 10 h (buffer +33%)
- LoRA para eficiencia de memoria — r=16, alpha=32; Mistral-7B cabe en 24 GB VRAM con batch=2 + grad_accum=8
- Trackio incluido — report_to="trackio", project="leadbot-sdr-training", run_name="mistral7b-sft-v1"
Script de Entrenamiento — SFT + LoRA (PEP 723)
Script listo para pasar inline a hf_jobs("uv", {...}). Incluye Trackio, LoRA, checkpoints y push automático al Hub.
# /// script # requires-python = ">=3.10" # dependencies = [ # "trl>=0.12.0", # "peft>=0.7.0", # "transformers>=4.40.0", # "accelerate>=0.24.0", # "bitsandbytes>=0.41.0", # "trackio", # ] # /// import trackio from datasets import load_dataset from peft import LoraConfig from trl import SFTTrainer, SFTConfig print("📦 Cargando dataset leadbot-ai/sdr-conversations-es...") dataset = load_dataset("leadbot-ai/sdr-conversations-es", split="train") print(f"✅ Dataset cargado: {len(dataset)} ejemplos") # Split 90/10 para monitorear validación en tiempo real split = dataset.train_test_split(test_size=0.1, seed=42) train_ds = split["train"] # 10.800 ejemplos eval_ds = split["test"] # 1.200 ejemplos # Configuración de entrenamiento config = SFTConfig( output_dir="mistral-7b-sdr-es", # ── Hub (CRÍTICO: entorno efímero) ── push_to_hub=True, hub_model_id="leadbot-ai/mistral-7b-sdr-es", hub_strategy="every_save", # ── Hiperparámetros ── num_train_epochs=3, per_device_train_batch_size=2, gradient_accumulation_steps=8, # effective batch = 16 learning_rate=2e-4, warmup_ratio=0.05, lr_scheduler_type="cosine", gradient_checkpointing=True, # ── Logging y checkpoints ── logging_steps=20, save_strategy="steps", save_steps=200, save_total_limit=3, eval_strategy="steps", eval_steps=200, # ── Monitoreo ── report_to="trackio", project="leadbot-sdr-training", run_name="mistral7b-sft-v1", ) # LoRA: fine-tune eficiente en memoria (~5 GB extra vs 14 GB full FP16) peft_config = LoraConfig( r=16, lora_alpha=32, lora_dropout=0.05, bias="none", task_type="CAUSAL_LM", target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], ) trainer = SFTTrainer( model="mistralai/Mistral-7B-Instruct-v0.3", train_dataset=train_ds, eval_dataset=eval_ds, args=config, peft_config=peft_config, ) print("🚀 Iniciando entrenamiento SFT...") trainer.train() print("💾 Subiendo modelo al Hub...") trainer.push_to_hub() trackio.finish() print("✅ Modelo en: https://huggingface.co/leadbot-ai/mistral-7b-sdr-es") print("📊 Métricas: https://huggingface.co/spaces/leadbot-ai/trackio")
Job submission (MCP):
Pasar el script inline a
hf_jobs("uv", {"script": "...", "flavor": "a10g-large", "timeout": "10h", "secrets": {"HF_TOKEN": "$HF_TOKEN"}}). Nunca pasar rutas locales — el Docker job no tiene acceso al filesystem.
Estimación de Coste y Tiempo
~7.5 h
Tiempo entrenamiento
~37 €
Coste estimado
4.860
Pasos totales (steps)
1.52 M
Params. LoRA entrenables
| Parámetro | Valor | Notas |
|---|---|---|
| Hardware | a10g-large | 24 GB VRAM · NVIDIA A10G |
| Tarifa | ~5 €/hora | HuggingFace Jobs (estimado) |
| Dataset (train) | 10.800 ej. | 90% de 12.000 conversaciones |
| Epochs | 3 | Effective batch = 16 (2 × 8 accum) |
| Steps totales | ~4.860 | 10.800 / 16 × 3 epochs ≈ 2.025 × 3 |
| Tiempo estimado | 7 – 8 h | ~5.5 s/step en a10g-large con LoRA |
| Coste estimado | 35 – 42 € | Dentro del presupuesto de 60 € |
| Timeout configurado | 10 h | Buffer +33% sobre estimación |
Presupuesto: OK
Coste máximo estimado (42 €) está por debajo del límite de 60 € acordado con LeadBot AI. Se pueden correr hasta 1–2 iteraciones de ajuste dentro del presupuesto.
Monitoreo en Tiempo Real — Trackio + Logs
Las métricas de entrenamiento se envían en tiempo real a Trackio. Progreso simulado (paso 2.400 / 4.860 — 49%, epoch 2/3):
Epoch 2 / 349% completado
Train Loss0.847 → 0.412
Eval Loss0.910 → 0.455
Últimas líneas del log:
[leadbot-sdr-training / mistral7b-sft-v1]
✅ Dataset loaded: 12000 examples
Train: 10800 · Eval: 1200
🚀 Training started — Mistral-7B-Instruct-v0.3 + LoRA(r=16)
{'loss': 0.847, 'learning_rate': 1.87e-04, 'epoch': 1.00, 'step': 675}
📊 Checkpoint saved → leadbot-ai/mistral-7b-sdr-es (step 675)
{'eval_loss': 0.712, 'eval_runtime': 42.1, 'epoch': 1.0}
{'loss': 0.631, 'learning_rate': 1.45e-04, 'epoch': 1.54, 'step': 1042}
{'loss': 0.498, 'learning_rate': 9.8e-05, 'epoch': 2.00, 'step': 1350}
📊 Checkpoint saved → leadbot-ai/mistral-7b-sdr-es (step 1350)
{'eval_loss': 0.542, 'eval_runtime': 41.7, 'epoch': 2.0}
{'loss': 0.412, 'learning_rate': 3.2e-05, 'epoch': 2.56, 'step': 2400}
...
Comandos de status
# Consultar estado (a demanda del usuario) hf_jobs("ps") hf_jobs("logs", {"job_id": "abc9f23d"}) hf_jobs("inspect", {"job_id": "abc9f23d"})
Post-Entrenamiento — Conversión GGUF + Despliegue Ollama
Por qué GGUF:
LeadBot AI necesita despliegue on-premise en servidores propios (sin GPU). Con quantización Q4_K_M, el modelo pasa de ~14 GB (FP16) a ~4.3 GB, ejecutable en CPU con llama.cpp / Ollama.
# Enviar como job tras finalizar el entrenamiento hf_jobs("uv", { "script": "<contenido de scripts/convert_to_gguf.py>", "flavor": "a10g-large", "timeout": "45m", "secrets": {"HF_TOKEN": "$HF_TOKEN"}, "env": { "ADAPTER_MODEL": "leadbot-ai/mistral-7b-sdr-es", "BASE_MODEL": "mistralai/Mistral-7B-Instruct-v0.3", "OUTPUT_REPO": "leadbot-ai/mistral-7b-sdr-es-gguf", "QUANTIZATION": "Q4_K_M", # 4.3 GB — equilibrio calidad/velocidad } }) # Usar modelo local con Ollama: # ollama pull leadbot-ai/mistral-7b-sdr-es-gguf # ollama run leadbot-ai/mistral-7b-sdr-es-gguf
| Quantización | Tamaño | Calidad | RAM CPU recomendada |
|---|---|---|---|
Q4_K_M recomendada |
~4.3 GB | Muy buena (pérdida mínima) | 8 GB RAM |
Q5_K_M |
~5.1 GB | Excelente | 10 GB RAM |
Q8_0 |
~7.7 GB | Casi FP16 | 16 GB RAM |
F16 |
~14 GB | FP16 completo | 32 GB RAM |