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:
- CMake
- Compilatore C++ Clang
tar
per estrarre gli archivi da Kaggle.
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, the
Variazione 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.