Experimenta directamente cómo funciona un modelo de lenguaje con GuppyLM, un modelo de lenguaje pequeño
(github.com/arman-bd)- Un modelo de lenguaje ultracompacto con 9 millones de parámetros, diseñado para poder entrenarse en menos de 5 minutos con un solo notebook de Colab
- Desde la generación de datos hasta el tokenizador, el entrenamiento del modelo y la inferencia, todo el proceso se realiza en un solo entorno, con soporte para navegador, Colab y local
- Diseñado como “Guppy”, un personaje que imagina un entorno submarino, conversa con oraciones cortas y simples y pone el foco en la transparencia educativa
- Usa una arquitectura Transformer básica, mostrando con claridad la estructura central de un modelo de lenguaje sin técnicas complejas
- Proyecto open source con dataset público en HuggingFace y licencia MIT, para que cualquiera pueda experimentar y aprender
Resumen de GuppyLM
- GuppyLM es un modelo de lenguaje ultracompacto con unos 9 millones de parámetros, que conversa como el personaje pez “Guppy”
- Fue diseñado con el objetivo de ser un LLM que puedes entrenar tú mismo en menos de 5 minutos con un solo notebook de Colab, permitiendo realizar en un solo entorno todo el proceso, desde la generación de datos hasta el tokenizador, la estructura del modelo, el loop de entrenamiento y la inferencia
- Fue creado para que puedas experimentar directamente cómo funciona por dentro un modelo de lenguaje sin necesidad de grandes clústeres de GPU ni conocimientos especializados
- No genera textos largos como los modelos grandes, pero es un modelo educativo que muestra de forma transparente todo el proceso de entrada, aprendizaje de pesos y generación de salida
- Puede ejecutarse en navegador, Colab y entorno local, y tanto el dataset como el modelo están publicados en HuggingFace
Características del modelo
- GuppyLM es un personaje que piensa principalmente en un entorno submarino, como agua, temperatura, luz, vibración y comida
- Usa oraciones cortas y en minúsculas, y no entiende conceptos abstractos humanos como dinero o política
- Tiene una personalidad amigable, curiosa y simple
- Los datos de entrenamiento están compuestos por 60 temas y 60 mil muestras de diálogo sintéticas, y puede entrenarse en unos 5 minutos en una sola GPU
- Gracias a su tamaño reducido, también permite inferencia en el navegador basada en WebAssembly
Arquitectura
- Cantidad de parámetros: 8.7M
- Cantidad de capas: 6
- Dimensión oculta: 384
- Cabezas de atención: 6
- Dimensión FFN: 768 (ReLU)
- Tamaño del vocabulario: 4,096 (BPE)
- Longitud máxima de secuencia: 128 tokens
- Normalización: LayerNorm
- Embeddings posicionales: entrenables
- LM head: comparte pesos con el embedding
- Usa una estructura Transformer básica sin técnicas complejas como GQA, RoPE, SwiGLU o early exit
Personalidad y temas de conversación
- Guppy conversa con frases cortas, expresiones en minúsculas y un pensamiento centrado en las sensaciones
- Reacciona a diversos temas como comida, agua, luz, pecera, burbujas, reflejos, la superficie y el mundo exterior
- Sus 60 temas principales incluyen saludos, emociones, temperatura, comida, luz, agua, pecera, ruido, soledad, sueños, estaciones, chistes, amor, salud y TV
Cómo ejecutarlo y usarlo
-
Ejecutarlo en el navegador
- Realiza inferencia local basada en WebAssembly
- Descarga un modelo ONNX cuantizado de unos 10MB y puede ejecutarse sin servidor ni API key
-
Chatear en Colab
- Descarga el modelo preentrenado desde HuggingFace y lo usa con una interfaz interactiva
- Si ejecutas todas las celdas, puedes empezar a chatear de inmediato
-
Entrenar en Colab
- Configura el runtime en T4 GPU y ejecuta todas las celdas
- Realiza automáticamente la descarga del dataset, el entrenamiento del tokenizador, el entrenamiento del modelo y las pruebas
- El modelo resultante puede subirse a HuggingFace o guardarse localmente
-
Chatear en entorno local
- Instálalo con
pip install torch tokenizersy ejecútalo con el comandopython -m guppylm chat - Si la conversación se alarga, la calidad baja por el límite de 128 tokens
- También soporta un modo donde recibe un solo prompt, responde y termina
- Instálalo con
Dataset
- Usa el dataset de HuggingFace arman-bd/guppylm-60k-generic
- Cantidad de muestras: 60,000 (entrenamiento 57K / prueba 3K)
- Formato:
{"input": "...", "output": "...", "category": "..."} - Cantidad de categorías: 60
- Método de generación: datos sintéticos basados en plantillas
- Con unas 60 plantillas, 30 objetos de pecera, 17 tipos de comida y 25 combinaciones de actividades, genera aproximadamente 16,000 salidas únicas
Estructura del proyecto
-
guppylm/
config.py: hiperparámetros del modelo y del entrenamientomodel.py: modelo Transformer básicodataset.py: carga de datos y procesamiento por lotestrain.py: loop de entrenamiento (cosine LR, AMP)generate_data.py: generación de datos de conversación para 60 temaseval_cases.py: casos de pruebaprepare_data.py: preparación de datos y entrenamiento del tokenizadorinference.py: interfaz de chat
-
tools/
make_colab.py: generación de notebook de Colabexport_onnx.py: exportación a modelo ONNX (cuantización uint8)export_dataset.py: subida del dataset a HuggingFacedataset_card.md: descripción del dataset para HuggingFace
-
docs/
index.html: demo en navegador (ONNX + WASM)download.sh: descarga del modelo y del tokenizadormodel.onnx: modelo cuantizado (~10MB)tokenizer.json: tokenizador BPEguppy.png: imagen del logo
Decisiones de diseño
-
Eliminación del system prompt:Como a un modelo de 9M le cuesta seguir instrucciones condicionales, en lugar de usar el mismo prompt en todas las muestras, la personalidad se integró directamente en los pesos
- Esto ahorra unos 60 tokens durante la inferencia
- Conversación de un solo turno: por la limitación de 128 tokens, la calidad baja después de 3 o 4 turnos
- Aunque encaja con el concepto de la ‘memoria de pez dorado’ de Guppy, el modo de un solo turno es el más estable
- Se mantiene el Transformer básico: GQA, SwiGLU, RoPE y early exit no mejoran la calidad a escala 9M y solo aumentan la complejidad
- La combinación de atención estándar + ReLU FFN + LayerNorm ofrece rendimiento suficiente
- Uso de datos sintéticos: para mantener una personalidad consistente del personaje, se adoptó un enfoque de generación de datos basada en plantillas
Licencia
- Licencia MIT
1 comentarios
Comentarios en Hacker News
Me pregunto si existe documentación para este proyecto
El código en sí parece una de las implementaciones más simples de un modelo de lenguaje (no tan) grande, pero no es fácil de entender para desarrolladores que no estén familiarizados con multi-head attention, ReLU FFN, LayerNorm, positional embedding, etc.
Este proyecto tiene un carácter educativo parecido a Minix. Así como Minix se usó como herramienta para aprender diseño de sistemas operativos, también sería un buen enfoque que los estudiantes aprendan diseño de LLM agregando funciones a GuppyLM
Me pregunto en qué se diferencia este proyecto de microgpt o minGPT de Andrej Karpathy
En bbycroft.net/llm hay un ejemplo de visualización 3D de una pequeña capa de LLM. Ayuda muchísimo a entender cómo funciona por dentro
La discusión relacionada también se puede ver aquí
De verdad es excelente como introducción a los LLM
Hace tiempo hice mi propio modelo basado en Paradise Lost de Milton
Referencia: wvrk.org/works/milton
Esto probablemente pasa porque todos los datos de entrenamiento están en minúsculas
Aun así, la personalidad de la respuesta sigue muy viva
Me da curiosidad si sería posible crear un LLM entrenado únicamente en Toki Pona
Consulta la wiki de Toki Pona
Estoy trabajando en un proyecto donde varios agentes LLM comparten un mismo mundo virtual e interactúan de forma autónoma
Lo sorprendente es que la existencia del ‘mundo’ influye mucho en el comportamiento del modelo
Incluso con el mismo modelo y el mismo prompt, si cambian factores del entorno como restricciones de recursos, otros agentes o memoria persistente, el resultado cambia por completo
Nos concentramos demasiado en optimizar el modelo en sí, y pensamos muy poco en su entorno de operación
Siento que por fin salió un LLM honesto sobre el mundo
La respuesta “el sentido de la vida es la comida” me parece menos equivocada que las respuestas de modelos 10.000 veces más grandes
La idea es buena, pero los ejemplos parecen estar copiados tal cual del conjunto de entrenamiento
Me pregunto cómo responde ante consultas desconocidas
El objetivo de este proyecto es demostrar cómo funciona un LLM
Gran trabajo. Gracias por compartirlo
Pero ahora me pregunto si de verdad los LLM ya se sienten ‘menos misteriosos’
Sigue siendo sorprendente que algo así salga de estadística simple y una cantidad masiva de cómputo