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:
- 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 gemma en Kaggle y selecciona “Model Variations”
El menú desplegable de Gemma C++
. On this tab, the
Variation` 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.