gemma.cpp es una implementación ligera del entorno de ejecución de inferencia de C++ puro 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énes es este proyecto?
Los motores de inferencia de LLM modernos son sistemas sofisticados, a menudo con capacidades personalizadas que se extienden más allá de los tiempos de ejecución tradicionales de las redes neuronales. Con esto, surgen oportunidades de investigación e innovación a través del codiseño de algoritmos de alto nivel y procesamiento de bajo nivel. Sin embargo, existe 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 de 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 Gemma 2B y 7B, que se enfoca en la simplicidad y la directividad en lugar de la generalidad completa. Esto se inspira en 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 e investigación, en particular, a la exploración del espacio de diseño de la inferencia de CPU y los algoritmos de inferencia con SIMD portátil a través de la biblioteca Google Highway. Se diseñó para que sea fácil incorporarlo en otros proyectos con dependencias mínimas y también para que se pueda modificar fácilmente con una pequeña implementación de núcleo de aproximadamente 2,000 LoC (junto con aproximadamente 4,000 LoC de utilidades de asistencia).
Para las implementaciones de Edge orientadas a la producción, recomendamos las rutas de acceso de implementación estándar con frameworks de Python maduros, como JAX, Keras, PyTorch y Transformers (todas las variaciones de modelos están aquí).
Se aceptan contribuciones de la comunidad, grandes y pequeñas. Este proyecto cumple con 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 haber instalado lo siguiente:
- CMake
- Compilador C++ de Clang
tar
para extraer archivos de Kaggle.
Paso 1: Obtén los pesos del modelo y el analizador de texto de Kaggle
Visita la página del modelo de Gemma en Kaggle y selecciona "Model Variations
El menú desplegable
. On this tab, the
Variation` de Gemma C++ incluye las siguientes opciones: Ten en cuenta que las opciones de pesos bfloat16 tienen una mayor fidelidad, mientras que los pesos de punto flotante conmutados de 8 bits permiten una inferencia más rápida.
Modelos 2B ajustados a la instrucción (it
) y previamente entrenados (pt
):
Nombre del modelo | Descripción |
---|---|
2b-it |
Modelo ajustado para instrucciones de 2,000 millones de parámetros, bfloat16 |
2b-it-sfp |
Modelo ajustado para instrucciones de 2,000 millones de parámetros, punto flotante con interruptor 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 con interruptor de 8 bits |
Modelos 7B ajustados a la instrucción (it
) y previamente entrenados (pt
):
Nombre del modelo | Descripción |
---|---|
7b-it |
Modelo ajustado para instrucciones de 7,000 millones de parámetros, bfloat16 |
7b-it-sfp |
Modelo ajustado para instrucciones de 7,000 millones de parámetros, punto flotante con interruptor 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 con interruptor de 8 bits |
NOTA: Te recomendamos que comiences con 2b-it-sfp
para comenzar a usar la función.
Paso 2: Extrae archivos
Después de completar el formulario de consentimiento, la descarga debería continuar para recuperar un archivo de almacenamiento archive.tar.gz
. Extrae archivos de archive.tar.gz
(esto puede tardar unos minutos):
tar -xf archive.tar.gz
Esto debería producir un archivo que contenga pesos del modelo, como 2b-it-sfp.sbs
, y un archivo de analizador (tokenizer.spm
). Te recomendamos que muevas estos archivos a una ubicación de directorio conveniente (p.ej., el directorio build/ de 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 de nivel superior del proyecto:
(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 se realiza correctamente, 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 |
Es el archivo de pesos comprimido. | 2b-it-sfp.sbs , … (consulta arriba) |
--tokenizer |
Es 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 a 2,000 millones de instrucciones, punto flotante con cambio de 8 bits) - Archivo de 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 cuando se ingresa una línea nueva.
Verbosidad | Modo de uso | Detalles |
---|---|---|
--verbosity 0 |
Mínimo | Solo imprime el resultado de la generación. Adecuada como herramienta de la CLI. |
--verbosity 1 |
Predeterminada | IU estándar de la terminal para el usuario. |
--verbosity 2 |
Detallado | Muestra información adicional para desarrolladores y de depuración. |
App de terminal interactiva
De forma predeterminada, la verbosidad se establece en 1, lo que muestra una interfaz interactiva basada en la terminal cuando se invoca gemma
con los argumentos obligatorios:
$ ./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 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 de acceso anteriores por tus propias rutas de acceso al modelo y al analizador de la descarga.
Este es un ejemplo de cómo solicitar gemma
con una entrada truncada (con 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 la CLI de gemma.cpp es experimental y debe tener en cuenta las limitaciones de la 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.