Tutorial Gemma C++ (gemma.cpp)

gemma.cpp adalah implementasi runtime inferensi C++ murni yang ringan dari model Gemma.

Untuk informasi tambahan tentang Gemma, lihat kartu model. Bobot model, termasuk artefak khusus gemma.cpp, tersedia di Kaggle.

Untuk siapa proyek ini?

Mesin inferensi LLM modern adalah sistem canggih, sering kali dengan kemampuan khusus yang melampaui runtime jaringan neural tradisional. Hal ini memunculkan peluang untuk riset dan inovasi melalui desain bersama algoritma tingkat tinggi dan komputasi tingkat rendah. Namun, ada kesenjangan antara runtime inferensi C++ berorientasi deployment, yang tidak dirancang untuk eksperimen, dan framework riset ML yang berfokus pada Python, yang memisahkan komputasi tingkat rendah melalui kompilasi.

gemma.cpp menyediakan implementasi minimalis model Gemma 2B dan 7B, yang berfokus pada kesederhanaan dan kelangsungan, bukan generalitas penuh. Hal ini terinspirasi oleh implementasi model C++ yang terintegrasi secara vertikal seperti ggml, llama.c, dan llama.rs.

gemma.cpp menargetkan eksperimen dan kasus penggunaan riset – khususnya, menjelajahi ruang desain inferensi CPU dan algoritma inferensi menggunakan SIMD portabel melalui library Google Highway. Library ini dimaksudkan agar mudah disematkan dalam project lain dengan dependensi minimal dan juga mudah diubah dengan implementasi inti LoC berukuran ~2K yang kecil (beserta ~4K LoC dari utilitas pendukung).

Untuk deployment edge yang berorientasi produksi, sebaiknya gunakan jalur deployment standar menggunakan framework Python yang matang, seperti JAX, Keras, PyTorch, dan Transformers (semua variasi model di sini).

Kontribusi komunitas besar dan kecil diperbolehkan. Project ini mematuhi Pedoman Komunitas Open Source Google.

Panduan memulai

Untuk menyelesaikan panduan memulai ini, Anda harus meng-clone atau mendownload gemma.cpp.

Persyaratan sistem

Sebelum memulai, Anda harus menginstal:

Langkah 1: Dapatkan bobot dan tokenizer model dari Kaggle

Kunjungi halaman model gemma di Kaggle dan pilih `Model Variations

Drop-down Gemma C++. On this tab, theVariation` menyertakan opsi berikut di bawah ini. Perhatikan bahwa opsi bobot bfloat16 adalah fidelitas yang lebih tinggi, sementara bobot floating point yang beralih 8-bit memungkinkan inferensi yang lebih cepat.

2 miliar model yang disesuaikan dengan instruksi (it) dan model terlatih (pt):

Nama model Deskripsi
2b-it 2 miliar parameter model yang disesuaikan dengan instruksi, bfloat16
2b-it-sfp 2 miliar parameter model yang disesuaikan dengan instruksi, floating point yang dialihkan 8-bit
2b-pt 2 miliar parameter model terlatih, bfloat16
2b-pt-sfp 2 miliar parameter model terlatih, floating point 8 bit yang diganti

7 miliar model yang disesuaikan dengan instruksi (it) dan yang telah dilatih sebelumnya (pt):

Nama model Deskripsi
7b-it 7 miliar parameter model yang disesuaikan dengan instruksi, bfloat16
7b-it-sfp 7 miliar parameter model yang disesuaikan dengan petunjuk, floating point 8-bit diganti
7b-pt 7 miliar parameter model terlatih, bfloat16
7b-pt-sfp 7 miliar parameter model terlatih, floating point 8-bit diganti

CATATAN: Sebaiknya mulai dengan 2b-it-sfp untuk mengaktifkan dan menjalankan.

Langkah 2: Ekstrak File

Setelah mengisi formulir izin, download akan melanjutkan pengambilan file arsip tar archive.tar.gz. Ekstrak file dari archive.tar.gz (proses ini dapat memerlukan waktu beberapa menit):

tar -xf archive.tar.gz

Tindakan ini akan menghasilkan file yang berisi bobot model seperti 2b-it-sfp.sbs dan file tokenizer (tokenizer.spm). Sebaiknya Anda memindahkan file ini ke lokasi direktori yang praktis (misalnya direktori build/ dalam repo ini).

Langkah 3: Build

Sistem build menggunakan CMake. Untuk mem-build runtime inferensi gemma, buat direktori build dan buat file build menggunakan cmake dari direktori project level teratas:

(cd build && cmake ..)

Kemudian, jalankan make untuk mem-build file ./gemma yang dapat dieksekusi:

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

Misalnya, make -j 8 gemma. Jika berhasil, sekarang Anda memiliki file gemma yang dapat dieksekusi di direktori build/.

Langkah 4: Jalankan

Sekarang Anda dapat menjalankan gemma dari dalam direktori build/.

gemma memiliki argumen yang diperlukan berikut:

Argumen Deskripsi Nilai contoh
--model Jenis model. 2b-it, 2b-pt, 7b-it, 7b-pt, ... (lihat di atas)
--compressed_weights File bobot yang dikompresi. 2b-it-sfp.sbs, ... (lihat di atas)
--tokenizer Nama file tokenizer. tokenizer.spm

gemma dipanggil sebagai:

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

Contoh panggilan untuk konfigurasi berikut:

  • File bobot terkompresi 2b-it-sfp.sbs (model yang disesuaikan dengan petunjuk 2B, floating point yang beralih 8-bit).
  • File tokenizer tokenizer.spm.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

Penggunaan

gemma memiliki mode penggunaan berbeda, yang dikontrol oleh flag panjang.

Semua mode penggunaan bersifat interaktif, yang memicu pembuatan teks saat input baris baru.

Panjang Mode penggunaan Detail
--verbosity 0 Minimal Hanya mencetak output pembuatan. Cocok sebagai alat CLI.
--verbosity 1 Default UI terminal standar yang menghadap pengguna.
--verbosity 2 Terperinci Menampilkan info developer dan debug tambahan.

Aplikasi Terminal Interaktif

Secara default, panjang ditetapkan ke 1, sehingga memunculkan antarmuka interaktif berbasis terminal saat gemma dipanggil dengan argumen yang diperlukan:

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

...

Penggunaan sebagai Alat Command Line

Untuk menggunakan file gemma yang dapat dieksekusi sebagai alat command line, sebaiknya buat alias untuk gemma.cpp dengan argumen yang sepenuhnya ditentukan:

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"

Ganti jalur di atas dengan jalur Anda sendiri ke jalur model dan tokenizer dari download.

Berikut adalah contoh perintah gemma dengan input yang terpotong (menggunakan alias gemma2b seperti yang dijelaskan di atas):

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

CATATAN: Penggunaan CLI gemma.cpp bersifat eksperimental dan harus mempertimbangkan batasan panjang konteks.

Output dari perintah di atas akan terlihat seperti ini:

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