Gemma C++ Tutorial (gemma.cpp)

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:

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