🤗 HuggingFace Jobs  ·  IA-Ingeniería-MLOps

Fine-Tuning Mistral-7B para SDR en Español

Plan completo de entrenamiento SFT + LoRA para LeadBot AI — 12.000 conversaciones de ventas en español sobre a10g-large con push automático al Hub y export GGUF para Ollama.

Modelo base mistralai/Mistral-7B-Instruct-v0.3
Método SFT + LoRA (r=16)
Hardware a10g-large · 24 GB VRAM
Duración est. ~7.5 h (timeout 10 h)
Coste est. ~37–42 €
Checklist Pre-Entrenamiento
  • Dataset validadoleadbot-ai/sdr-conversations-es inspeccionado con dataset inspector: resultado ✓ READY para SFT (formato messages: system/user/assistant)
  • HF_TOKEN configurado — token con permisos write, referenciado como $HF_TOKEN en secrets del 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.

python · train_sft_leadbot.py
# /// 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.
python · convert_to_gguf_leadbot.py
# 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ónTamañoCalidadRAM 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