Samouczek Gemma C++ (gemma.cpp)

gemma.cpp to lekka implementacja modelu Gemma w języku C++, która służy do przeprowadzania wnioskowania w czasie wykonywania.

Więcej informacji o Gemma znajdziesz na karcie modelu. Wagi modelu, w tym artefakty związane z gemma.cpp, są dostępne na Kaggle.

Dla kogo jest przeznaczony ten projekt?

Nowoczesne mechanizmy wnioskowania LLM to zaawansowane systemy, które często mają specjalne funkcje wykraczające poza tradycyjne czasy wykonywania sieci neuronowych. Daje to możliwości badań i innowacji dzięki wspólnemu projektowaniu algorytmów wysokiego poziomu i obliczeń niskiego poziomu. Istnieje jednak luka między przeznaczonymi do wdrażania środowiskami uruchomieniowymi C++ do wnioskowania, które nie są przeznaczone do eksperymentowania, a ramami do badań nad ML opartymi na Pythonie, które abstrahują od obliczeń niskiego poziomu za pomocą kompilacji.

Plik Gemma.cpp zawiera minimalistyczną implementację modeli Gemma 2B i 7B, która skupia się na prostocie i bezpośredniości, a nie na pełnej ogólności. Jest to rozwiązanie zainspirowane pionowymi implementacjami modelu C++, takimi jak ggml, llama.c i llama.rs.

Plik gemma.cpp jest przeznaczony do eksperymentowania i badania – w szczególności do badania przestrzeni projektowej algorytmów wnioskowania i wnioskowania na procesorze CPU przy użyciu przenośnej biblioteki SIMD Google Highway. Ma ona być łatwa do umieszczenia w innych projektach z minimalnymi zależnościami i łatwo modyfikowalna dzięki niewielkiej implementacji rdzenia (około 2 tys. wierszy kodu źródłowego) i około 4 tys. wierszy kodu źródłowego narzędzi pomocniczych.

W przypadku wdrożeń na urządzeniach Edge przeznaczonych do użytku produkcyjnego zalecamy stosowanie standardowych ścieżek wdrożeniowych z wykorzystaniem dojrzałych frameworków Pythona, takich jak JAX, Keras, PyTorch i Transformer (wszystkie warianty modelu dostępne tutaj).

Zapraszamy do udziału w tym programie wszystkich członków społeczności. Ten projekt jest zgodny z wytycznymi Google dotyczącymi społeczności open source.

Krótkie wprowadzenie

Aby ukończyć ten samouczek, musisz skopiować lub sklonować plik gemma.cpp.

Wymagania systemowe

Przed rozpoczęciem musisz mieć zainstalowane:

Krok 1. Pobierz z Kaggle wagi modelu i tokenizer

Otwórz stronę modelu Gemma na Kaggle i wybierz „Model Variations

W sekcji Gemma C++. On this tab, the opcja „Zmienność” zawiera te opcje: Pamiętaj, że opcje wag bfloat16 zapewniają większą wierność, a 8-bitowe wagi z przełącznikiem na liczby zmiennoprzecinkowe umożliwiają szybsze wnioskowanie.

Modele dostosowane do instrukcji 2B (it) i wytrenowane (pt):

Nazwa modelu Opis
2b-it Model z 2 miliardami parametrów dostrojony przy użyciu instrukcji, bfloat16
2b-it-sfp model z 2 mld parametrów dostrojony przy użyciu instrukcji, 8-bitowa zmienna zmiennoprzecinkowa;
2b-pt wytrenowany wstępnie model z 2 miliardami parametrów, bfloat16
2b-pt-sfp Wytrenowany model z 2 mld parametrów, 8-bitowa zmienna zmiennoprzecinkowa

Modele dostosowane do 7 mld instrukcji (it) i wytrenowane (pt):

Nazwa modelu Opis
7b-it Model z 7 mld parametrów dostrojony pod kątem instrukcji, bfloat16
7b-it-sfp Model z 7 mld parametrów z dostrojeniem instrukcji, 8-bitowa zmiennoprzecinkowa punktacja danych
7b-pt wytrenowany model z 7 mld parametrów, bfloat16.
7b-pt-sfp Wytrenowany model z 7 mld parametrów, 8-bitowa zmienna zmiennoprzecinkowa

UWAGA: aby szybko rozpocząć korzystanie z usługi, zalecamy użycie wersji 2b-it-sfp.

Krok 2. Wyodrębnij pliki

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

tar -xf archive.tar.gz

Powinien on wygenerować plik zawierający wagi modelu, np. 2b-it-sfp.sbs, oraz plik tokenizera (tokenizer.spm). Możesz przenieść te pliki do dogodnego katalogu (np. katalogu build/ w tym repozytorium).

Krok 3. Tworzenie

System kompilacji korzysta z CMake. Aby skompilować środowisko uruchomieniowe wnioskowania Gemma, utwórz katalog kompilacji i wygeneruj pliki kompilacji za pomocą polecenia cmake w katalogu najwyższego poziomu projektu:

(cd build && cmake ..)

Następnie uruchom 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 to się uda, w katalogu build/ powinien pojawić się plik wykonywalny gemma.

Krok 4. Uruchom

Teraz możesz uruchomić gemma z katalogu build/.

Funkcja gemma wymaga podania tych argumentów:

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 analizatora. tokenizer.spm

gemma jest wywoływany jako:

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

Przykład wywołania dla tej konfiguracji:

  • skompresowany plik wag 2b-it-sfp.sbs (model dostosowany do instrukcji 2B, 8-bitowa zmienna zmiennoprzecinkowa z przełącznikiem).
  • Plik Tokenizer tokenizer.spm.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Wykorzystanie

gemma ma różne tryby użycia, które są kontrolowane przez flagę szczegółowości.

Wszystkie tryby użycia są interaktywne i uruchamiają generowanie tekstu po wprowadzeniu znaku końca wiersza.

Szczegółowość Tryb użytkowania Szczegóły
--verbosity 0 Minimalny Wyświetla tylko dane wyjściowe. nadaje się do użycia jako narzędzie wiersza poleceń.
--verbosity 1 Domyślny Standardowy interfejs terminala skierowany do użytkownika.
--verbosity 2 Szczegółowe Pokazuje dodatkowe informacje dla deweloperów i informacje na potrzeby debugowania.

Aplikacja interaktywnego terminala

Domyślnie poziom szczegółowości jest ustawiony na 1, co powoduje wyświetlenie interaktywnego interfejsu opartego na terminalu, gdy wywołana zostanie komenda 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żywanie jako narzędzia wiersza poleceń

Aby używać pliku wykonywalnego gemma jako narzędzia wiersza poleceń, warto utworzyć alias dla pliku gemma.cpp z pełnymi 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 analizatora pobierania.

Oto przykład wywołania funkcji gemma z obciętym wejściem (za pomocą aliasu gemma2b, jak opisano powyżej):

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

UWAGA: korzystanie z interfejsu wiersza poleceń gemma.cpp jest funkcją eksperymentalną i należy wziąć pod uwagę ograniczenia dotyczące 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.