gemma.cpp ist eine einfache, reine C++- Implementierung der Inferenzlaufzeit des Gemma-Modells.
Weitere Informationen zu Gemma finden Sie auf der Modellkarte. Modellgewichtungen, einschließlich gemma.cpp-spezifischer Artefakte, sind auf Kaggle.
Für wen ist dieses Projekt gedacht?
Moderne LLM-Inferenz-Engines sind hochentwickelte Systeme, die über die Laufzeiten herkömmlicher neuronaler Netze hinausgehen. Damit bietet Möglichkeiten für Forschung und Innovation durch gemeinsames Design und Low-Level-Berechnungen. Es besteht jedoch eine Lücke zwischen bereitstellungsorientierte C++-Inferenzlaufzeiten, die nicht für und Python-zentrierte ML-Forschungsframeworks, die Low-Level-Berechnung durch Kompilierung.
gemma.cpp bietet eine minimalistische Implementierung der Gemma 2B- und 7B-Modelle, Fokus auf Einfachheit und Direktheit statt auf Vollständigkeit. Dies ist inspiriert von vertikal integrierten C++-Modellimplementierungen wie ggml, llama.c und llama.rs:
gemma.cpp zielt auf Experimente und Forschungsanwendungen ab, insbesondere den Designbereich von CPU-Inferenz- und -Inferenzalgorithmen mit tragbares SIMD über den Google Highway Bibliothek. Die Einbettung in andere Projekte mit minimale Abhängigkeiten haben und auch mit einem kleinen ~2.000 LoC-Kern leicht zu ändern sind. Implementierung (zusammen mit ~4.000 LOC an unterstützenden Dienstprogrammen)
Für produktionsorientierte Edge-Bereitstellungen empfehlen wir die Standardbereitstellung mit ausgereiften Python-Frameworks wie JAX, Keras, PyTorch Transformer (alle Modellvarianten) hier.
Wir freuen uns über große und kleine Communitybeiträge. Dieses Projekt folgt Open-Source-Community-Richtlinien von Google
Kurzanleitung
Für diese Kurzanleitung müssen Sie klonen oder herunterladen gemma.cpp.
Systemanforderungen
Bevor Sie beginnen, sollten Sie Folgendes installiert haben:
- CMake
- Clang-C++-Compiler
tar
zum Extrahieren von Archiven aus Kaggle.
Schritt 1: Modellgewichtungen und Tokenizer von Kaggle abrufen
Rufen Sie die Seite mit dem Gemma-Modell auf Kaggle und wählen Sie `Model Variations
Das Drop-down-Menü „Gemma C++
. On this tab, the
Variation“ enthält Folgendes: Optionen unten. Hinweis: Gewichtungsoptionen von bfloat16 bieten eine höhere Genauigkeit, während 8-Bit- vertauschte Gleitkommagewichtungen ermöglichen eine schnellere Inferenz.
2 Mrd. instruktions abgestimmte (it
) und vortrainierte (pt
) Modelle:
Modellname | Beschreibung |
---|---|
2b-it |
Anweisung abgestimmtes Modell mit 2 Milliarden Parametern, bfloat16 |
2b-it-sfp |
Anweisungsabgestimmtes Modell mit 2 Milliarden Parametern, 8-Bit-Gleitkommazahl |
2b-pt |
Vortrainiertes Modell mit 2 Milliarden Parametern, bfloat16 |
2b-pt-sfp |
Vortrainiertes Modell mit 2 Milliarden Parametern, 8-Bit-Gleitkommazahl |
7 Milliarden von Anweisungen abgestimmte (it
) und vortrainierte (pt
) Modelle:
Modellname | Beschreibung |
---|---|
7b-it |
Anweisung abgestimmtes Modell mit 7 Milliarden Parametern, bfloat16 |
7b-it-sfp |
Anweisungsabgestimmtes Modell mit 7 Milliarden Parametern, 8-Bit-Gleitkommazahl |
7b-pt |
Vortrainiertes Modell mit 7 Milliarden Parametern, bfloat16 |
7b-pt-sfp |
Vortrainiertes Modell mit 7 Milliarden Parametern, 8-Bit-Gleitkommazahl |
HINWEIS: Wir empfehlen, mit 2b-it-sfp
zu beginnen, um loszulegen.
Schritt 2: Dateien extrahieren
Nach dem Ausfüllen des Formulars für die Nutzereinwilligung sollte mit dem Download eine
TAR-Archivdatei archive.tar.gz
. Dateien aus archive.tar.gz
extrahieren (damit kann
nehmen Sie sich ein paar Minuten Zeit):
tar -xf archive.tar.gz
Dadurch sollte eine Datei mit Modellgewichtungen wie 2b-it-sfp.sbs
und
Eine Tokenizer-Datei (tokenizer.spm
) Es empfiehlt sich, diese Dateien
praktischer Speicherort des Verzeichnisses (z.B. das Verzeichnis build/ in diesem Repository).
Schritt 3: Erstellen
Das Build-System verwendet CMake. Um die Gmma-Inferenz zu erstellen
Erstellen Sie ein Build-Verzeichnis und generieren Sie die Build-Dateien mit cmake
.
aus dem Projektverzeichnis der obersten Ebene:
(cd build && cmake ..)
Führen Sie dann make
aus, um die ausführbare ./gemma
zu erstellen:
cd build
make -j [number of parallel threads to use] gemma
Beispiel: make -j 8 gemma
. Wenn dies gelingt, sollte nun eine
Ausführbare Datei gemma
im Verzeichnis build/
.
Schritt 4: Ausführen
Sie können gemma
jetzt aus dem Verzeichnis build/
ausführen.
Für gemma
sind die folgenden erforderlichen Argumente erforderlich:
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 Tokenizer-Dateiname. | 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
(auf Anweisungen abgestimmtes 2-Milliarden-Modell, 8-Bit Gleitkomma). - Tokenizer-Datei
tokenizer.spm
.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it
Nutzung
gemma
hat verschiedene Nutzungsmodi, die über das Ausführlichkeits-Flag gesteuert werden.
Alle Nutzungsmodi sind interaktiv und lösen die Textgenerierung aus bei Zeilenvorschub.
Ausführlichkeit | Nutzungsmodus | Details |
---|---|---|
--verbosity 0 |
Minimal | Druckt nur Ausgabe. Geeignet als CLI-Tool. |
--verbosity 1 |
Standard | Standardmäßige, für den Nutzer sichtbare Terminal-UI. |
--verbosity 2 |
Detailliert | Zeigt zusätzliche Entwickler- und Debug-Informationen an. |
Interaktive Terminal-App
Standardmäßig ist die Ausführlichkeit auf 1 eingestellt, sodass eine Terminal-basierte interaktive
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
Zur Verwendung der ausführbaren Datei gemma
als Befehlszeilentool kann es hilfreich sein,
Erstellen Sie einen Alias für gemma.cpp mit vollständig angegebenen Argumenten:
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 ist ein Beispiel für den Prompt gemma
mit einer abgeschnittenen Eingabe (mithilfe 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 in der Befehlszeile ist experimentell und sollte Kontextlänge erfordern. Einschränkungen berücksichtigen.
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.