Udhëzues Gemma C++ (gemma.cpp)

gemma.cpp është një zbatim i lehtë i pastër i konkluzionit C++ në kohën e ekzekutimit të modelit Gemma.

Për informacion shtesë rreth Gemma, shihni kartën e modelit . Peshat e modelit, duke përfshirë objekte specifike gemma.cpp, ofrohen në Kaggle .

Për kë është ky projekt?

Motorët modern të konkluzionit LLM janë sisteme të sofistikuara, shpesh me aftësi të personalizuara që shtrihen përtej kohëzgjatjes tradicionale të rrjetit nervor. Me këtë vijnë mundësitë për kërkime dhe inovacione përmes bashkë-projektimit të algoritmeve të nivelit të lartë dhe llogaritjeve të nivelit të ulët. Megjithatë, ka një hendek midis kohëzgjatjes së konkluzioneve të C++ të orientuara nga vendosja, të cilat nuk janë të dizajnuara për eksperimente, dhe kornizave kërkimore ML me qendër Python, të cilat abstraktojnë llogaritjet e nivelit të ulët përmes përpilimit.

gemma.cpp ofron një implementim minimalist të modeleve Gemma 2B dhe 7B, duke u fokusuar në thjeshtësinë dhe drejtpërdrejtësinë dhe jo në përgjithësimin e plotë. Kjo është frymëzuar nga implementimet e modelit C++ të integruar vertikalisht si ggml , llama.c dhe llama.rs .

gemma.cpp synon eksperimentimin dhe rastet e përdorimit të kërkimit – në veçanti, duke eksploruar hapësirën e projektimit të konkluzioneve të CPU dhe algoritmeve të konkluzioneve duke përdorur SIMD portative nëpërmjet bibliotekës së Google Highway . Ai synohet të jetë i thjeshtë për t'u futur në projekte të tjera me varësi minimale dhe gjithashtu lehtësisht i modifikueshëm me një zbatim të vogël bazë ~2K LoC (së bashku me ~4K LoC të shërbimeve mbështetëse).

Për vendosjet e skajeve të orientuara nga prodhimi, ne rekomandojmë shtigje standarde të vendosjes duke përdorur korniza të pjekura të Python si JAX, Keras, PyTorch dhe Transformers ( të gjitha variacionet e modelit këtu ).

Kontributet e komunitetit të mëdha dhe të vogla janë të mirëseardhura. Ky projekt ndjek Udhëzimet e Komunitetit me Burim të Hapur të Google .

Fillimi i shpejtë

Për të përfunduar këtë fillim të shpejtë, duhet të klononi ose shkarkoni gemma.cpp .

Kërkesat e sistemit

Para fillimit, duhet të keni instaluar:

Hapi 1: Merrni peshat e modelit dhe tokenizuesin nga Kaggle

Vizitoni faqen e modelit gemma në Kaggle dhe zgjidhni `Model Variations

Gemma C++ . On this tab, the drop-down Variation` përfshin opsionet e mëposhtme më poshtë. Vini re se opsionet e peshave bfloat16 kanë besueshmëri më të lartë, ndërsa peshat me pikë lundruese të ndërruara 8-bit mundësojnë konkluzion më të shpejtë.

Modele 2B të akorduara me udhëzim ( it ) dhe të trajnuar paraprakisht ( pt ):

Emri i modelit Përshkrimi
2b-it Modeli i akorduar me instruksione prej 2 miliardë parametrash, bfloat16
2b-it-sfp Modeli i akorduar me instruksione me 2 miliardë parametra, pikë lundruese e ndërruar 8-bit
2b-pt Modeli i paratrajnuar me 2 miliard parametra, bfloat16
2b-pt-sfp Modeli i trajnuar paraprakisht me 2 miliardë parametra, pikë lundruese e ndërruar 8-bit

Modele 7B të akorduara me udhëzim ( it ) dhe të trajnuar paraprakisht ( pt ):

Emri i modelit Përshkrimi
7b-it Modeli i akorduar me instruksione prej 7 miliardë parametrash, bfloat16
7b-it-sfp Modeli i akorduar me instruksione me 7 miliardë parametra, pikë lundruese e ndërruar 8-bit
7b-pt Modeli i paratrajnuar me parametra 7 miliardë, bfloat16
7b-pt-sfp Modeli i para-stërvitur me parametra 7 miliardë, pika lundruese e ndërruar 8-bit

SHËNIM : Ne rekomandojmë të filloni me 2b-it-sfp për të filluar dhe funksionuar.

Hapi 2: Ekstraktoni skedarët

Pas plotësimit të formularit të pëlqimit, shkarkimi duhet të vazhdojë për të marrë një skedar arkivi tar archive.tar.gz . Ekstraktoni skedarët nga archive.tar.gz (kjo mund të zgjasë disa minuta):

tar -xf archive.tar.gz

Kjo duhet të prodhojë një skedar që përmban pesha të modelit si p.sh. 2b-it-sfp.sbs dhe një skedar tokenizer ( tokenizer.spm ). Ju mund të dëshironi t'i zhvendosni këta skedarë në një vendndodhje të përshtatshme drejtorie (p.sh. build/directory në këtë repo).

Hapi 3: Ndërtoni

Sistemi i ndërtimit përdor CMake . Për të ndërtuar kohën e ekzekutimit të konkluzionit gemma, krijoni një drejtori ndërtimi dhe gjeneroni skedarët e ndërtimit duke përdorur cmake nga drejtoria e projektit të nivelit të lartë:

(cd build && cmake ..)

Pastaj ekzekutoni make për të ndërtuar ekzekutuesin ./gemma :

cd build make -j [number of parallel threads to use] gemma

Për shembull, make -j 8 gemma . Nëse kjo është e suksesshme, tani duhet të keni një gemma të ekzekutueshme në drejtorinë build/ .

Hapi 4: Vraponi

Tani mund të ekzekutoni gemma nga brenda direktorisë build/ .

gemma ka argumentet e mëposhtme të kërkuara:

Argumenti Përshkrimi Vlera shembull
--model Lloji i modelit. 2b-it , 2b-pt , 7b-it , 7b-pt , ... (shih më lart)
--compressed_weights Skedari i ngjeshur i peshave. 2b-it-sfp.sbs , ... (shih më lart)
--tokenizer Emri i skedarit të tokenizuesit. tokenizer.spm

gemma thirret si:

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

Shembull i thirrjes për konfigurimin e mëposhtëm:

  • Skedari i peshave të ngjeshura 2b-it-sfp.sbs (modeli i akorduar me instruksione 2B, pika lundruese e ndërruar 8-bit).
  • Skedari i tokenizatorit tokenizer.spm .
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Përdorimi

gemma ka mënyra të ndryshme përdorimi, të kontrolluara nga flamuri i fjalës.

Të gjitha mënyrat e përdorimit janë ndërvepruese, duke shkaktuar gjenerimin e tekstit me futjen e linjës së re.

Verbozitet Mënyra e përdorimit Detajet
--verbosity 0 Minimale Printon vetëm rezultatin e gjenerimit. I përshtatshëm si një mjet CLI.
--verbosity 1 E paracaktuar Ndërfaqja standarde e terminalit të drejtuar nga përdoruesi.
--verbosity 2 I detajuar Shfaq informacione shtesë për zhvilluesin dhe korrigjimin e gabimeve.

Aplikacioni i terminalit interaktiv

Si parazgjedhje, verbositeti është vendosur në 1, duke sjellë një ndërfaqe interaktive të bazuar në terminal kur gemma thirret me argumentet e kërkuara:

$ ./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.

...

Përdorimi si një mjet i linjës së komandës

Për përdorimin e ekzekutueshëm të gemma si një mjet të linjës së komandës, mund të jetë e dobishme të krijohet një pseudonim për gemma.cpp me argumente të specifikuara plotësisht:

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"

Zëvendësoni shtigjet e mësipërme me shtigjet tuaja drejt modelit dhe shtigjeve të tokenizuesit nga shkarkimi.

Këtu është një shembull i nxitjes gemma me një hyrje të cunguar (duke përdorur një pseudonim gemma2b siç përcaktohet më sipër):

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

SHËNIM : Përdorimi i CLI i gemma.cpp është eksperimental dhe duhet të marrë parasysh kufizimet e gjatësisë së kontekstit.

Dalja e komandës së mësipërme duhet të duket si kjo:

$ 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.