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:
- CMake
- Kompilator Clang C++
tar
do wyodrębniania archiwów z Kaggle.
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.