Instructivo de Gemma C++ (gemma.cpp)

gemma.cpp es una versión liviana de C++ puro implementación del tiempo de ejecución de inferencia del modelo Gemma.

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

¿A quién está dirigido este proyecto?

Los motores modernos de inferencia de LLM son sistemas sofisticados, a menudo con que se extienden más allá de los tiempos de ejecución de redes neuronales tradicionales. Con este ofrece oportunidades de investigación e innovación a través del diseño en conjunto de proyectos de alto nivel como el aprendizaje automático y el procesamiento de bajo nivel. Sin embargo, existe una brecha entre de inferencia de C++ orientados a la implementación, que no están diseñados para experimentación y frameworks de investigación de AA centrados en Python, que abstraen procesamiento de bajo nivel a través de la compilación.

gemma.cpp ofrece una implementación minimalista de los modelos de Gemma 2B y 7B, centrándose en la simplicidad y la dirección, más que en la generalidad total. Este es inspiradas en implementaciones de modelos C++ integradas verticalmente, como ggml, llama.c y llama.rs.

gemma.cpp se orienta a los casos de uso de experimentación e investigación, en particular, a explorar el espacio de diseño de inferencia de CPU y algoritmos de inferencia SIMD portátil a través de la Highway biblioteca. Está diseñado para que sea fácil de incorporar en otros proyectos con con dependencias mínimas y también pueden modificarse fácilmente con un pequeño núcleo LoC de ~2,000. (junto con alrededor de 4,000 ubicaciones de servicios públicos de apoyo).

Para implementaciones perimetrales orientadas a la producción, recomendamos la implementación estándar con frameworks maduros de Python, como JAX, Keras, PyTorch y Los transformadores (todas las variantes del modelo aquí).

Se aceptan contribuciones de la comunidad grandes y pequeñas. Este proyecto sigue 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 haber instalado lo siguiente:

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

Visita la página del modelo gemma en Kaggle y selecciona “Model Variations”

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

2,000 millones de modelos ajustados para instrucciones (it) y previamente entrenados (pt):

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

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

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

NOTA: Te recomendamos que comiences con 2b-it-sfp para comenzar a usar el servicio.

Paso 2: Extrae los archivos

Tras completar el formulario de consentimiento, la descarga debería continuar para recuperar una tar archivo archive.tar.gz. Extrae archivos de archive.tar.gz (esto puede tómate 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) Es posible que quieras mover estos archivos a un una ubicación conveniente del directorio (p.ej., el directorio build/ de este repositorio).

Paso 3: Compila

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

(cd build && cmake ..)

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

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

Por ejemplo, make -j 8 gemma. Si esto funciona, deberías tener Se puede ejecutar 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, ... (consulta la sección anterior)
--compressed_weights El archivo de ponderaciones comprimidos. 2b-it-sfp.sbs, ... (ver arriba)
--tokenizer El nombre del 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 ajustado de 2,000 millones de instrucciones, de 8 bits punto flotante cambiado).
  • El 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 y activan la generación de texto entrada de línea nueva.

Verbosidad Modo de uso Detalles
--verbosity 0 Mínimo Solo imprime los resultados de generación. Adecuado como herramienta de la CLI.
--verbosity 1 Predeterminado IU de terminal estándar orientada al usuario
--verbosity 2 Detallado Muestra información adicional del desarrollador y de depuración.

App de terminal interactiva

De forma predeterminada, la verbosidad se establece en 1, lo que genera una ventana 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 hacer lo siguiente: crea un alias para gemma.cpp con argumentos completamente especificados:

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 anteriores por las tuyas a las del modelo y del tokenizador de la descarga.

Este es un ejemplo de cómo indicarle a gemma con una entrada truncada (con un gemma2b alias 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 la CLI de gemma.cpp es experimental y debe tener la longitud del contexto. limitaciones.

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.