gemma.cpp ist eine einfache, reine C++-Inferenzlaufzeitimplementierung des Gemma-Modells.
Weitere Informationen zu Gemma finden Sie auf der Modellkarte. Modellgewichtungen, einschließlich gemma.cpp-spezifischer Artefakte, sind auf Kaggle verfügbar.
Für wen ist dieses Projekt gedacht?
Moderne LLM-Inferenz-Engines sind hoch entwickelte Systeme mit häufig maßgeschneiderten Funktionen, die über herkömmliche neuronale Netzwerklaufzeiten hinausgehen. Daraus ergeben sich Möglichkeiten für Forschung und Innovation durch die gemeinsame Entwicklung von High-Level-Algorithmen und Low-Level-Computing. Es gibt jedoch eine Lücke zwischen bereitstellungsorientierten C++-Inferenzlaufzeiten, die nicht für Experimente vorgesehen sind, und Python-zentrierten ML-Forschungs-Frameworks, die einfache Berechnungen durch Kompilierung abstrahieren.
gemma.cpp bietet eine minimalistische Implementierung der Gemma 2B- und 7B-Modelle, die auf Einfachheit und Direktheit und nicht auf vollständige Allgemeingültigkeit ausgerichtet sind. Dies basiert auf vertikal eingebundenen C++-Modellimplementierungen wie ggml, llama.c und llama.rs.
Gemma.cpp ist auf Tests und Anwendungsfälle für die Forschung ausgerichtet, insbesondere auf die Untersuchung des Entwurfs von CPU-Inferenz- und Inferenzalgorithmen mithilfe einer portablen SIMD aus der Google Highway-Bibliothek. Es soll einfach sein, sich in andere Projekte mit minimalen Abhängigkeiten einzubetten und mit einer kleinen LoC-Kernimplementierung von ca. 2.000 (zusammen mit etwa 4.000 LoC von unterstützenden Dienstprogrammen) leicht zu ändern.
Für produktionsorientierte Edge-Bereitstellungen empfehlen wir Standardbereitstellungspfade mit ausgereiften Python-Frameworks wie JAX, Keras, PyTorch und Transformers (alle Modellvarianten hier).
Sowohl große als auch kleine Communitybeiträge sind willkommen. Das Projekt entspricht den Open-Source-Community-Richtlinien von Google.
Kurzanleitung
Für diese Kurzanleitung müssen Sie gemma.cpp klonen oder herunterladen.
Systemanforderungen
Zuvor 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 Gemma-Modellseite auf Kaggle auf und wählen Sie „Modellvariationen“ aus.
Das Drop-down-Menü „Gemma C++
. On this tab, the
Variation“ enthält die folgenden Optionen. Beachten Sie, dass die Gewichtungsoptionen von bfloat16 eine höhere Genauigkeit bieten, während 8-Bit-geschaltete Gleitkommagewichtungen eine schnellere Inferenz ermöglichen.
2 Milliarden auf Anweisungen abgestimmte (it
) und vortrainierte (pt
) Modelle:
Modellname | Beschreibung |
---|---|
2b-it |
2 Milliarden Parameter für anweisungsabgestimmtes Modell, bfloat16 |
2b-it-sfp |
2-Milliarden-Parameter-Modell, das auf Anweisungen abgestimmt ist, 8-Bit-getauschtes Gleitkomma |
2b-pt |
Vortrainiertes Modell mit 2 Milliarden Parametern, bfloat16 |
2b-pt-sfp |
Vortrainiertes Modell mit 2 Milliarden Parametern, 8-Bit-getauschtes Gleitkomma |
7 Milliarden auf Anweisungen abgestimmte (it
) und vortrainierte (pt
) Modelle:
Modellname | Beschreibung |
---|---|
7b-it |
7 Milliarden Parameter für befehlsabgestimmtes Modell, bfloat16 |
7b-it-sfp |
7-Milliarden-Parameter-Modell, das auf Anweisungen abgestimmt ist, 8-Bit-getauschtes Gleitkomma |
7b-pt |
Vortrainiertes Modell mit 7 Milliarden Parametern, bfloat16 |
7b-pt-sfp |
Vortrainiertes Modell mit 7 Milliarden Parametern, 8-Bit-getauschtes Gleitkomma |
HINWEIS: Wir empfehlen, mit 2b-it-sfp
zu beginnen, um loszulegen.
Schritt 2: Dateien extrahieren
Nach dem Ausfüllen des Einwilligungsformulars sollte mit dem Download die TAR-Archivdatei archive.tar.gz
abgerufen werden. Extrahieren Sie Dateien aus archive.tar.gz
(dies kann einige Minuten dauern):
tar -xf archive.tar.gz
Dadurch sollte eine Datei mit Modellgewichtungen wie 2b-it-sfp.sbs
und einer Tokenizer-Datei (tokenizer.spm
) erstellt werden. Sie sollten diese Dateien an einen geeigneten Speicherort wie das Verzeichnis „build/“ in diesem Repository verschieben.
Schritt 3: Erstellen
Das Build-System verwendet CMake. Zum Erstellen der Laufzeit der Gemma-Inferenz erstellen Sie ein Build-Verzeichnis und generieren die Build-Dateien mit cmake
aus dem obersten Projektverzeichnis:
(cd build && cmake ..)
Führen Sie dann make
aus, um die ausführbare ./gemma
-Datei zu erstellen:
cd build
make -j [number of parallel threads to use] gemma
Beispiel: make -j 8 gemma
. Wenn der Vorgang erfolgreich ist, sollte im Verzeichnis build/
jetzt eine ausführbare gemma
-Datei vorhanden sein.
Schritt 4: Ausführen
Sie können jetzt gemma
aus dem 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 Gewichtungsdatei. | 2b-it-sfp.sbs , ... (siehe oben) |
--tokenizer |
Der Dateiname des Tokenizers. | tokenizer.spm |
gemma
wird aufgerufen als:
./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
(2 Milliarden befehlsabgestimmtes Modell, 8-Bit-Gleitkommazahl). - Tokenizer-Datei
tokenizer.spm
.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it
Nutzung
gemma
hat verschiedene Nutzungsmodi, die durch das Ausführlichkeits-Flag gesteuert werden.
Alle Nutzungsmodi sind interaktiv und lösen bei der Eingabe des Zeilenumbruchs Textgenerierung aus.
Ausführlichkeit | Nutzungsmodus | Details |
---|---|---|
--verbosity 0 |
Minimal | Druckt nur die Generierungsausgabe. Geeignet als CLI-Tool. |
--verbosity 1 |
Standard | Für den Nutzer sichtbare Standard-Benutzeroberfläche des Terminals |
--verbosity 2 |
Detailliert | Zeigt zusätzliche Informationen zum Entwickler und zur Fehlerbehebung an. |
Interaktive Terminal-App
Standardmäßig ist die Ausführlichkeit auf 1 gesetzt, sodass eine Terminal-basierte interaktive Schnittstelle angezeigt wird, 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 ausführbare Datei gemma
als Befehlszeilentool verwenden möchten, kann es nützlich 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 zu den Modell- und Tokenizer-Pfaden aus dem Download.
Hier ein Beispiel für die Aufforderung gemma
mit einer abgeschnittenen Eingabe (unter Verwendung eines gemma2b
-Alias wie oben definiert):
cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code
do: " | gemma2b
HINWEIS: Die Verwendung von gemma.cpp über die Befehlszeile ist experimentell und sollte die Einschränkungen der Kontextlänge berücksichtigen.
Die Ausgabe des obigen Befehls sollte wie folgt 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.