Gemma C++ Tutorial (gemma.cpp)

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:

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, theVariation“ 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.