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 project ini?

Mesin inferensi LLM modern adalah sistem yang canggih, sering kali dengan kemampuan khusus yang melampaui runtime jaringan saraf tradisional. Dengan hal ini, akan muncul peluang untuk riset dan inovasi melalui desain bersama algoritma tingkat tinggi dan komputasi tingkat rendah. Namun, ada kesenjangan antara runtime inferensi C++ yang berorientasi pada 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 keterusterangan, bukan generalitas penuh. Hal ini terinspirasi oleh implementasi model C++ yang terintegrasi secara vertikal seperti ggml, llama.c, dan llama.rs.

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

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

Kontribusi komunitas, baik besar maupun kecil, sangatlah disambut. Project ini mengikuti 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 model dan tokenizer dari Kaggle

Buka halaman model gemma di Kaggle dan pilih `Model Variations

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

Model yang disesuaikan dengan petunjuk 2B (it) dan model terlatih (pt):

Nama model Deskripsi
2b-it Model instruction tuned dengan 2 miliar parameter, bfloat16
2b-it-sfp Model instruction tuned dengan 2 miliar parameter, floating point yang dialihkan 8-bit
2b-pt Model terlatih dengan 2 miliar parameter, bfloat16
2b-pt-sfp Model terlatih dengan 2 miliar parameter, floating point yang dialihkan 8-bit

Model yang disesuaikan dengan petunjuk 7B (it) dan model terlatih (pt):

Nama model Deskripsi
7b-it Model yang disesuaikan dengan instruksi 7 miliar parameter, bfloat16
7b-it-sfp Model instruction tuned dengan 7 miliar parameter, floating point yang dialihkan 8-bit
7b-pt Model terlatih dengan 7 miliar parameter, bfloat16
7b-pt-sfp Model terlatih dengan 7 miliar parameter, floating point dengan pengalihan 8-bit

CATATAN: Sebaiknya mulai dengan 2b-it-sfp untuk menyiapkan dan menjalankannya.

Langkah 2: Ekstrak File

Setelah mengisi formulir izin, download akan dilanjutkan untuk mengambil file arsip tar archive.tar.gz. Ekstrak file dari archive.tar.gz (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 pindahkan file ini ke lokasi direktori yang mudah (misalnya, direktori build/ di 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 ./gemma yang dapat dieksekusi:

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

Misalnya, make -j 8 gemma. Jika berhasil, Anda sekarang akan memiliki 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 pemanggilan untuk konfigurasi berikut:

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

Penggunaan

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

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

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

Aplikasi Terminal Interaktif

Secara default, panjang teks ditetapkan ke 1, yang menampilkan 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 yang dapat dieksekusi gemma sebagai alat command line, sebaiknya buat alias untuk gemma.cpp dengan argumen yang ditentukan sepenuhnya:

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 ditentukan 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 perintah di atas akan terlihat seperti:

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