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