46 puntos por GN⁺ 23 일 전 | 1 comentarios | Compartir por WhatsApp
  • 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 tokenizers y ejecútalo con el comando python -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

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 entrenamiento
    • model.py: modelo Transformer básico
    • dataset.py: carga de datos y procesamiento por lotes
    • train.py: loop de entrenamiento (cosine LR, AMP)
    • generate_data.py: generación de datos de conversación para 60 temas
    • eval_cases.py: casos de prueba
    • prepare_data.py: preparación de datos y entrenamiento del tokenizador
    • inference.py: interfaz de chat
  • tools/

    • make_colab.py: generación de notebook de Colab
    • export_onnx.py: exportación a modelo ONNX (cuantización uint8)
    • export_dataset.py: subida del dataset a HuggingFace
    • dataset_card.md: descripción del dataset para HuggingFace
  • docs/

    • index.html: demo en navegador (ONNX + WASM)
    • download.sh: descarga del modelo y del tokenizador
    • model.onnx: modelo cuantizado (~10MB)
    • tokenizer.json: tokenizador BPE
    • guppy.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

 
GN⁺ 23 일 전
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

    • También podría ser una buena idea meter el código en un LLM y conversar sobre él
  • Me pregunto en qué se diferencia este proyecto de microgpt o minGPT de Andrej Karpathy

    • Aún no los he comparado, pero agradezco la sugerencia. Voy a revisar ambos proyectos
    • La comparación no es lo importante. Esto no es un producto, sino un excelente proyecto experimental
  • 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í

    • ¡Está bastante genial! Voy a revisarlo con más profundidad
    • No está directamente relacionado, pero el proyecto está muy bueno. Estaría bien agregar un poco más de UI
    • Es una visualización interesante
  • 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

    You> hello
    Guppy> hi. did you bring micro pellets.
    You> HELLO
    Guppy> i don't know what it means but it's mine.
    
    • ¡Buen hallazgo! Parece que no hay tokens en mayúsculas en el tokenizador
      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

    • Pero no hay suficientes datos de entrenamiento. La clave de los LLM son los enormes volúmenes de datos y recursos de cómputo
  • 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

    • De hecho, quizá sea una mejor interpretación que esa famosa respuesta
    • El propósito de la vida es la reproducción. La comida es solo el medio; todos los recursos y características existen para ayudar al apareamiento
  • La idea es buena, pero los ejemplos parecen estar copiados tal cual del conjunto de entrenamiento
    Me pregunto cómo responde ante consultas desconocidas

    • Casi no puede responder. Con 9M parámetros, la capacidad es muy limitada
      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