Gemma C++ টিউটোরিয়াল (gemma.cpp)

gemma.cpp হল একটি হালকা ওজনের বিশুদ্ধ C++ অনুমান Gemma মডেলের রানটাইম বাস্তবায়ন।

জেমা সম্পর্কে অতিরিক্ত তথ্যের জন্য, মডেল কার্ডটি দেখুন। মডেলের ওজন, যার মধ্যে gemma.cpp নির্দিষ্ট আর্টিফ্যাক্ট রয়েছে, Kaggle এ উপলব্ধ

কার জন্য এই প্রকল্প?

আধুনিক এলএলএম ইনফরেন্স ইঞ্জিনগুলি হল অত্যাধুনিক সিস্টেম, প্রায়শই প্রথাগত নিউরাল নেটওয়ার্ক রানটাইমের বাইরে বিস্তৃত বেসপোক ক্ষমতা সহ। এর সাথে উচ্চ স্তরের অ্যালগরিদম এবং নিম্ন-স্তরের গণনার সহ-ডিজাইন এর মাধ্যমে গবেষণা এবং উদ্ভাবনের সুযোগ আসে। যাইহোক, ডিপ্লয়মেন্ট-ভিত্তিক C++ ইনফারেন্স রানটাইমগুলির মধ্যে একটি ব্যবধান রয়েছে, যা পরীক্ষার জন্য ডিজাইন করা হয়নি, এবং পাইথন-কেন্দ্রিক এমএল গবেষণা কাঠামো, যা সংকলনের মাধ্যমে নিম্ন-স্তরের গণনাকে বিমূর্ত করে।

gemma.cpp Gemma 2B এবং 7B মডেলগুলির একটি ন্যূনতম বাস্তবায়ন প্রদান করে, সম্পূর্ণ সাধারণতার পরিবর্তে সরলতা এবং প্রত্যক্ষতার উপর ফোকাস করে। এটি ggml , llama.c , এবং llama.rs এর মতো উল্লম্ব-একীভূত C++ মডেল বাস্তবায়ন দ্বারা অনুপ্রাণিত।

gemma.cpp পরীক্ষা-নিরীক্ষা এবং গবেষণা ব্যবহারের ক্ষেত্রে লক্ষ্য করে – বিশেষ করে, Google হাইওয়ে লাইব্রেরির মাধ্যমে পোর্টেবল SIMD ব্যবহার করে CPU অনুমান এবং অনুমান অ্যালগরিদমের নকশা স্থান অন্বেষণ করা। এটি ন্যূনতম নির্ভরতা সহ অন্যান্য প্রকল্পগুলিতে এম্বেড করা সহজ এবং একটি ছোট ~2K LoC কোর বাস্তবায়নের সাথে সহজে পরিবর্তনযোগ্য (সমর্থক ইউটিলিটির ~4K LoC সহ) উদ্দেশ্যে করা হয়েছে।

উৎপাদন-ভিত্তিক প্রান্ত স্থাপনার জন্য, আমরা JAX, Keras, PyTorch এবং ট্রান্সফরমারের মতো পরিপক্ক পাইথন ফ্রেমওয়ার্ক ব্যবহার করে স্ট্যান্ডার্ড স্থাপনার পথের সুপারিশ করি ( এখানে সমস্ত মডেলের বৈচিত্র্য )।

বড় এবং ছোট সম্প্রদায়ের অবদান স্বাগত জানাই। এই প্রকল্পটি Google-এর ওপেন সোর্স সম্প্রদায় নির্দেশিকা অনুসরণ করে৷

দ্রুত শুরু

এই কুইকস্টার্টটি সম্পূর্ণ করতে, আপনাকে অবশ্যই ক্লোন করতে হবে বা gemma.cpp ডাউনলোড করতে হবে।

সিস্টেমের জন্য আবশ্যক

শুরু করার আগে, আপনার ইনস্টল করা উচিত:

ধাপ 1: Kaggle থেকে মডেল ওজন এবং টোকেনাইজার পান

কাগলের জেমা মডেল পৃষ্ঠাতে যান এবং `মডেল বৈচিত্র্য নির্বাচন করুন

জেমা সি++ . On this tab, the ভেরিয়েশন` ড্রপ-ডাউনে নিচের বিকল্পগুলি অন্তর্ভুক্ত রয়েছে। নোট করুন bfloat16 ওজনের বিকল্পগুলি উচ্চতর বিশ্বস্ততা, যখন 8-বিট সুইচ করা ফ্লোটিং পয়েন্ট ওজন দ্রুত অনুমান সক্ষম করে।

2B ইন্সট্রাকশন-টিউনড ( it ) এবং প্রাক-প্রশিক্ষিত ( pt ) মডেল:

ণশড বর্ণনা
2b-it 2 বিলিয়ন প্যারামিটার ইন্সট্রাকশন-টিউনড মডেল, bfloat16
2b-it-sfp 2 বিলিয়ন প্যারামিটার নির্দেশ-সুরিত মডেল, 8-বিট সুইচড ফ্লোটিং পয়েন্ট
2b-pt 2 বিলিয়ন প্যারামিটার প্রাক-প্রশিক্ষিত মডেল, bfloat16
2b-pt-sfp 2 বিলিয়ন প্যারামিটার প্রাক-প্রশিক্ষিত মডেল, 8-বিট সুইচড ফ্লোটিং পয়েন্ট

7B ইন্সট্রাকশন-টিউনড ( 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 ব্যবহার করে। জেমা ইনফারেন্স রানটাইম তৈরি করতে, একটি বিল্ড ডিরেক্টরি তৈরি করুন এবং শীর্ষ-স্তরের প্রকল্প ডিরেক্টরি থেকে cmake ব্যবহার করে বিল্ড ফাইল তৈরি করুন:

(cd build && cmake ..)

তারপর ./gemma এক্সিকিউটেবল তৈরি করতে make চালান:

cd build make -j [number of parallel threads to use] gemma

উদাহরণস্বরূপ, make -j 8 gemma । এটি সফল হলে, আপনার এখন build/ ডিরেক্টরিতে এক্সিকিউটেবল একটি gemma থাকা উচিত।

ধাপ 4: চালান

আপনি এখন build/ ডিরেক্টরির ভিতর থেকে gemma চালাতে পারেন।

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 ডিফল্ট স্ট্যান্ডার্ড ব্যবহারকারী-মুখী টার্মিনাল UI।
--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

দ্রষ্টব্য : gemma.cpp-এর CLI ব্যবহার পরীক্ষামূলক এবং প্রসঙ্গ দৈর্ঘ্যের সীমাবদ্ধতা বিবেচনায় নেওয়া উচিত।

উপরের কমান্ডের আউটপুট এর মত হওয়া উচিত:

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