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