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

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

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

مَن هم المستخدمون المعنيّون بهذا المشروع؟

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

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

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

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

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

البدء السريع

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

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

قبل البدء، يجب أن يكون لديك ما يلي مثبّتًا:

الخطوة 1: الحصول على أوزان النموذج وبرنامج تقسيم النصوص من Kaggle

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

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

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

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

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

اسم الطراز الوصف
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 إذا كان هذا الإجراء ناجحًا، من المفترض أن يكون لديك الآن ملف executable 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 (نموذج مُعدّ للتعليمات بحجم 2 بايت، وبتعداد 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، ما يؤدي إلى عرض واجهة interactive مستندة إلى المحطة الطرفية عند استدعاء 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.