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 أو تنزيله.
متطلبات النظام
قبل البدء، يجب أن يكون لديك ما يلي مثبّتًا:
- CMake
- مُجمِّع Clang C++
tar
لاستخراج الأرشيف من Kaggle
الخطوة 1: الحصول على أوزان النموذج وبرنامج تقسيم النصوص من Kaggle
انتقِل إلى صفحة نموذج gemma على Kaggle واختَر "نماذج الاختلافات
يتضمّن القائمة المنسدلة Gemma C++
. On this tab, the
Variation` الخيارات التالية: يُرجى العِلم أنّ خيارات أوزان 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.