Samouczek Gemma C++ (gemma.cpp)

gemma.cpp to prostszy, czysty kod C++ Implementacja wnioskowania w czasie działania modelu Gemma.

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

Dla kogo jest ten projekt?

Współczesne silniki wnioskowania LLM to zaawansowane systemy, które często są możliwości wykraczające poza tradycyjne środowiska wykonawcze sieci neuronowych. W związku z tym to możliwości badań i innowacji w ramach wspólnego projektowania i algorytmami niskopoziomowymi. Występuje jednak luka środowiska wykonawcze wnioskowania w języku C++ zorientowane na wdrożenie, które nie są przeznaczone eksperymentu oraz platformy badawcze ML skoncentrowane na Pythonie, które są abstrakcyjne przy użyciu kompilacji niskopoziomowej.

gemma.cpp zapewnia minimalistyczną implementację modeli Gemma 2B i 7B, kładą nacisk na prostotę i bezpośredniość, a nie na ogólnik. To jest inspirowanych pionowo zintegrowanymi wdrożeniami modelu C++, takimi jak ggml, llama.c oraz llama.rs

Platforma gemma.cpp skupia się na eksperymentach i badaniach przypadków użycia, w szczególności badania przestrzeni projektowej algorytmów wnioskowania i wnioskowania o CPU przy użyciu przenośna karta SIMD przez Google Auto bibliotece. Powinien on być łatwy do umieszczenia w innych projektach, wymaga minimalnych zależności i można je łatwo modyfikować przy niewielkiej liczbie rdzeni LoC o wielkości ok. 2 tys. wdrożenia (wraz z ok. 4K LoC dostępnych narzędzi).

W przypadku wdrożeń brzegowych zorientowanych na środowisko produkcyjne zalecamy wdrożenie standardowe ścieżek z użyciem dojrzałych platform Pythona, takich jak JAX, Keras, PyTorch Transformery (wszystkie odmiany modeli tutaj).

Zachęcamy do przesyłania dużych i małych treści tłumaczonych przez widzów. Ten projekt obserwuje Wytyczne dla społeczności open source Google

Krótkie wprowadzenie

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

Wymagania systemowe

Zanim zaczniesz, zainstaluj:

Krok 1. Uzyskaj wagi modelu i tokenizer z Kaggle

Odwiedź stronę modelu gemma w Kaggle i wybierz „Odmiany modelu”.

Menu Gemma C++. On this tab, theOdmiana” zawiera następujące elementy opcje poniżej. Pamiętaj, że opcje wag bfloat16 są bardziej precyzyjne, a 8-bitowe. przełączono wagi zmiennoprzecinkowych, aby umożliwić szybsze wnioskowanie.

2 mld modeli dostrojonych zgodnie z instrukcjami (it) i wytrenowanych (pt):

Nazwa modelu Opis
2b-it model bfloat16, z 2 miliardami parametrów dostrojonych zgodnie z instrukcjami
2b-it-sfp Model z 2 miliardami parametrów dostrojony zgodnie z instrukcjami, 8-bitowa zmiennoprzecinkowa
2b-pt Wytrenowany model z 2 miliardami parametrów, bfloat16
2b-pt-sfp Wytrenowany model z 2 miliardami parametrów i 8-bitową zmiennoprzecinkową

7 mld modeli dostrojonych zgodnie z instrukcjami (it) i wytrenowanych (pt):

Nazwa modelu Opis
7b-it model bfloat16 z 7 miliardami parametrów dostrojonych zgodnie z instrukcjami
7b-it-sfp Model z 7 miliardami parametrów dostrojony zgodnie z instrukcjami, 8-bitowa zmiennoprzecinkowa
7b-pt Wytrenowany model z 7 miliardami parametrów, bfloat16
7b-pt-sfp Wytrenowany model z 7 miliardami parametrów i 8-bitową zmiennoprzecinkową

UWAGA: aby zacząć z niego korzystać, zalecamy zacząć od 2b-it-sfp.

Krok 2. Wyodrębnij pliki

Po wypełnieniu formularza zgody plik do pobrania powinien pobrać plik archiwum tar archive.tar.gz. Wyodrębnij pliki z archive.tar.gz (może to być zajmie to tylko kilka minut):

tar -xf archive.tar.gz

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

Krok 3. Kompilacja

System kompilacji używa CMake. Aby utworzyć wnioskowanie gemma w środowisku wykonawczym, utwórz katalog kompilacji i wygeneruj pliki kompilacji za pomocą narzędzia cmake. z katalogu projektu najwyższego poziomu:

(cd build && cmake ..)

Następnie uruchom polecenie make, aby skompilować 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, powinieneś mieć Plik wykonywalny gemma w katalogu build/.

Krok 4. Uruchom

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

Funkcja gemma zawiera te 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 z wagami. 2b-it-sfp.sbs, ... (patrz wyżej)
--tokenizer Nazwa pliku tokenizera. tokenizer.spm

Pole gemma jest wywoływane w ten sposób:

./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 tej konfiguracji:

  • Plik skompresowanych wag 2b-it-sfp.sbs (2B model dostrojony według instrukcji, 8-bitowy przełączono zmiennoprzecinkową).
  • Plik tokenizera: tokenizer.spm.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Wykorzystanie

Funkcja gemma ma różne tryby użytkowania, które sterują flagą szczegółowości.

Wszystkie tryby użytkowania są interaktywne i uruchamiają generowanie tekstu wprowadzanie nowego wiersza.

Szczegółowość Tryb wykorzystania Szczegóły
--verbosity 0 Minimalny Drukuje tylko dane wyjściowe generowania. Może być używane jako narzędzie interfejsu wiersza poleceń.
--verbosity 1 Domyślny Standardowy interfejs terminala.
--verbosity 2 Szczegółowe Pokazuje dodatkowe informacje o deweloperze i debugowaniu.

Interaktywna aplikacja terminala

Domyślnie szczegółowość jest ustawiona na 1, co wywołuje 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 używasz pliku wykonywalnego gemma jako narzędzia wiersza poleceń, przydaje się to, utwórz alias dla 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 ścieżki tokenizacji z pobranego filmu.

Oto przykład promptu gemma z obciętymi danymi wejściowymi (przy użyciu polecenia gemma2b 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ń ma charakter eksperymentalny i powinno mieć długość kontekstu biorąc pod uwagę ograniczenia.

Dane wyjściowe powyższego 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.