gemma.cpp ist eine einfache reine C++-Inferenzlaufzeitimplementierung des Gemma-Modells.
Weitere Informationen zu Gemma finden Sie auf der Modellkarte. Modellgewichte, einschließlich gemma.cpp-spezifischer Artefakte, sind auf Kaggle verfügbar.
Für wen ist dieses Projekt gedacht?
Moderne LLM-Inferenzengines sind ausgefeilte Systeme, die oft maßgeschneiderte Funktionen bieten, die über herkömmliche neuronale Netzwerklaufzeiten hinausgehen. Dies eröffnet Möglichkeiten für Forschung und Innovation durch das Co-Design von Algorithmen auf höherer Ebene und Berechnungen auf niedriger Ebene. Es gibt jedoch eine Lücke zwischen Bereitstellungsorientierten C++-Inferenzlaufzeiten, die nicht für Experimente konzipiert sind, und Python-zentrierten ML-Forschungsframeworks, die Low-Level-Berechnungen durch Kompilierung abstrahieren.
gemma.cpp bietet eine minimalistische Implementierung der Gemma 2B- und 7B-Modelle, die sich auf Einfachheit und Direktheit statt auf vollständige Allgemeingültigkeit konzentriert. Dieser Ansatz wurde von vertikal integrierten C++-Modellimplementierungen wie ggml, llama.c und llama.rs inspiriert.
gemma.cpp richtet sich an Experimente und Forschungsanwendungsfälle – insbesondere an die Erforschung des Designraums von CPU-Inferenz- und Inferenzalgorithmen mithilfe von portabler SIMD über die Google Highway-Bibliothek. Es soll einfach in andere Projekte mit minimalen Abhängigkeiten eingebettet und mit einer kleinen Kernimplementierung von etwa 2.000 LOC (zusammen mit etwa 4.000 LOC unterstützender Dienstprogramme) leicht modifizierbar sein.
Für produktionsorientierte Edge-Bereitstellungen empfehlen wir Standardbereitstellungspfade mit ausgereiften Python-Frameworks wie JAX, Keras, PyTorch und Transformers (alle Modellvarianten finden Sie hier).
Große und kleine Beiträge von Communitymitgliedern sind willkommen. Dieses Projekt entspricht den Open-Source-Community-Richtlinien von Google.
Kurzanleitung
Für diese Kurzanleitung müssen Sie gemma.cpp klonen oder herunterladen.
Systemanforderungen
Bevor Sie beginnen, sollten Sie Folgendes installiert haben:
- CMake
- Clang C++-Compiler
tar
zum Extrahieren von Archiven aus Kaggle.
Schritt 1: Modellgewichte und Tokenizer von Kaggle abrufen
Rufen Sie die Seite des Gemma-Modells auf Kaggle auf und wählen Sie „Modellvarianten
Das Drop-down-Menü „Gemma C++
. On this tab, the
Variation“ enthält die folgenden Optionen. Bfloat16-Gewichtsoptionen bieten eine höhere Genauigkeit, während 8‑Bit-geschaltete Gleitkommagewichte eine schnellere Inferenz ermöglichen.
Für 2B-Modelle, die anhand von Anleitungen optimiert (it
) und vorab trainiert (pt
) wurden:
Modellname | Beschreibung |
---|---|
2b-it |
Modell mit 2 Milliarden Parametern, auf Anweisungen abgestimmt, bfloat16 |
2b-it-sfp |
Ein auf Anweisungen abgestimmtes Modell mit 2 Milliarden Parametern, 8-Bit-geschaltetes Gleitkomma |
2b-pt |
Vortrainiertes Modell mit 2 Milliarden Parametern, bfloat16 |
2b-pt-sfp |
Vortrainiertes Modell mit 2 Milliarden Parametern, 8-Bit-geschaltetes Gleitkomma |
Für die Anleitung optimierte (it
) und vorab trainierte (pt
) Modelle mit 7 Milliarden Parametern:
Modellname | Beschreibung |
---|---|
7b-it |
Anweisungsoptimiertes Modell mit 7 Milliarden Parametern, bfloat16 |
7b-it-sfp |
Anweisungsoptimiertes Modell mit 7 Milliarden Parametern, 8-Bit-geschaltetes Gleitkomma |
7b-pt |
Vortrainiertes Modell mit 7 Milliarden Parametern, bfloat16 |
7b-pt-sfp |
Vortrainiertes Modell mit 7 Milliarden Parametern, 8-Bit-Gleitkomma |
HINWEIS: Wir empfehlen, mit 2b-it-sfp
zu beginnen.
Schritt 2: Dateien extrahieren
Nachdem Sie das Einwilligungsformular ausgefüllt haben, sollte der Download fortgesetzt werden, um eine Tar-Archivdatei archive.tar.gz
abzurufen. Extrahieren Sie die Dateien aus archive.tar.gz
. Das kann einige Minuten dauern:
tar -xf archive.tar.gz
Dadurch sollte eine Datei mit Modellgewichten wie 2b-it-sfp.sbs
und eine Tokenizerdatei (tokenizer.spm
) erstellt werden. Sie können diese Dateien an einen geeigneten Speicherort verschieben, z.B. in das Verzeichnis „build/“ in diesem Repository.
Schritt 3: Erstellen
Das Build-System verwendet CMake. Erstellen Sie zum Erstellen der Gemma-Inferenzlaufzeit ein Build-Verzeichnis und generieren Sie die Build-Dateien mit cmake
aus dem übergeordneten Projektverzeichnis:
(cd build && cmake ..)
Führen Sie dann make
aus, um die ausführbare Datei ./gemma
zu erstellen:
cd build
make -j [number of parallel threads to use] gemma
Beispiel: make -j 8 gemma
. Wenn der Vorgang erfolgreich war, sollte jetzt eine ausführbare Datei gemma
im Verzeichnis build/
vorhanden sein.
Schritt 4: Ausführen
Sie können gemma
jetzt im Verzeichnis build/
ausführen.
gemma
hat die folgenden erforderlichen Argumente:
Argument | Beschreibung | Beispielwert |
---|---|---|
--model |
Der Modelltyp. | 2b-it , 2b-pt , 7b-it , 7b-pt , ... (siehe oben) |
--compressed_weights |
Die komprimierte Gewichtsdatei. | 2b-it-sfp.sbs , ... (siehe oben) |
--tokenizer |
Der Dateiname des Tokenizers. | tokenizer.spm |
gemma
wird so aufgerufen:
./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]
Beispielaufruf für die folgende Konfiguration:
- Komprimierte Gewichtungsdatei
2b-it-sfp.sbs
(2B-Anweisungsoptimiertes Modell, 8-Bit-Gleitkomma). - Tokenizerdatei
tokenizer.spm
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it
Nutzung
gemma
hat verschiedene Nutzungsmodi, die über das Flag „Verbosity“ gesteuert werden.
Alle Nutzungsmodi sind interaktiv und lösen die Textgenerierung aus, wenn ein neuer Zeilenumbruch eingegeben wird.
Ausführlichkeit | Nutzungsmodus | Details |
---|---|---|
--verbosity 0 |
Minimal | Es wird nur die generierte Ausgabe gedruckt. Geeignet als Befehlszeilentool. |
--verbosity 1 |
Standard | Standard-Benutzeroberfläche des Terminals |
--verbosity 2 |
Detailliert | Zeigt zusätzliche Entwickler- und Debug-Informationen an. |
Interaktive Terminal-App
Standardmäßig ist die Verbosity auf „1“ gesetzt. Dadurch wird eine terminalbasierte interaktive Benutzeroberfläche angezeigt, wenn gemma
mit den erforderlichen Argumenten aufgerufen wird:
$ ./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.
...
Verwendung als Befehlszeilentool
Wenn Sie die gemma
-Ausführbare Datei als Befehlszeilentool verwenden möchten, kann es hilfreich sein, einen Alias für „gemma.cpp“ mit vollständig angegebenen Argumenten zu erstellen:
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"
Ersetzen Sie die obigen Pfade durch Ihre eigenen Pfade zum Modell und Tokenizer aus dem Download.
Hier ein Beispiel für eine Aufforderung an gemma
mit einer abgeschnittenen Eingabe (mit einem oben definierten gemma2b
-Alias):
cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code
do: " | gemma2b
HINWEIS: Die Verwendung von gemma.cpp in der Befehlszeile ist experimentell und es sollten die Einschränkungen bei der Kontextlänge berücksichtigt werden.
Die Ausgabe des obigen Befehls sollte so aussehen:
$ 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.