Instructivo de Gemma C++ (gemma.cpp)

gemma.cpp es una implementación del tiempo de ejecución de inferencia de C++ pura y ligera del modelo de Gemma.

Para obtener más información sobre Gemma, consulta la tarjeta de modelo. Los pesos del modelo, incluidos los artefactos específicos de gemma.cpp, están disponibles en Kaggle.

¿Para quién es este proyecto?

Los motores de inferencia de LLM modernos son sistemas sofisticados, a menudo con capacidades a medida que se extienden más allá de los tiempos de ejecución de redes neuronales tradicionales. Esto presenta oportunidades para la investigación y la innovación a través del codiseño de algoritmos de alto nivel y la computación de bajo nivel. Sin embargo, hay una brecha entre los entornos de ejecución de inferencia C++ orientados a la implementación, que no están diseñados para la experimentación, y los frameworks de investigación del AA centrados en Python, que abstraen el procesamiento de bajo nivel a través de la compilación.

gemma.cpp proporciona una implementación minimalista de los modelos de Gemma 2B y 7B, con un enfoque en la simplicidad y la directa, en lugar de la generalidad completa. Esto está inspirado en las implementaciones de modelos de C++ integrados verticalmente, como ggml, llama.c y llama.rs.

gemma.cpp se orienta a casos de uso de experimentación y de investigación, en particular, a explorar el espacio de diseño de la inferencia de la CPU y los algoritmos de inferencia con SIMD portátil a través de la biblioteca Google Highway. Está diseñada para que sea fácil de incorporar en otros proyectos con dependencias mínimas y también se puede modificar con facilidad con una pequeña implementación de núcleo de LoC de aproximadamente 2,000 (junto con ~4,000 de utilidades de asistencia).

Para implementaciones perimetrales orientadas a la producción, recomendamos las rutas de implementación estándar con frameworks de Python maduros, como JAX, Keras, PyTorch y Transformers (todas las variaciones de modelos aquí).

Se aceptan contribuciones de la comunidad, tanto grandes como pequeñas. Este proyecto sigue los Lineamientos de la Comunidad de código abierto de Google.

Guía de inicio rápido

Para completar esta guía de inicio rápido, debes clonar o descargar gemma.cpp.

Requisitos del sistema

Antes de comenzar, debes tener instalado lo siguiente:

Paso 1: Obtén los pesos del modelo y el tokenizador de Kaggle

Visita la página del modelo de gema en Kaggle y selecciona “Variaciones del modelo”.

El menú desplegable Gemma C++. On this tab, theVariation incluye las siguientes opciones. Ten en cuenta que las opciones de pesos de bfloat16 tienen una mayor fidelidad, mientras que los pesos de punto flotante conmutados de 8 bits permiten una inferencia más rápida.

2B modelos ajustados con instrucciones (it) y previamente entrenados (pt):

Nombre del modelo Descripción
2b-it 2,000 millones de parámetros ajustados con instrucciones, bfloat16
2b-it-sfp Modelo de 2,000 millones de parámetros ajustado con instrucciones, punto flotante de 8 bits conmutado
2b-pt 2,000 millones de parámetros previamente entrenados, bfloat16
2b-pt-sfp Modelo previamente entrenado de 2,000 millones de parámetros, punto flotante de 8 bits conmutado

7,000 millones de modelos ajustados con instrucciones (it) y previamente entrenados (pt):

Nombre del modelo Descripción
7b-it 7,000 millones de parámetros ajustados con instrucciones, bfloat16
7b-it-sfp Modelo de 7,000 millones de parámetros ajustado con instrucciones, punto flotante de 8 bits conmutado
7b-pt 7 mil millones de parámetros previamente entrenados, bfloat16
7b-pt-sfp Modelo previamente entrenado de 7,000 millones de parámetros, punto flotante de 8 bits conmutado

NOTA: Recomendamos comenzar con 2b-it-sfp para comenzar a utilizar el servicio.

Paso 2: Extrae los archivos

Después de completar el formulario de consentimiento, la descarga debería proceder a recuperar un archivo tar archive.tar.gz. Extrae archivos de archive.tar.gz (este proceso puede tardar unos minutos):

tar -xf archive.tar.gz

Esto debería producir un archivo que contenga los pesos del modelo, como 2b-it-sfp.sbs, y un archivo de tokenizador (tokenizer.spm). Te recomendamos mover estos archivos a una ubicación de directorio conveniente (p.ej., el directorio build/ en este repositorio).

Paso 3: Compilación

El sistema de compilación usa CMake. Para compilar el entorno de ejecución de inferencia de gemma, crea un directorio de compilación y genera los archivos de compilación con cmake desde el directorio del proyecto de nivel superior:

(cd build && cmake ..)

Luego, ejecuta make para compilar el archivo ejecutable ./gemma:

cd build make -j [number of parallel threads to use] gemma

Por ejemplo, make -j 8 gemma. Si lo haces, ahora deberías tener un archivo ejecutable gemma en el directorio build/.

Paso 4: Ejecuta

Ahora puedes ejecutar gemma desde el directorio build/.

gemma tiene los siguientes argumentos obligatorios:

Argumento Descripción Valor de ejemplo
--model El tipo de modelo. 2b-it, 2b-pt, 7b-it, 7b-pt, ... (ver arriba)
--compressed_weights El archivo de pesos comprimidos. 2b-it-sfp.sbs, ... (ver arriba)
--tokenizer El nombre de archivo del tokenizador tokenizer.spm

gemma se invoca de la siguiente manera:

./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]

Ejemplo de invocación para la siguiente configuración:

  • Archivo de pesos comprimidos 2b-it-sfp.sbs (modelo 2B ajustado con instrucciones, punto flotante de 8 bits cambiado).
  • Archivo del tokenizador tokenizer.spm.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Uso

gemma tiene diferentes modos de uso, controlados por la marca de verbosidad.

Todos los modos de uso son interactivos, lo que activa la generación de texto cuando se ingresa un salto de línea.

Verbosidad Modo de uso Detalles
--verbosity 0 Mínimo Solo imprime el resultado de generación. Puede usarse como herramienta de CLI.
--verbosity 1 Predeterminado IU estándar de la terminal para el usuario.
--verbosity 2 Detallados Muestra información adicional del desarrollador y la depuración.

App de terminal interactiva

De forma predeterminada, la verbosidad se establece en 1, lo que activa una interfaz interactiva basada en la terminal cuando se invoca gemma con los argumentos necesarios:

$ ./gemma [...]
  __ _  ___ _ __ ___  _ __ ___   __ _   ___ _ __  _ __
 / _` |/ _ \ '_ ` _ \| '_ ` _ \ / _` | / __| '_ \| '_ \
| (_| |  __/ | | | | | | | | | | (_| || (__| |_) | |_) |
 \__, |\___|_| |_| |_|_| |_| |_|\__,_(_)___| .__/| .__/
  __/ |                                    | |   | |
 |___/                                     |_|   |_|

tokenizer                     : tokenizer.spm
compressed_weights            : 2b-it-sfp.sbs
model                         : 2b-it
weights                       : [no path specified]
max_tokens                    : 3072
max_generated_tokens          : 2048

*Usage*
  Enter an instruction and press enter (%Q quits).

*Examples*

-   Write an email to grandma thanking her for the cookies.
-   What are some historical attractions to visit around Massachusetts?
-   Compute the nth fibonacci number in javascript.
-   Write a standup comedy bit about WebGPU programming.

> What are some outdoorsy places to visit around Boston?

[ Reading prompt ] .....................

**Boston Harbor and Islands:**

*   **Boston Harbor Islands National and State Park:** Explore pristine beaches, wildlife, and maritime history.
*   **Charles River Esplanade:** Enjoy scenic views of the harbor and city skyline.
*   **Boston Harbor Cruise Company:** Take a relaxing harbor cruise and admire the city from a different perspective.
*   **Seaport Village:** Visit a charming waterfront area with shops, restaurants, and a seaport museum.

**Forest and Nature:**

*   **Forest Park:** Hike through a scenic forest with diverse wildlife.
*   **Quabbin Reservoir:** Enjoy boating, fishing, and hiking in a scenic setting.
*   **Mount Forest:** Explore a mountain with breathtaking views of the city and surrounding landscape.

...

Uso como herramienta de línea de comandos

Para usar el ejecutable gemma como herramienta de línea de comandos, puede ser útil crear un alias para gemma.cpp con argumentos especificados por completo:

alias gemma2b="~/gemma.cpp/build/gemma -- --tokenizer ~/gemma.cpp/build/tokenizer.spm --compressed_weights ~/gemma.cpp/build/2b-it-sfp.sbs --model 2b-it --verbosity 0"

Reemplaza las rutas de acceso anteriores por tus propias rutas a las rutas de acceso del modelo y del tokenizador desde la descarga.

A continuación, se muestra un ejemplo de cómo solicitar gemma con una entrada truncada (mediante un alias gemma2b como se definió anteriormente):

cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b

NOTA: El uso de gemma.cpp en la CLI es experimental y debe tener en cuenta las limitaciones de longitud del contexto.

El resultado del comando anterior debería verse de la siguiente manera:

$ cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b
[ Reading prompt ] ......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
The code defines two C++ structs, `ConfigGemma7B` and `ConfigGemma2B`, which are used for configuring a deep learning model.

**ConfigGemma7B**:

*   `seq_len`: Stores the length of the sequence to be processed. It's set to 7168.
*   `vocab_size`: Stores the size of the vocabulary, which is 256128.
*   `n_layers`: Number of layers in the deep learning model. It's set to 28.
*   `dim_model`: Dimension of the model's internal representation. It's set to 3072.
*   `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 3072 / 2.

**ConfigGemma2B**:

*   `seq_len`: Stores the length of the sequence to be processed. It's also set to 7168.
*   `vocab_size`: Size of the vocabulary, which is 256128.
*   `n_layers`: Number of layers in the deep learning model. It's set to 18.
*   `dim_model`: Dimension of the model's internal representation. It's set to 2048.
*   `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 2048 / 2.

These structs are used to configure a deep learning model with specific parameters for either Gemma7B or Gemma2B architecture.