Samouczek Gemma C++ (gemma.cpp)

gemma.cpp to lekka implementacja modelu Gemma w czystym środowisku wnioskowania w języku C++.

Więcej informacji na temat Gemmy znajdziesz na karcie modelu. Wagi modelu, w tym konkretne artefakty gemma.cpp, są dostępne w Kaggle.

Dla kogo jest ten projekt?

Nowoczesne silniki wnioskowania LLM to zaawansowane systemy, często o niestandardowych możliwościach wykraczających poza tradycyjne środowiska wykonawcze sieci neuronowych. Stwarza to możliwości badań i innowacji dzięki wspólnemu projektowaniu algorytmów wysokiego poziomu i niskopoziomowych obliczeń. Występuje jednak różnica między środowiskami wykonawczymi wnioskowania w języku C++, które nie służą do eksperymentów, a platformami do badań nad systemami uczącymi się opartymi na Pythonie, które eliminują niskopoziomowe obliczenia przez kompilację.

gemma.cpp udostępnia minimalistyczną implementację modeli Gemma 2B i 7B, koncentrując się na prostocie i bezpośrednim działaniu, a nie na pełnym uniwersum. Inspiracją są zintegrowane pionowo modele C++, takie jak ggml, llama.c i llama.rs.

Biblioteka gemma.cpp jest przeznaczona do eksperymentów i badań, w szczególności dotyczy projektowania przestrzeni wnioskowania na potrzeby procesora i algorytm wnioskowania korzystających z przenośnej karty SIMD dostępnej w bibliotece Google Parkway. Rozwiązanie ma być łatwe do umieszczenia w innych projektach o minimalnych zależnościach i łatwe do modyfikacji za pomocą podstawowego wdrożenia podstawowego na poziomie ok. 2 tys. lokalizacji (w tym ok. 4000 lok. LoC w przypadku narzędzi pomocniczych).

W przypadku produkcyjnych wdrożeń brzegowych zalecamy standardowe ścieżki wdrażania korzystające z dojrzałych platform Pythona, takich jak JAX, Keras, PyTorch i Transformers (tutaj znajdziesz wszystkie wersje modeli).

Przesyłanie małych i dużych treści przez widzów jest mile widziane. Ten projekt jest zgodny z wytycznymi dla społeczności Google open source.

Krótkie wprowadzenie

Aby wykonać to krótkie wprowadzenie, musisz skopiować lub pobrać plik gemma.cpp.

Wymagania systemowe

Przed rozpoczęciem należy zainstalować:

Krok 1. Uzyskaj wagi modelu i tokenizatora z Kaggle

Otwórz stronę modelu gemma w Kaggle i wybierz „Odmiany modelu”.

Menu Gemma C++. On this tab, theOdmiana” zawiera poniższe opcje. Uwaga: opcje wag bfloat16 zapewniają większą dokładność, a 8-bitowe przełączane wagi zmiennoprzecinkowe umożliwiają szybsze wnioskowanie.

2 mld modeli dostrojonych (it) i wytrenowanych (pt):

Nazwa modelu Opis
2b-it 2 miliardy dostrojony modelu instruktażowego parametrów, bfloat16
2b-it-sfp 2 miliardy dostrojony w ramach instrukcji, 8-bitowy model zmiennoprzecinkowy
2b-pt 2 miliardy parametrów wytrenowany model, bfloat16
2b-pt-sfp Wytrenowany model z 2 miliardami parametrów, 8-bitowa liczba zmiennoprzecinkowa

7 mld modeli dostrojonych (it) i wytrenowanych (pt):

Nazwa modelu Opis
7b-it 7 mld parametrów dostrojonych pod kątem instrukcji, bfloat16
7b-it-sfp 7 miliardów dostrojonych instrukcji z obsługą parametrów, 8-bitowy model zmiennoprzecinkowy
7b-pt 7 mld parametrów wytrenowany model, bfloat16
7b-pt-sfp 7 miliardów wytrenowanych już parametrów, 8-bitowy model zmiennoprzecinkowy

UWAGA: zalecamy rozpoczęcie od 2b-it-sfp.

Krok 2. Wyodrębnij pliki

Po wypełnieniu formularza zgody należy rozpocząć pobieranie pliku archiwum .tar archive.tar.gz. Wyodrębnij pliki z instancji archive.tar.gz (może to potrwać kilka minut):

tar -xf archive.tar.gz

Powinno to spowodować utworzenie pliku zawierającego wagi modelu, takie jak 2b-it-sfp.sbs i plik tokenizatora (tokenizer.spm). Warto przenieść te pliki do wygodnej lokalizacji katalogu (np. do katalogu build/ w tym repozytorium).

Krok 3. Kompilacja

System kompilacji używa CMake. Aby utworzyć środowisko wykonawcze wnioskowania gemma, utwórz katalog kompilacji i wygeneruj pliki kompilacji za pomocą polecenia cmake z katalogu projektu najwyższego poziomu:

(cd build && cmake ..)

Następnie uruchom polecenie make, aby utworzyć plik wykonywalny ./gemma:

cd build make -j [number of parallel threads to use] gemma

Na przykład: make -j 8 gemma. Jeśli operacja się uda, w katalogu build/ powinien znajdować się plik wykonywalny gemma.

Krok 4. Uruchom

Możesz teraz uruchomić plik gemma z katalogu build/.

gemma ma następujące wymagane argumenty:

Argument Opis Przykładowa wartość
--model Typ modelu. 2b-it, 2b-pt, 7b-it, 7b-pt, ... (patrz wyżej)
--compressed_weights Skompresowany plik wag. 2b-it-sfp.sbs, ... (patrz wyżej)
--tokenizer Nazwa pliku tokenizatora. tokenizer.spm

Funkcja gemma jest wywoływana jako:

./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]

Przykładowe wywołanie tej konfiguracji:

  • Skompresowany plik wag 2b-it-sfp.sbs (model dostrojony w oparciu o instrukcję 2B, zmiennoprzecinkowy zmiennoprzecinkowy 8-bitowy model).
  • Plik tokenizatora tokenizer.spm.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Wykorzystanie

gemma ma różne tryby użycia, kontrolowane za pomocą flagi szczegółowości.

Wszystkie tryby użycia są interaktywne i uruchamiają generowanie tekstu po wpisaniu nowego wiersza.

Szczegółowość Tryb wykorzystania Szczegóły
--verbosity 0 Minimalny Generuje tylko odbitki. Idealne jako narzędzie interfejsu wiersza poleceń.
--verbosity 1 Domyślnie Standardowy interfejs użytkownika terminala.
--verbosity 2 Szczegóły Pokazuje dodatkowe dane dewelopera i debugowania.

Interaktywna aplikacja Terminal

Domyślnie szczegółowość jest ustawiona na 1, co powoduje wyświetlenie interaktywnego interfejsu opartego na terminalu po wywołaniu funkcji gemma z wymaganymi argumentami:

$ ./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.

...

Użycie jako narzędzia wiersza poleceń

Jeśli chcesz używać pliku wykonywalnego gemma jako narzędzia wiersza poleceń, warto utworzyć alias dla pliku gemma.cpp z w pełni określonymi argumentami:

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"

Zastąp powyższe ścieżki własnymi ścieżkami do modelu i tokenizatora z pobranego pliku.

Oto przykład żądania gemma z niepełnymi danymi wejściowymi (za pomocą aliasu gemma2b, takiego jak zdefiniowany powyżej):

cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b

UWAGA: użycie gemma.cpp w interfejsie wiersza poleceń to funkcja eksperymentalna i należy uwzględnić ograniczenia długości kontekstu.

Dane wyjściowe tego polecenia powinny wyglądać tak:

$ 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.