gemma.cpp היא הטמעה קלה של מודל Gemma בסביבת זמן ריצה של מודלים מבוססי-הסקה ב-C++.
מידע נוסף על Gemma זמין בכרטיס הדגם. משקלי המודלים, כולל ארטיפקטים ספציפיים של gemma.cpp, זמינים ב-Kaggle.
למי מיועד הפרויקט הזה?
מנועי ההסקה המודרניים של מודלים גדולים של שפה (LLM) הם מערכות מתוחכמות, שלרוב כוללות יכולות בהתאמה אישית שמרחיבות את זמני הריצה המסורתיים של רשתות נוירונים. בעקבות זאת, יש הזדמנויות למחקר ולחדשנות באמצעות תכנון משותף של אלגוריתמים ברמה גבוהה וחישוב ברמה נמוכה. עם זאת, יש פער בין סביבות זמן ריצה של שגיאות מסיקציה ב-C++ שמתמקדות בפריסה, ולא מיועדות לניסוי, לבין מסגרות מחקר של למידת מכונה שמתמקדות ב-Python, שמבודדות את החישוב ברמה נמוכה באמצעות הידור.
הקובץ gemma.cpp מספק הטמעה מינימלית של המודלים Gemma 2B ו-7B, שמתמקדת בפשטות וביעילות ולא בכלליות מלאה. ההשראה לכך הגיעה מהטמעות של מודלים ב-C++ המשולבים בצורה אנכית, כמו ggml, llama.c ו-llama.rs.
gemma.cpp מיועדת לתרחישים לדוגמה של ניסויים ומחקרים – במיוחד, לבדיקה של מרחב העיצוב של אלגוריתמים של הסקת מסקנות ושל מעבדים באמצעות SIMD נייד באמצעות הספרייה Google Highway. הוא נועד להטמעה פשוטה בפרויקטים אחרים עם יחסי תלות מינימליים, וגם לשינוי קל באמצעות הטמעת ליבה קטנה של כ-2,000 שורות קוד (יחד עם כ-4,000 שורות קוד של כלי עזר תומכים).
לפריסות קצה שמתמקדות בסביבת הייצור, מומלץ להשתמש בנתיבים רגילים לפריסה באמצעות מסגרות Python מוכנות כמו JAX, Keras, PyTorch ו-Transformers (כל וריאציות המודל זמינות כאן).
אנחנו מקבלים בברכה הצעות תוכן מהקהילה, גדולות וקטנות. הפרויקט הזה עומד בהנחיות הקהילה של Google בנושא קוד פתוח.
מדריך למתחילים
כדי להשלים את המדריך למתחילים הזה, צריך להעתיק (clone) או להוריד את הקובץ gemma.cpp.
דרישות מערכת
לפני שמתחילים, צריך להתקין את הרכיבים הבאים:
- CMake
- Clang C++ Compiler
tar
לחילוץ ארכיונים מ-Kaggle.
שלב 1: מקבלים את משקלות המודל ואת ה-tokenizer מ-Kaggle
נכנסים אל דף המודל של Gemma ב-Kaggle ובוחרים באפשרות 'Model Variations'.
התפריט הנפתח
. On this tab, the
Variation` של Gemma C++ כולל את האפשרויות הבאות. שימו לב שהאפשרויות של משקלים מסוג bfloat16 הן בעלות רמת נאמנות גבוהה יותר, בעוד שמשקלים של 8 ביט עם נקודת ציפה מחליפת מאפשרים הסקה מהירה יותר.
מודלים של 2B עם כוונון לפי הוראות (it
) ומודלים שעברו אימון מראש (pt
):
שם דגם | תיאור |
---|---|
2b-it |
מודל עם 2 מיליארד פרמטרים שהותאמו להוראות, bfloat16 |
2b-it-sfp |
מודל עם 2 מיליארד פרמטרים שהותאמו להוראות, נקודה צפה עם החלפה של 8 ביט |
2b-pt |
מודל שעבר אימון מראש עם 2 מיליארד פרמטרים, bfloat16 |
2b-pt-sfp |
מודל שעבר אימון מראש עם 2 מיליארד פרמטרים, נקודה צפה עם החלפה של 8 ביט |
מודלים של 7B שהותאמו להוראות (it
) ומודלים שעברו אימון מראש (pt
):
שם דגם | תיאור |
---|---|
7b-it |
מודל עם 7 מיליארד פרמטרים שהותאמו להוראות, bfloat16 |
7b-it-sfp |
מודל עם 7 מיליארד פרמטרים שהותאמו להוראות, נקודה צפה עם החלפה של 8 ביט |
7b-pt |
מודל שעבר אימון מראש עם 7 מיליארד פרמטרים, bfloat16 |
7b-pt-sfp |
מודל שעבר אימון מראש עם 7 מיליארד פרמטרים, נקודה צפה עם החלפה של 8 ביט |
הערה: מומלץ להתחיל עם 2b-it-sfp
כדי להתחיל לעבוד.
שלב 2: חילוץ קבצים
אחרי מילוי טופס ההסכמה, ההורדה אמורה להמשיך לאחזור קובץ הארכיון archive.tar.gz
. מחלצים קבצים מ-archive.tar.gz
(הפעולה הזו עשויה להימשך כמה דקות):
tar -xf archive.tar.gz
הפקודה הזו אמורה ליצור קובץ שמכיל את משקלי המודל, כמו 2b-it-sfp.sbs
, וקובץ של מחולל סמלים (tokenizer.spm
). מומלץ להעביר את הקבצים האלה למיקום נוח בספרייה (למשל, הספרייה build/ ב-repo הזה).
שלב 3: פיתוח
מערכת ה-build משתמשת ב-CMake. כדי ליצור את סביבת זמן הריצה של היסק ב-gemma, יוצרים ספריית build ויוצרים את קובצי ה-build באמצעות cmake
מתיקיית הפרויקט ברמה העליונה:
(cd build && cmake ..)
לאחר מכן, מריצים את make
כדי ליצור את קובץ ההפעלה ./gemma
:
cd build
make -j [number of parallel threads to use] gemma
לדוגמה, make -j 8 gemma
. אם הפעולה תצליח, אמור להופיע קובץ הפעלה של gemma
בספרייה build/
.
שלב 4: הפעלה
עכשיו אפשר להריץ את gemma
מתוך הספרייה build/
.
ל-gemma
יש את הארגומנטים הנדרשים הבאים:
ארגומנט | תיאור | ערך לדוגמה |
---|---|---|
--model |
סוג המודל. | 2b-it , 2b-pt , 7b-it , 7b-pt , ... (ראו למעלה) |
--compressed_weights |
קובץ המשקלים הדחוסים. | 2b-it-sfp.sbs , ... (ראו למעלה) |
--tokenizer |
שם הקובץ של ה-tokenizer. | tokenizer.spm |
gemma
מופעל באופן הבא:
./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]
דוגמה להפעלה של ההגדרה הבאה:
- קובץ משקולות דחוס
2b-it-sfp.sbs
(מודל עם 2B הוראות מותאמות, נקודה צפה מקבילה באורך 8 ביט). - קובץ הניתוח של מחרוזות
tokenizer.spm
.
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it
שימוש
ל-gemma
יש מצבי שימוש שונים, שנשלטים באמצעות הדגל verbosity.
כל מצבי השימוש הם אינטראקטיביים, והם מפעילים יצירת טקסט עם קלט של שורה חדשה.
דרגת מלל | מצב שימוש | פרטים |
---|---|---|
--verbosity 0 |
מינימלי | הדפסת הפלט של היצירה בלבד. מתאים ככלי CLI. |
--verbosity 1 |
ברירת מחדל | ממשק משתמש סטנדרטי של מסוף שפונה למשתמש. |
--verbosity 2 |
מפורטת | הצגת מידע נוסף למפתחים ותוצאות ניפוי באגים. |
אפליקציית טרמינל אינטראקטיבית
כברירת מחדל, רמת הפירוט מוגדרת ל-1, וכתוצאה מכך מוצג ממשק אינטראקטיבי מבוסס-מסוף כשמפעילים את gemma
עם הארגומנטים הנדרשים:
$ ./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.
...
שימוש ככלי שורת פקודה
כדי להשתמש בקובץ ההפעלה gemma
ככלי בשורת הפקודה, כדאי ליצור כינוי ל-gemma.cpp עם ארגומנטים שצוינו במלואם:
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"
מחליפים את הנתיבים שלמעלה בנתיב שלכם למודל ולמחלץ הנתונים מההורדה.
דוגמה להצגת הנחיה ל-gemma
עם קלט קטועה (באמצעות כינוי ל-gemma2b
כפי שהוגדר למעלה):
cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code
do: " | gemma2b
הערה: השימוש ב-CLI של gemma.cpp הוא ניסיוני, וצריך להביא בחשבון את המגבלות על אורך ההקשר.
הפלט של הפקודה שלמעלה אמור להיראות כך:
$ 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.