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

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

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

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

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

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

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

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

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

التشغيل السريع

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

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

قبل البدء، عليك تثبيت ما يلي:

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

انتقل إلى صفحة نموذج gemma على Kaggle وحدد "نماذج النموذج"

تتضمن القائمة المنسدلة Gemma C++. On this tab, theVariation` الخيارات التالية أدناه. لاحظ أن خيارات الأوزان bfloat16 أعلى دقة، في حين أن أوزان النقطة العائمة المبدلة 8 بت تتيح استنتاجًا أسرع.

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

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

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

اسم النموذج الوصف
7b-it نموذج لتعديل تعليمات خاصية بـ 7 مليار معلَمة، bfloat16
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). ننصحك بنقل هذه الملفات إلى موقع دليل مناسب (على سبيل المثال، الدليل Build/ في هذا المستودع).

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

يستخدم نظام الإصدار CMake. لإنشاء وقت تشغيل استنتاج gemma، يمكنك إنشاء دليل إنشاء وإنشاء ملفات الإصدار باستخدام 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.