2 puntos por GN⁺ 2024-12-13 | 1 comentarios | Compartir por WhatsApp
  • Implementación de un clon de ChatGPT

    • Este programa es una implementación de GPT-2 sin dependencias.
    • Carga las matrices de pesos desde archivos de TensorFlow y los archivos de BPE, y tokeniza la entrada con un codificador simple de pares de bytes.
    • Implementa un paquete básico de álgebra lineal, define la arquitectura del transformer, realiza la inferencia del transformer y destokeniza la salida con un decodificador BPE.
    • Está escrito en aproximadamente 3000 bytes de C.
    • Está optimizado de forma eficiente para que el modelo GPT-2 Small pueda responder en unos segundos en dispositivos modernos.
    • Implementa caché KV y algoritmos eficientes de multiplicación de matrices.
  • Estructura del programa

    • Biblioteca básica de matemáticas matriciales (700 bytes)
    • Multiplicación rápida de matrices (300 bytes)
    • Capas de red neuronal (300 bytes)
    • Modelo transformer (600 bytes)
    • Codificación de pares de bytes (400 bytes)
    • Entrada/salida (200 bytes)
    • Carga de pesos (300 bytes)
    • Carga de la codificación de pares de bytes (300 bytes)
  • Antecedentes sobre ChatGPT y los transformers

    • ChatGPT es una aplicación que permite conversar con un modelo de lenguaje.
    • GPT-4 es el modelo más reciente y es muy impresionante.
    • Este programa en C implementa el funcionamiento de ChatGPT usando GPT-2, un modelo limitado de 2019.
    • GPT-2 es un transformer que toma como entrada una secuencia de palabras de tamaño fijo y predice la siguiente palabra.
  • Explicación del código en C

    • Introducción a las matemáticas matriciales (700 bytes)

      • Las redes neuronales están compuestas por operaciones matriciales.
      • Se construye una biblioteca de matrices usando una definición mínima de matriz.
      • Se usan macros para extraer la lógica común en metarrutinas.
    • Multiplicación rápida de matrices (300 bytes)

      • La multiplicación de matrices básica se implementa usando tres bucles.
      • Gracias a cómo funcionan la memoria y la caché, leer y escribir repetidamente la misma memoria es más rápido.
    • Capas de red neuronal (300 bytes)

      • Se definen algunas capas especiales de red neuronal para escribir el transformer.
      • Se implementan funciones como la activación GELU y la función para establecer la subdiagonal necesaria para la atención causal.
    • Arquitectura transformer (600 bytes)

      • El transformer está implementado en 600 bytes.
      • En cada capa se calculan las claves, consultas y valores, se genera la matriz de atención y se combinan los resultados.
    • Codificación de pares de bytes (400 bytes)

      • Como los modelos de lenguaje requieren entradas de tamaño fijo, se usan fragmentos de palabras para generar tokens.
      • Una palabra dada se divide en caracteres individuales y se fusionan pares de tokens adyacentes.
    • Carga de pesos (300 bytes)

      • Los pesos de la red neuronal se cargan desde el disco.
      • Los pesos están serializados como números de punto flotante de 32 bits.
    • Carga de la codificación de pares de bytes (300 bytes)

      • El vocabulario de codificación de pares de bytes se carga desde el disco.
      • El formato del archivo está compuesto por una lista de codificaciones de pares de bytes.
  • Conclusión

    • Es posible comprimir décadas de avances en aprendizaje automático en unos pocos miles de bytes.
    • Es un ejemplo de una red neuronal simple que incluye todo excepto los pesos reales del modelo.

1 comentarios

 
GN⁺ 2024-12-13
Comentarios en Hacker News
  • Cuando usé GPT-2 para simular una conversación con un amigo, fue divertido y a veces sorprendentemente preciso. Me pregunto si el gran salto entre GPT-2 y GPT-3 se debe a un modelo más grande, más datos, o ambas cosas. RLHF hace una gran diferencia, pero incluso el modelo base de GPT-3 era muy útil si se le daban suficientes ejemplos

  • Es un buen ejemplo de lo simples que realmente pueden ser las redes neuronales. La inteligencia artificial es magia negra que usamos para ganar dinero

  • No he ejecutado el código, pero me impresionó su tamaño reducido. Los primeros programas de ELISA eran más grandes. En los últimos 4 años se ha logrado ajustar esto a nivel de bytes. Si alguien tiene una pista de dónde está la magia, me gustaría que la explicara. Me pregunto si está en la función GELU o en el modelo descargado mediante un script de bash

  • GPT-2 escribió mi cuento favorito. Enlace: The Princess, the Fairy Godmother, and the Chest

  • Me pregunto si GPT-2 fue realmente ajustado para poder usarse en chat. Si no fue así, creo que llamarlo un clon de ChatGPT es exagerado

  • LISP no siempre es mejor que C. Esta vez está permitido. Si se te pasó el enlace al código, aquí está: C-Chat-GPT-2

  • Me pregunto en qué hardware puede ejecutarse. También si puede usar los pesos cuantizados de huggingface, y para qué tipo de problemas o consultas está especialmente bien adaptado

  • Hoy en día puedes implementar fácilmente tu propio ChatGPT usando gptscript. Enlace: gptscript

  • No entiendo cómo los macros de C se parecen a las expresiones regulares. Los macros de C hacen coincidir palabras y las reemplazan por otro texto. Las expresiones regulares hacen coincidir texto con patrones relativamente complejos, y por sí mismas no hacen reemplazo de texto

  • Me pregunto si alguien lo ha ejecutado localmente para ver cómo es la salida que genera este GP2