Clon de ChatGPT implementado en C de 3000 bytes basado en GPT-2 (2023)
(nicholas.carlini.com)-
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
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