Llama2~bebe

El científico de OpenAI, Karpathy, pasó un fin de semana construyendo el proyecto estrella llama2.c. Con la ayuda de GPT-4, utilizó solo 500 líneas de código de lenguaje C para realizar el razonamiento del modelo de bebé Llama 2.

¿Alguna vez has pensado en inferir un modelo de bebé Llama 2 con solo lenguaje C?

¿No? ¡Tu puedes hacerlo ahora!

El pasado fin de semana, el científico de OpenAI, Andrej Karpathy, realizó un proyecto muy interesante: llama2.c.

La inspiración del proyecto viene del anterior proyecto estrella - llama.cpp

Primero, entrena un modelo Llama 2 más pequeño en PyTorch.

Luego, ejecute la inferencia en C puro con 500 líneas de código y sin dependencias.

El modelo preentrenado final (basado en TinyStories) puede generar muestras de historias a una velocidad de 18 tokens por segundo con fp32 en la CPU MacBook Air M1.

Una vez que se lanzó llama2.c, rápidamente obtuvo 1600 estrellas en GitHub y sigue escalando rápidamente.

Dirección del proyecto: https://github.com/karpathy/llama2.c

Por cierto, Karpathy también dijo: "¡Gracias a GPT-4 por ayudarme con mi lenguaje C desconocido!"

¡El científico de Nvidia, Jim Fan, dijo que GPT-4 ayudó a Karpathy a "criar" a un bebé Llama en lenguaje C! ¡Es asombroso!

Los internautas también dijeron que usar GPT-4 para construir llama2.c es el cruce definitivo.

Razonamiento en lenguaje C puro Llama 2

Tal vez Karpathy no esperaba que el potencial de este proyecto llama2.c fuera tan grande.

Sorprendentemente, puede hacer inferencias en estos modelos más pequeños (O(~10 MB)) a una velocidad interactiva de fp32 en una CPU de un solo subproceso.

Sin embargo, no lo he probado con el punto de control Meta LLama2 más pequeño (7B), espero que sea lento.

En dominios más estrechos, como las historias, uno puede hacer cosas interesantes con Transformers más pequeños, dijo Karpathy.

Por lo tanto, esta simple implementación en lenguaje C puro sigue siendo muy práctica, especialmente porque también es portátil.

Inmediatamente después, compiló con -O3 para aumentar la cantidad de tokens procesados ​​por segundo tok/s en la MacBook Air M1 de 18 a 98.

Por usar un método tan simple y poder ejecutar un modelo bastante grande (decenas de millones de parámetros) a una tasa interactiva alta, Karpathy expresó su gran placer——

"Parece que tendré que entrenar a un modelo más grande ahora".

Resulta que mi punto de control original compilado con -O3 se estaba ejecutando _mucho_ más rápido de lo que esperaba (100 tok/s) en el MacBook Air M1, por lo que ahora estoy entrenando un modelo de 44M mucho más grande y aún debería ejecutarse de forma interactiva. Quizá el modelo 7B Llama esté al alcance de la mano.

código fuente abierto

Actualmente, el código de llama2.c es de código abierto.

Con este código, puede entrenar la arquitectura LLM de Llama 2 desde cero en PyTorch, luego guardar los pesos como archivos binarios sin formato y cargarlos en un archivo C de ~500 líneas (run.c). Actualmente, el archivo usa fp32 para la inferencia en el modelo.

En el entorno de desarrollo de Linux en la nube, Karpathy utiliza un modelo con una dimensión de 288, 6 capas y 6 cabezas (aproximadamente 15 millones de parámetros) para realizar inferencias a una velocidad de aproximadamente 100 tok/s bajo fp32, que también es la misma que que en el M1 MacBook Air El funcionamiento es muy similar.

Siente la magia

Antes de ejecutar un modelo Baby Llama 2 en C, primero se requiere un punto de control del modelo.

Para esto, puede descargar este modelo de parámetros de 15M (alrededor de 58 MB) entrenado en el conjunto de datos de TinyStories y colocarlo en el directorio de punto de control predeterminado:

wget https://karpathy.ai/llama2c/model.bin -P out

Luego, compila y ejecuta el código C:

gcc -O3 -o run run.c -lm./run out/model.bin

Como puede ver, esto solo transmite el token original. Para leerlo, necesita ser convertido a texto.

Desafortunadamente, actualmente la traducción solo es posible con un decorador de funciones de Python simple (30 líneas de código):​​​​​​​​

pip install sentencepiecepython run_wrap.py

En un MacBook Air M1, funciona a unas 100 fichas por segundo, lo que no está nada mal para el código C super simple fp32 de un solo subproceso.

Salida de ejemplo:

Érase una vez un niño llamado Timmy. A Timmy le encantaba practicar deportes con sus amigos. Era muy bueno lanzando y atrapando pelotas. Un día, la mamá de Timmy le dio una camisa nueva para que la usara en una fiesta. Timmy pensó que era impresionante y le pidió a su mamá que le explicara para qué podría ser una camisa. "Una camiseta es como un traje especial para un partido de baloncesto", dijo su mamá. Timmy se alegró de escuchar eso y se puso su camisa nueva. Se sentía como un soldado que va al ejército y grita. A partir de ese día, Timmy usó su camiseta nueva cada vez que hacía deporte con sus amigos en la fiesta. Érase una vez una niña llamada Lily. Le encantaba jugar afuera con sus amigos. Un día, Lily y su amiga Emma estaban jugando con una pelota. Emma tiró la pelota demasiado fuerte y golpeó la cara de Lily. Lily se sintió avergonzada y no quiso jugar más. Emma le preguntó a Lily qué le pasaba y Lily le contó sobre su memoria. Emma le dijo a Lily que estaba avergonzada porque había lanzado la pelota demasiado fuerte. Lily se sintió mal logró tok/s: 98.746993347843922

Érase una vez un niño llamado Timmy. A Timmy le gusta practicar deportes con sus amigos. Es muy bueno lanzando y atrapando la pelota. Un día, la madre de Timmy le dio una camisa nueva para que la usara en una fiesta. A Timmy le pareció genial la camiseta y le preguntó a su madre si tenía algún propósito especial. "La camiseta es como un traje especial para un partido de baloncesto", dijo su madre. Timmy estaba muy feliz de escuchar eso, así que se puso la camisa nueva. Se sentía como un soldado que iba a unirse al ejército, gritando en voz alta. A partir de ese día, Timmy usaría la nueva camiseta cada vez que hiciera deporte con sus amigos en una fiesta. Érase una vez una niña llamada Lily. Le gusta jugar afuera con sus amigos. Un día, Lily y su amiga Emma estaban jugando a la pelota. Emma tiró la pelota demasiado fuerte y golpeó a Lily en la cara. Lily se sintió avergonzada y no quiso jugar más. Emma le preguntó a Lily qué pasó, Lily le contó su memoria. Emma le dijo a Lily que estaba avergonzada porque tiró la pelota muy fuerte. Lily se sintió mal. Tok/s: 98.746993347843922

guía del usuario

En teoría, debería ser posible cargar los pesos liberados por Meta, pero incluso para el modelo 7B más pequeño, usando este programa C simple de subproceso único para la inferencia, la estimación de la velocidad no será rápida.

Entonces, en este repositorio, nos enfocamos en un dominio de aplicación más estrecho y entrenamos la misma arquitectura desde cero.

Primero, descargue y presegmente algunos conjuntos de datos de origen, como TinyStories:​​​​​​​​

python tinystories.py downloadpython tinystories.py pretokenize

Luego, entrena el modelo:

python train.py

Consulte el script train.py para obtener más información sobre inicios especiales y anulaciones de hiperparámetros. Karpathy esperaba que la simple exploración de hiperparámetros condujera a un mejor modelo, por lo que no lo ajustó.

Si desea omitir el entrenamiento del modelo, simplemente descargue el modelo preentrenado de Karpathy y guárdelo en el directorio de salida, y puede hacer una demostración simple:

wget https://karpathy.ai/llama2c/model.bin -P out

Una vez que tenga el archivo model.bin, puede ejecutar la inferencia en C.

Primero, compila el código C:

gcc -O3 -o run run.c -lm

Entonces corre:

./run out/model.bin

Tenga en cuenta que aquí solo se emite el token SentencePiece. Para decodificar el token en texto, ejecute este script con un decorador simple: whaosoft  aiot  http://143ai.com

python run_wrap.py

Alternativamente, ejecute el script de inferencia de PyTorch para comparar (agregue model.ckpt al directorio /out):

python sample.py

Esto dará el mismo resultado. Se realizarán pruebas más detalladas en test_all.py, se ejecuta de la siguiente manera:

$ pytest

Actualmente, necesita dos archivos para realizar pruebas o muestras: el archivo model.bin y el archivo model.ckpt del entrenamiento anterior de PyTorch.

(Sobre cómo ejecutar pruebas sin descargar 200 MB de datos).

lista de quehaceres

- ¿Por qué SentencePiece no puede decodificar iterativamente correctamente?

- me gustaría poder eliminar el archivo run_wrap.py y usar directamente el código C para convertirlo en una cadena

-¿Es compatible con la función de consulta múltiple? ¿No parece ser muy útil para los modelos más pequeños que se ejecutan en la CPU?

- Está planeado admitir la inferencia de más de max_seq_len pasos, y se debe considerar el caché kv

- ¿Por qué la MFU es tan baja (solo alrededor del 10 %) cuando entreno en mi GPU A100 de 40 GB?

- Errores extraños con torch.compile y wandb al usar DDP

- Agregar mejores pruebas para reducir yolo

Discusión candente entre los internautas

Con el entusiasmo de llama2.c, los internautas compilaron llama2 en Emscripten y lo ejecutaron en la página web.

Lo compiló con Emscripten y modificó el código para predecir un token en cada renderizado. La página web carga automáticamente 50 MB de datos del modelo.

 

Además, agregó soporte para la destokenización.

Algunos internautas dijeron que, basándose en el éxito de llama.cpp, la industria parece estar moviéndose hacia proporcionar un código fuente separado para cada modelo lanzado, en lugar de un marco general como pytorch/tenorflow/onnxruntime. 

¿Cuál es el significado de llama2.c?

Un internauta dio un ejemplo vívido de la creación de un juego de computadora sobre una pequeña isla con 100 personas, todos tienen conciencia y llama2.c es su cerebro. Entonces puedes simular mil años de historia y ver qué pasa.

Referencias:

https://github.com/karpathy/llama2.c

Supongo que te gusta

Origin blog.csdn.net/qq_29788741/article/details/131906587
Recomendado
Clasificación