Tutorial Gemma C++ (gemma.cpp)

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

Untuk mengetahui 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 yang canggih, sering kali dibuat khusus kemampuan yang melampaui runtime jaringan neural tradisional. Dengan ini datang peluang untuk penelitian dan inovasi melalui perancangan bersama tingkat tinggi algoritma dan komputasi tingkat rendah. Namun, ada kesenjangan antara runtime inferensi C++ berorientasi deployment, yang tidak dirancang untuk eksperimen, dan framework riset ML yang berpusat pada Python, yang menyederhanakan komputasi tingkat rendah melalui kompilasi.

gemma.cpp menyediakan implementasi minimalis model Gemma 2B dan 7B, berfokus pada kesederhanaan dan kelangsungan daripada generalis penuh. Ini adalah terinspirasi oleh implementasi model C++ yang terintegrasi secara vertikal seperti ggml, llama.c, dan llama.rs.

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

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

Kontribusi komunitas besar dan kecil diperbolehkan. Proyek 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 sudah menginstal:

Langkah 1: Dapatkan bobot model dan tokenizer dari Kaggle

Kunjungi laman model gemma di Kaggle dan pilih `Model Variations

Drop-down Gemma C++. On this tab, theVariation` mencakup hal berikut opsi di bawah. Perhatikan bahwa opsi bobot bfloat16 adalah {i>fidelity<i} yang lebih tinggi, sedangkan bobot floating point yang diubah memungkinkan inferensi yang lebih cepat.

2 miliar model yang disesuaikan dengan petunjuk (it) dan dilatih sebelumnya (pt):

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

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

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

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

Langkah 2: Ekstrak File

Setelah mengisi formulir izin, download akan melanjutkan untuk mengambil file arsip tar archive.tar.gz. Ekstrak file dari archive.tar.gz (ini dapat luangkan 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). Anda mungkin ingin memindahkan file ini ke lokasi direktori yang nyaman (misalnya, direktori build/ di repo ini).

Langkah 3: Build

Sistem build menggunakan CMake. Untuk membangun inferensi gemma runtime, membuat direktori build, dan menghasilkan file build menggunakan cmake dari direktori proyek level teratas:

(cd build && cmake ..)

Kemudian, jalankan make untuk membangun file ./gemma yang dapat dieksekusi:

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

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

Langkah 4: Jalankan

Anda sekarang dapat menjalankan gemma dari dalam direktori build/.

gemma memiliki argumen yang diperlukan berikut ini:

Argumen Deskripsi Nilai contoh
--model Jenis model. 2b-it, 2b-pt, 7b-it, 7b-pt, ... (lihat di atas)
--compressed_weights File bobot terkompresi. 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, 8-bit floating point yang diubah).
  • 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 tanda verbositas.

Semua mode penggunaan bersifat interaktif, yang memicu pembuatan teks 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 ditampilkan kepada pengguna.
--verbosity 2 Terperinci Menampilkan info developer dan debug tambahan.

Aplikasi Terminal Interaktif

Secara default, verbositas disetel ke 1, yang memunculkan antarmuka interaktif berbasis terminal antarmuka 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 Baris Perintah

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 contoh pembuatan 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 membutuhkan konteks yang panjang memperhitungkan batasan.

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