برنامج Gemma C++ التعليمي (gemma.cpp)

gemma.cpp هو عبارة عن C++ خفيف الوزن لاستنتاج وقت تشغيل نموذج Gemma.

لمزيد من المعلومات حول Gemma، يُرجى الاطّلاع على بطاقة النموذج. تتوفّر أوزان النماذج، بما في ذلك عناصر gemma.cpp المحدّدة، على Kaggle

لمن هذا المشروع؟

وتمثل محركات الاستنتاج اللغوية الكبيرة الحديثة أنظمة متطورة وغالبًا ما تستخدم إمكانات تتجاوز بيئات تشغيل الشبكة العصبونية التقليدية. مع هذا فرص للبحث والابتكار من خلال التصميم المشترك للنماذج الخوارزميات والعمليات الحسابية منخفضة المستوى. ومع ذلك، هناك فجوة بين بيئات تشغيل استنتاج C++ المرتكزة على النشر، وغير المصممة والتجريب وأطر أبحاث تعلُّم الآلة التي تركز على لغة بايثون، والتي تجري عملية حسابية منخفضة المستوى من خلال التجميع.

يوفر gemma.cpp تنفيذًا بسيطًا لنماذج Gemma 2B و7B، التركيز على البساطة والتوجيه بدلاً من التعميم الكامل. هذا هو التي تم استلهامها من عمليات تنفيذ نموذج C++ المتكامل رأسيًا، مثل ggml, llama.c، و llama.rs

تستهدف gemma.cpp حالات الاستخدام التجريبي والأبحاث، وعلى وجه الخصوص، استكشاف مساحة تصميم خوارزميات الاستنتاج والاستنتاج لوحدة المعالجة المركزية (CPU) باستخدام شريحة SIMD المحمولة من خلال طريق Google السريع المكتبة. من المفترض أن يكون بسيطًا لتضمينه في المشروعات الأخرى مع ويمكن تعديلها بسهولة أيضًا من خلال وحدة تحكُّم أساسية صغيرة تبلغ حوالي 2,000 نقطة. التنفيذ (إلى جانب ما يقارب 4 آلاف حالة متنقلة من المرافق الداعمة).

بالنسبة إلى عمليات النشر على الحافة نحو الإنتاج، ننصح بالنشر العادي. باستخدام أطر عمل بايثون متطورة، مثل JAX وKeras وPyTorch المحولات (جميع أشكال النماذج المختلفة هنا).

نرحّب بمساهمات المنتدى الكبيرة والصغيرة. يتبع هذا المشروع إرشادات منتدى Google للبرامج المفتوحة المصدر

البدء السريع

لإكمال هذا البدء السريع، يجب عليك نسخ أو تنزيل gemma.cpp.

متطلبات النظام

قبل البدء، يجب أن يكون لديك:

الخطوة 1: الحصول على أوزان النموذج وأداة إنشاء الرموز المميزة من Kaggle

انتقل إلى صفحة نموذج gemma على Kaggle واختَر "أشكال النماذج المختلفة"

تتضمّن القائمة المنسدلة "جيما C++. On this tab, theالتنوع" ما يلي: الخيارات أدناه. لاحظ أن خيارات ترجيح bfloat16 أعلى دقة، في حين أن خيارات الترجيح 8 بت تتيح أوزان النقاط العائمة المتبدلة إمكانية استنتاج أسرع.

نماذج 2B التي تم ضبطها وفقًا للتعليمات (it) والمدرّبة مسبقًا (pt):

اسم الطراز الوصف
2b-it نموذج 2 مليار معلمة وفقًا للتعليمات وهو bfloat16
2b-it-sfp نموذج من 2 مليار معلمة تم ضبطه على التعليمات، ونقطة عائمة بمعدَّل 8 بت
2b-pt نموذج مدرّب مسبقًا لمليارَي معلمة، bfloat16
2b-pt-sfp نموذج مدرّب مسبقًا لـ 2 مليار معلمة، ونقطة عائمة بنظام 8 بت

7 مليار نموذج خاضع للتعليم (it) ونموذج مدرَّب مسبقًا (pt):

اسم الطراز الوصف
7b-it نموذج bfloat16 الذي يحتوي على 7 مليار معلَمة لتحسينه.
7b-it-sfp نموذج مضبوط على تعليمات مؤلف من 7 مليار معلَمة، ونقطة عائمة بمعدَّل 8 بت
7b-pt نموذج مدرّب مسبقًا لـ 7 مليار معلَمة، bfloat16
7b-pt-sfp نموذج مدرّب مسبقًا لـ 7 مليار معلمة، ونقطة عائمة بـ 8 بت

ملاحظة: ننصحك بالبدء بـ 2b-it-sfp لبدء استخدام التطبيق.

الخطوة 2: استخراج الملفات

بعد ملء نموذج الموافقة، يجب مواصلة عملية التنزيل لاسترداد ملف أرشيف tar archive.tar.gz. يمكنك استخراج الملفات من archive.tar.gz (يمكن أن يؤدي هذا الإجراء إلى بضع دقائق):

tar -xf archive.tar.gz

يُفترض أن يؤدي ذلك إلى إنشاء ملف يحتوي على ترجيحات النموذج مثل 2b-it-sfp.sbs ملف أداة إنشاء الرموز المميّزة (tokenizer.spm). قد ترغب في نقل هذه الملفات إلى موقع الدليل الملائم (مثل الإصدار/ الدليل في هذا المستودع).

الخطوة 3: إنشاء

يستخدم نظام التصميم CMake. لبناء استنتاج جوهري وقت التشغيل، وإنشاء دليل إنشاء وإنشاء ملفات الإصدار باستخدام 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 مبسَّط طباعة مخرجات إنشاء المحتوى فقط مناسبة كأداة واجهة سطر الأوامر.
--verbosity 1 تلقائي واجهة مستخدم عادية موجَّهة للمستخدمين
--verbosity 2 تفصيلي يعرض معلومات إضافية عن المطوِّر وتصحيح الأخطاء.

تطبيق Terminal التفاعلي

يتم ضبط الإسهاب تلقائيًا على 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 تجريبي ويجب أن يأخذ طول السياق. القيود في الاعتبار.

يجب أن يبدو ناتج الأمر أعلاه كما يلي:

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