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:
- CMake
- Compilador de Clang C++
tar
para extraer archivos de Kaggle.
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, the
Variation 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.