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:
- CMake
- Clang C++ Compiler
tar
untuk mengekstrak arsip dari Kaggle.
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, the
Variation` 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.