آموزش Gemma C++ (gemma.cpp)

gemma.cpp یک پیاده‌سازی زمان اجرا استنتاج C++ خالص از مدل Gemma است.

برای اطلاعات بیشتر درباره Gemma، به مدل کارت مراجعه کنید. وزن‌های مدل، از جمله مصنوعات خاص gemma.cpp، در Kaggle موجود است.

این پروژه برای چه کسانی است؟

موتورهای استنتاج LLM مدرن، سیستم‌های پیچیده‌ای هستند که اغلب با قابلیت‌های سفارشی فراتر از زمان‌های اجرا شبکه عصبی سنتی گسترش می‌یابند. با این کار فرصت هایی برای تحقیق و نوآوری از طریق طراحی مشترک الگوریتم های سطح بالا و محاسبات سطح پایین به وجود می آید. با این حال، بین زمان‌های اجرا استنتاج C++ مبتنی بر استقرار، که برای آزمایش طراحی نشده‌اند، و چارچوب‌های تحقیقاتی ML پایتون محور، که محاسبات سطح پایین را از طریق کامپایل انتزاعی می‌کنند، فاصله وجود دارد.

gemma.cpp یک پیاده‌سازی مینیمالیستی از مدل‌های Gemma 2B و 7B را ارائه می‌کند که به جای کلیت کامل، بر سادگی و مستقیم بودن تمرکز دارد. این از پیاده‌سازی‌های مدل C++ یکپارچه عمودی مانند ggml ، llama.c و llama.rs الهام گرفته شده است.

gemma.cpp آزمایش ها و موارد استفاده تحقیقاتی را هدف قرار می دهد - به ویژه، کاوش فضای طراحی الگوریتم های استنتاج و استنتاج CPU با استفاده از SIMD قابل حمل از طریق کتابخانه Google Highway . در نظر گرفته شده است که جاسازی آن در پروژه های دیگر با حداقل وابستگی ها ساده باشد و همچنین به راحتی با یک هسته کوچک ~2K LoC (همراه با ~4K LoC از ابزارهای پشتیبانی) قابل تغییر است.

برای استقرار لبه های تولید محور، ما مسیرهای استقرار استاندارد را با استفاده از چارچوب های بالغ پایتون مانند JAX، Keras، PyTorch و Transformers توصیه می کنیم ( همه تغییرات مدل در اینجا ).

مشارکت های کوچک و بزرگ جامعه استقبال می شود. این پروژه از دستورالعمل های انجمن منبع باز Google پیروی می کند.

شروع سریع

برای تکمیل این شروع سریع، باید gemma.cpp را شبیه سازی یا دانلود کنید.

سیستم مورد نیاز

قبل از شروع، باید نصب کرده باشید:

مرحله 1: وزن مدل و توکنایزر را از Kaggle دریافت کنید

از صفحه مدل gemma در Kaggle دیدن کنید و «Model Variations» را انتخاب کنید

جما C++ . On this tab, the منوی کشویی Variation شامل گزینه های زیر است. توجه داشته باشید که گزینه‌های وزن bfloat16 از وفاداری بالاتری برخوردار هستند، در حالی که وزن‌های ممیز شناور سوئیچینگ ۸ بیتی استنتاج سریع‌تری را امکان‌پذیر می‌کنند.

2B مدل‌های تنظیم‌شده دستورالعمل ( it ) و از پیش آموزش‌دیده ( pt ):

نام مدل شرح
2b-it مدل تنظیم شده با دستورالعمل 2 میلیارد پارامتر، bfloat16
2b-it-sfp مدل تنظیم شده با دستورالعمل 2 میلیارد پارامتر، نقطه شناور سوئیچ 8 بیتی
2b-pt مدل از پیش آموزش داده شده 2 میلیارد پارامتر bfloat16
2b-pt-sfp مدل از پیش آموزش داده شده 2 میلیارد پارامتر، نقطه شناور سوئیچ 8 بیتی

مدل‌های تنظیم‌شده دستورالعمل ۷B ( 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 ) تولید کند. ممکن است بخواهید این فایل ها را به یک مکان دایرکتوری مناسب (مثلاً دایرکتوری ساخت/در این مخزن) منتقل کنید.

مرحله 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 حداقل فقط خروجی تولید چاپ می کند. مناسب به عنوان یک ابزار CLI.
--verbosity 1 پیش فرض رابط کاربری ترمینال استاندارد رو به روی کاربر.
--verbosity 2 به تفصیل اطلاعات برنامه‌نویس و اشکال‌زدایی اضافی را نشان می‌دهد.

برنامه ترمینال تعاملی

به طور پیش‌فرض، verbosity روی 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

توجه : استفاده از CLI از 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.