logibot-slm — destilación en pequeño (taller, CPU)

Modelo de juguete de ~3,6 M de parámetros, entrenado en CPU como parte del taller de destilación del curso Tópicos Avanzados en Inteligencia Artificial 2 (Magíster, UAI). Un "profesor" genera pares pregunta-respuesta sobre logística de un centro de distribución ficticio (Austral Retail, Pudahuel: robots AMR, muelles, baterías, pasillos) y un "estudiante" pequeño aprende a imitarlos con LoRA.

No es un modelo de producción. Aprende a repetir el estilo y el contenido de un dominio ficticio con muy pocos datos. No sirve como asistente general ni para decisiones operacionales reales.

Qué es exactamente

Ítem Valor
Estudiante Llama diminuto inicializado desde cero: 4 capas, hidden_size 256, vocabulario BPE de 1.455 tokens, 3.647.232 parámetros (no es SmolLM2)
Profesor Simulado (modo offline --sin-internet del taller): 162 respuestas simuladas, costo US$ 0. Para este modelo no se usó ningún LLM comercial. La misma metodología también se corrió en línea (Colab) con un LLM de OpenAI como profesor; esa corrida es otro modelo, descrita en la sección «Corrida relacionada» más abajo
Método LoRA r=16, alpha=32, dropout=0.05, todos los proyectores de atención y MLP + embed_tokens y lm_head entrenables
Datos 80 pares pregunta-respuesta (200 pasos = 10 épocas × 20 lotes de 4). No se publica el dataset
Entrenamiento 10 épocas, lr 3e-3, semilla 42, CPU; pérdida 7,3471 → 0,0845

Resultados (examen fijo de 12 preguntas, nunca vistas en el entrenamiento)

Base sin entrenar Destilado
Nota media (1–10) 1,00 6,08
Aprobación (nota ≥ 7) 0 % 75 % (9 de 12)

La nota la pone el juez automático del taller en modo offline, que compara palabras clave con la respuesta de referencia (comentarios del tipo "Faltan ideas clave: …"); no es un evaluador humano ni un LLM. Con 12 preguntas el margen de error es grande. Fallas: 2 de las 12 respuestas obtuvieron nota 1 y otra nota 2 (por ejemplo, ante "heurística de relajación" responde sobre otro concepto del dominio). Curva de pérdida y notas por tema en resultados.png y entrenamiento_log.jsonl.

Reproducibilidad. Los 6,08 y 75 % son el resultado registrado por la corrida del taller. Al volver a generar las 12 respuestas con los pesos de este repo (mismo prompt, lotes de 8, decodificación determinista, repetition_penalty=1.15, 70 tokens; CPU, float32, transformers 5.7.0, peft 0.21.2) y puntuarlas con el mismo juez offline, se obtuvo nota media 3,17 y 1 de 12 aprobadas, y ninguna respuesta coincidió con el registro. No se determinó la causa. Lee el 6,08 como lo registrado por la corrida, no como una propiedad reproducida de estos pesos.

resultados

Corrida relacionada: SmolLM2 con profesor real (Colab)

La misma metodología se corrió en Colab (GPU A100 según el notebook del taller) con un LLM de OpenAI como profesor, datos en inglés y SmolLM2-135M-Instruct como estudiante. Resultado sobre 20 preguntas de examen: nota media 1,70 → 2,25 y aprobación 0 %; no aprendió el dominio. Su adaptador se publica como resultado negativo en adolfo123456/logibot-slm-smollm2-colab. Las cifras de esta card (6,08 y 75 %) corresponden solo al modelo diminuto con profesor simulado y no son comparables con esa corrida.

Cómo usarlo

El modelo se entrenó con este prompt de sistema y se evaluó con generación determinista y repetition_penalty=1.15. Sin esa penalización el modelo entra en bucles de repetición.

from transformers import AutoModelForCausalLM, AutoTokenizer

REPO = "adolfo123456/logibot-slm"
tok = AutoTokenizer.from_pretrained(REPO)
m = AutoModelForCausalLM.from_pretrained(REPO)           # modelo fusionado (base + LoRA)

msgs = [
    {"role": "system", "content": "Eres un asistente experto de operaciones y despacho para supervisores y robots AMR en el centro de distribución Pudahuel de Austral Retail. Responde de forma clara, técnica y concisa en español de Chile."},
    {"role": "user", "content": "¿Qué ventajas tiene el algoritmo A* para la zona de muelles?"},
]
ids = tok.apply_chat_template(msgs, add_generation_prompt=True, return_tensors="pt", return_dict=True)
out = m.generate(**ids, max_new_tokens=120, do_sample=False, repetition_penalty=1.15)
print(tok.decode(out[0][ids["input_ids"].shape[1]:], skip_special_tokens=True))

Solo el adaptador (peft)

El estudiante base es un modelo diminuto propio, no está en el Hub como modelo aparte: viene en la subcarpeta base_tiny/.

Se descarga el repo a una carpeta local y se carga desde ahí. No uses PeftModel.from_pretrained(base, REPO, subfolder="adapter") directo desde el Hub: en Windows peft arma la ruta remota con \ y no encuentra el archivo.

from huggingface_hub import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

local = snapshot_download("adolfo123456/logibot-slm")      # ≈ 34 MB
base = AutoModelForCausalLM.from_pretrained(f"{local}/base_tiny")
tok = AutoTokenizer.from_pretrained(f"{local}/base_tiny")
m = PeftModel.from_pretrained(base, f"{local}/adapter")

Estructura del repo

model.safetensors, config.json, tokenizer*   modelo fusionado (base_tiny + adaptador)
adapter/                                     adaptador LoRA (adapter_model.safetensors ≈ 4 MB + adapter_config.json)
base_tiny/                                   estudiante sin entrenar
resultados.png, entrenamiento_log.jsonl      evidencia del entrenamiento

Límites y uso responsable

  • Dominio y empresa ficticios; los datos son sintéticos y no contienen información personal.
  • Tamaño y datos mínimos: alucina, se corta a media frase y confunde conceptos cercanos.
  • Entrega académica. Sin garantías.
Downloads last month
-
Safetensors
Model size
3.65M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support