מדריך 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 ניתן למצוא תרחישים לדוגמה לשימוש בניסויים ובמחקר, במיוחד בחקר המרחב העיצובי של מסקנות המעבד (CPU) באמצעות אלגוריתמים של הסקת מסקנות באמצעות SIMD נייד דרך ספריית Google Highway. המטרה היא להיות פשוטה להטמיע בפרויקטים אחרים עם יחסי תלות מינימליים, ואפשר גם לשנות אותה בקלות באמצעות הטמעה קטנה של כ-2K LoC (יחד עם כ-4,000 LoC של שירותים תומכים).

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

ניתן להוסיף תכנים מהקהילה, קטנים וגדולים כאחד. הפרויקט הזה תואם להנחיות הקהילה של Google בנושא קוד פתוח.

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

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

דרישות המערכת

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

שלב 1: קבלת משקולות והמרת אסימון מ-Kaggle

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

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

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

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

דגמים שעברו כוונון הוראה (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/ ספרייה במאגר הזה).

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

Usage

ל-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

הערה: השימוש ב-gemma.cpp ב-CLI הוא ניסיוני, וצריך להביא בחשבון הגבלות על אורך ההקשר.

הפלט של הפקודה שלמעלה אמור להיראות כך:

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