מדריך Gemma C++ (gemma.cpp)

gemma.cpp הוא מכשיר C++ קל טהור ולהסביר את ההטמעה של מודל Gemma בזמן הריצה.

מידע נוסף על Gemma זמין בכרטיס המודל. משקולות המודל, כולל ארטיפקטים ספציפיים ל-gemma.cpp, זמינים ב- Kaggle.

למי מיועד הפרויקט הזה?

מנועי הסקת מסקנות מודרניים של מודל שפה גדול (LLM) הם מערכות מתוחכמות, שלרוב מותאמים יכולות שמתרחבות מעבר לזמני ריצה של רשת נוירונים רגילה. עכשיו אפשר יוצרת הזדמנויות למחקר וחדשנות באמצעות תכנון משותף של וחישוב ברמה נמוכה. אבל יש פער הסקת מסקנות מ-C++ שמכוון לפריסה, שלא מיועדים ומסגרות מחקר למידת מכונה שמתמקדות ב-Python, ומופשטות חישובים ברמה נמוכה באמצעות הידור.

ב-gemma.cpp מספקים הטמעה מינימליסטית של מודלים מסוג Gemma 2B ו-7B, להתמקד בפשטות ובישירות ולא בכלליות מלאה. הדבר בהשראת יישומים של מודל C++ משולבים אנכיים, כמו ggml, llama.c, וגם llama.rs

ב-gemma.cpp יעדים של ניסויים ומחקרים – בפרט, את מרחב העיצוב של אלגוריתמים כרטיס SIM נייד דרך הכביש המהיר של Google לספרייה. קל להטמיע אותה בפרויקטים אחרים יחסי התלות מינימליים וגם ניתן לשנות אותם בקלות באמצעות ליבת LoC קטנה של כ-2K (יחד עם כ-4K LoC של כלי עזר תומכים).

לפריסות קצה שמטורגטות לסביבת ייצור מומלץ להשתמש בפריסה רגילה להשתמש ב-frameworks בוגרות של Python כמו JAX, Keras, PyTorch, טרנספורמרים (כל הווריאציות של המודל כאן).

תרומות מהקהילה, גדולות וקטנות, יתקבלו בברכה. הפרויקט הזה מתבצע לפי הנחיות הקהילה של Google בנושא קוד פתוח

מדריך למתחילים

כדי להשלים את המדריך למתחילים הזה, צריך לשכפל או להוריד gemma.cpp.

דרישות מערכת

לפני שמתחילים, צריך להתקין את:

שלב 1: מקבלים משקולות מודל וממיר אסימונים מ-Kaggle

אפשר להיכנס לדף של מודל gemma בכתובת Kaggle ולבחור באפשרות 'וריאציות של מודל'

התפריט הנפתח Gemma C++. On this tab, theוריאציה' כולל את הפריטים הבאים האפשרויות הבאות. חשוב לשים לב שהאפשרויות של המשקולות bfloat16 הן באיכות גבוהה יותר, בעוד שהאפשרויות של 8 ביט אם משקולות בנקודה צפה שונה, אפשר להסיק מהר יותר.

מודלים של 2B שכווננו לפי הוראה (it) ומודלים שעברו אימון מראש (pt):

שם דגם תיאור
2b-it מודל מכוונן להוראה של 2 מיליארד פרמטרים, bfloat16
2b-it-sfp מודל מכוונן לפי הוראות של 2 מיליארד פרמטרים, נקודה צפה (floating-point) הוחלפה ב-8 ביט
2b-pt מודל שעבר אימון מראש של 2 מיליארד פרמטרים, bfloat16
2b-pt-sfp מודל שעבר אימון מראש של 2 מיליארד פרמטרים, נקודה צפה (floating-point) הוחלפה ב-8 ביט

מודלים של 7B שכווננו לפי הוראה (it) ומודלים שעברו אימון מראש (pt):

שם דגם תיאור
7b-it מודל מכוונן להוראה של 7 מיליארד פרמטרים, bfloat16
7b-it-sfp מודל שמכוונן לפי הוראות של 7 מיליארד פרמטרים, נקודה צפה (floating-point) עם החלפה של 8 ביט
7b-pt מודל שעבר אימון מראש של 7 מיליארד פרמטרים, bfloat16
7b-pt-sfp מודל שעבר אימון מראש של 7 מיליארד פרמטרים, נקודה צפה (floating-point) הוחלפה ב-8 ביט

הערה: מומלץ להתחיל עם 2b-it-sfp כדי להתחיל לעבוד.

שלב 2: שולפים קבצים

לאחר מילוי טופס ההסכמה, ההורדה צריכה להמשיך לצורך אחזור קובץ ארכיון tar archive.tar.gz. יש לחלץ קבצים מ-archive.tar.gz (הפעולה הזו יכולה הקדישו כמה דקות):

tar -xf archive.tar.gz

הפעולה הזו יוצרת קובץ שמכיל משקלים של מודל כמו 2b-it-sfp.sbs ו קובץ אסימונים (tokenizer.spm). כדאי להעביר את הקבצים האלה את המיקום של הספרייה שלנו (למשל, ה-build/ המאגר במאגר הזה).

שלב 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.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 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.