Tutorial su Gemma C++ (gemma.cpp)

gemma.cpp è un'implementazione di runtime dell'inferenza in C++ puro leggera del modello Gemma.

Per ulteriori informazioni su Gemma, consulta la scheda del modello. I pesi del modello, inclusi gli elementi specifici di gemma.cpp, sono disponibili su Kaggle.

A chi è rivolto questo progetto?

I moderni motori di inferenza LLM sono sistemi sofisticati, spesso con funzionalità personalizzate che vanno oltre i runtime delle reti neurali tradizionali. Ciò offre opportunità di ricerca e innovazione tramite la progettazione congiunta di algoritmi di alto livello e calcoli di basso livello. Tuttavia, esiste una differenza tra i runtime di inferenza C++ orientati al deployment, che non sono progettati per la sperimentazione, e i framework di ricerca ML incentrati su Python, che astraggono i calcoli a basso livello tramite la compilazione.

gemma.cpp fornisce un'implementazione minimalista dei modelli Gemma 2B e 7B, volgendo l'attenzione su semplicità e immediatezza anziché sulla piena generalità. È stato sviluppato ispirandosi a implementazioni di modelli C++ integrate verticalmente come ggml, llama.c e llama.rs.

gemma.cpp ha come target i casi d'uso di sperimentazione e ricerca, in particolare, esplora lo spazio di progettazione degli algoritmi di inferenza e inferenza della CPU che utilizzano SIMD portatile tramite la libreria Google Highway. È progettato per essere incorporato facilmente in altri progetti con dipendenze minime e anche facilmente modificabile con una piccola implementazione di base di circa 2000 LOC (oltre a circa 4000 LOC di utilità di supporto).

Per i deployment edge in produzione, consigliamo percorsi di deployment standard che utilizzano framework Python maturi come JAX, Keras, PyTorch e Transformers (tutte le varianti del modello qui).

Sono benvenuti contributi della community di qualsiasi dimensione. Questo progetto rispetta le Norme della community di Google per le risorse open source.

Guida rapida

Per completare questa guida rapida, devi clonare o scaricare gemma.cpp.

Requisiti di sistema

Prima di iniziare, devi aver installato:

Passaggio 1: ottieni i pesi del modello e lo tokenizer da Kaggle

Visita la pagina del modello gemma su Kaggle e seleziona "Model Variations

Il menu a discesa Gemma C++. On this tab, theVariazione include le seguenti opzioni. Tieni presente che le opzioni di pesi bfloat16 hanno una fedeltà superiore, mentre i pesi a virgola mobile con interruzioni di 8 bit consentono un'inferenza più rapida.

Modelli 2B ottimizzati per le istruzioni (it) e preaddestrati (pt):

Nome modello Descrizione
2b-it Modello ottimizzato per le istruzioni con 2 miliardi di parametri, bfloat16
2b-it-sfp Modello ottimizzato per le istruzioni con 2 miliardi di parametri, virgola mobile con commutazione a 8 bit
2b-pt Modello preaddestrato con 2 miliardi di parametri, bfloat16
2b-pt-sfp Modello preaddestrato con 2 miliardi di parametri, virgola mobile con commutazione a 8 bit

Modelli con istruzioni ottimizzate (it) e preaddestrati (pt) da 7 miliardi di istruzioni:

Nome modello Descrizione
7b-it Modello ottimizzato per le istruzioni con 7 miliardi di parametri, bfloat16
7b-it-sfp Modello ottimizzato per le istruzioni con 7 miliardi di parametri, virgola mobile con commutazione a 8 bit
7b-pt Modello preaddestrato con 7 miliardi di parametri, bfloat16
7b-pt-sfp Modello preaddestrato con 7 miliardi di parametri, virgola mobile con commutazione a 8 bit

NOTA: consigliamo di iniziare con 2b-it-sfp per iniziare a utilizzare il servizio.

Passaggio 2: estrai i file

Dopo aver compilato il modulo di consenso, il download dovrebbe procedere con il recupero di un file dell'archivio tar archive.tar.gz. Estrai i file da archive.tar.gz (l'operazione può richiedere alcuni minuti):

tar -xf archive.tar.gz

Dovresti ottenere un file contenente le ponderazioni del modello, ad esempio 2b-it-sfp.sbs, e un file del tokenizzatore (tokenizer.spm). Ti consigliamo di spostare questi file in una posizione della directory comoda (ad es. la directory build/ in questo repository).

Passaggio 3: crea

Il sistema di compilazione utilizza CMake. Per compilare il runtime di inferenza Gemma, crea una directory di compilazione e genera i file di compilazione utilizzando cmake dalla directory di progetto di primo livello:

(cd build && cmake ..)

Quindi, esegui make per compilare l'eseguibile ./gemma:

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

Ad esempio, make -j 8 gemma. Se l'operazione va a buon fine, ora dovresti avere un file eseguibile gemma nella directory build/.

Passaggio 4: Esegui

Ora puoi eseguire gemma dalla directory build/.

gemma ha i seguenti argomenti obbligatori:

Argomento Descrizione Valore di esempio
--model Il tipo di modello. 2b-it, 2b-pt, 7b-it, 7b-pt, ... (vedi sopra)
--compressed_weights Il file dei pesi compresso. 2b-it-sfp.sbs, ... (vedi sopra)
--tokenizer Il nome del file dello tokenizer. tokenizer.spm

gemma viene richiamato come:

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

Chiamata di esempio per la seguente configurazione:

  • File delle ponderazioni compresse 2b-it-sfp.sbs (modello ottimizzato per le istruzioni da 2 miliardi, virgola mobile con opzione di trasferimento a 8 bit).
  • File del tokenizzatore tokenizer.spm.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Utilizzo

gemma ha diverse modalità di utilizzo, controllate dal flag di livello di dettaglio.

Tutte le modalità di utilizzo sono interattive e attivano la generazione di testo al successivo input di riga.

Preferenze di lettura Modalità di utilizzo Dettagli
--verbosity 0 Minimo Stampa solo l'output della generazione. Adatto come strumento a riga di comando.
--verbosity 1 Predefinito Interfaccia utente del terminale rivolta agli utenti standard.
--verbosity 2 Dettagliato Mostra informazioni aggiuntive per gli sviluppatori e il debug.

App terminale interattivo

Per impostazione predefinita, il livello di dettaglio è impostato su 1, per cui viene visualizzata un'interfaccia interattiva basata su terminale quando gemma viene richiamato con gli argomenti richiesti:

$ ./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.

...

Utilizzo come strumento a riga di comando

Per utilizzare l'eseguibile gemma come strumento a riga di comando, può essere utile creare un alias per gemma.cpp con gli argomenti completamente specificati:

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"

Sostituisci i percorsi precedenti con i percorsi del modello e del tokenizzatore dal download.

Ecco un esempio di richiesta di gemma con un input troncato (utilizzando un alias gemma2b come definito sopra):

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

NOTA: l'utilizzo della CLI di gemma.cpp è sperimentale e deve tenere conto delle limitazioni della lunghezza del contesto.

L'output del comando precedente dovrebbe essere simile al seguente:

$ 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.