هذا المتحكم الدقيق بقيمة 8 دولارات يشغّل نموذجًا لغويًا محليًا!

Transcript

00:00:00هذا نموذج لغوي يضم 28.9 مليون معامل يقوم بتوليد النصوص حالياً كلمة بكلمة
00:00:08على شريحة تبلغ تكلفتها حوالي ثمانية دولارات. لا يوجد واي فاي، ولا يتم إرسال أي شيء إلى خادم،
00:00:14كل شيء يحدث داخل ESP32S3، وهو متحكم دقيق يملك ذاكرة وصول عشوائي أقل من كمبيوتر
00:00:22من تسعينيات القرن الماضي. هذا أمر جنوني! كيف يعقل أن يكون هذا ممكناً حقاً؟ ما هو السر السحري وراء ذلك وكيف يمكننا
00:00:29بناء شيء مشابه؟ حسناً، هذه كلها أسئلة جيدة سنتناولها في فيديو
00:00:34اليوم. سيكون الأمر ممتعاً للغاية، فلنغوص فيه. شريحة ESP32S3 تمنحك
00:00:46512 كيلوبايت من ذاكرة SRAM، وتلك هي مساحة الذاكرة السريعة التي يمكن لهذه الشريحة الحساب بها. في العادة،
00:00:54إذا حاولت تشغيل نموذج لغوي كبير داخلها، فسيتعين على النموذج بأكمله الاستقرار هناك تماماً.
00:01:00آخر نموذج لغوي نجح أحد في تشغيله على شريحة كهذه كان حده الأقصى 260,000 معامل. لذا،
00:01:08هذا النموذج يحوي أكثر بحوالي 110 مرات، والشخص الذي حقق ذلك هو المطور الأوكراني “سلافا س”. إذن
00:01:16ما الحيلة السحرية؟ كيف فعلوا ذلك؟ كيف استطاعوا استيعاب نموذج بـ 28.9 مليون معامل على شريحة بـ 8 دولارات؟
00:01:24حسناً، التلتفاف يأتي من فكرة استخدمتها جوجل في Gemma. وتسمى التضمينات لكل طبقة (per-layer embeddings). معظم
00:01:31معاملات النموذج اللغوي لا تقوم بأي عمليات حسابية. بل تقبع في جدول تضمين يُقرأ منه فقط.
00:01:37إذا كانت معظم معاملتك تُستخدم للبحث فقط، فهي لا تحتاج ذاكرة سريعة. لذلك يمكنك الاكتفاء
00:01:44بترك ذلك الجدول مخزناً في ذاكرة فلاش بطيئة ورخيصة، وسحب الصفوف التي يحتاجها الرمز الحالي فقط. أما
00:01:52الجزء الصغير الذي يحسب ويفكر حقاً في الرمز التالي، مثل رأس الانتباه والتغذية الأمامية، فيبقى في SRAM.
00:01:59حسناً، هذا هو جانب الحساب. ولكن السؤال يظل قائماً: كيف نضع نموذجاً بهذا الحجم على شريحة ضئيلة كهذه؟
00:02:05جدول الـ 25 مليون صف يعيش في ذاكرة الفلاش. وهذا هو الجزء الأكبر من إجمالي
00:02:12معاملات النموذج البالغة 28.9 مليون معامل. وذاكرة الفلاش رخيصة وضخمة في هذه الشريحة بالذات، حيث تمتلك 16 ميجابايت منها.
00:02:20لذا بدلاً من محاولة حشر ذلك الجدول في الـ 512 كيلوبايت نفسها من SRAM،
00:02:26فهو يظل مستقراً في ذاكرة الفلاش. ونقوم بسحب حوالي ستة صفوف منه، صف واحد لكل طبقة من طبقات النموذج الست.
00:02:33وهذا يمثل حوالي 450 بايت إجمالاً. الآن، وقبل أن تتمادى في حماسك، يجب أن أشير إلى حقيقة
00:02:40أن هذا نموذج بسيط وغبي جداً. لن يكون كنموذج GPT التقليدي. لن يقوم بتوليد
00:02:47أكواد أو الإجابة عن أسئلة في مواضيع معقدة. لأنك لو حاولت تدريب نموذج عادي بهذا الحجم
00:02:53على مجموعة بيانات عادية، فإن 28 مليون معامل ستعطيك مجرد كلام فارغ غير مفهوم. لكن هذا النموذج تم تدريبه على
00:03:01Tiny Stories، وهي مجموعة بيانات صممها باحثون في مايكروسوفت، كُتبت ببساطة تعمدية لتكون
00:03:08سهلة حتى على نموذج مصغر ببضعة ملايين من المعاملات ليتعلم كتابتها بشكل مترابط. وتدريبه باستخدام لغة C المباشرة،
00:03:15على شريحة بلا نظام تشغيل وبلا مفسر بايثون، هي فكرة مستوحاة من مشروع Llama2.c الشهير
00:03:22للكاتب آندري كارباثي، والذي أظهر لنا أنه يمكنك تدريب نموذج لغوي صغير وتشغيل
00:03:28الاستنتاج عليه باستخدام ما لا يتعدى بضعة أسطر من لغة C المحمولة. وتلك هي الخطة الأساسية التي بُني عليها
00:03:35هذا المشروع بأكمله. بلولا كارباثي، لربما لم يكن هذا ممكناً من الأساس. إذن فهذا هو مبدأ عمله
00:03:40باختصار. والآن لنحاول بنائه بأنفسنا وتشغيله على الشريحة لنرى كيف سيكون أداؤه.
00:03:47لبناء هذا بأنفسنا حقاً، أول شيء تحتاجه هو العتاد المناسب، وتحديداً ESP32S3
00:03:54بذاكرة فلاش 16 ميجابايت وذاكرة PS RAM بسعة 8 ميجابايت. إنها النسخة N16R8. وهذا أمر هام
00:04:03جداً، لأنك هل تتذكر عندما تحدثنا عن جدول الـ 25 مليون صف في ذاكرة الفلاش؟ حسناً، بمفرده،
00:04:10بمجرد تدريبه وتصديره، يصل حجمه إلى حوالي 15 ميجابايت. واللوحات ذات ذاكرة الفلاش بحجم 4 أو 8 ميجابايت
00:04:17لن تتمكن ببساطة من استيعابه. لذا إن كنت تتسوق لشراء لوحة لتطبيق الخطوات معنا، فهذه هي المواصفة الوحيدة التي يجب عليك
00:04:22التأكد منها أولاً. الآن، عندما اطلعت لأول مرة على تعليمات المشروع الفعلية، كان الإعداد متناثراً
00:04:28عبر عدة ملفات مختلفة وكان يفترض وجود معلومات سابقة لم أكن أملكها أثناء البدء. لذا
00:04:34بدلاً من إرشادك خلالها تماماً كما هي مكتوبة، قمت بتجميع سكربت نُفّذ لمرة واحدة يقوم بكل
00:04:40شيء. يفحص اللوحة، ويثبت حزمة أدوات التطوير، ويجهز البيانات، ويدربها، ويصدرها، ويفحصها،
00:04:47ثم يبنيها ويرفعها على الشريحة دفعة واحدة. فلنذهب ونشغل هذا السكربت. وتنبيه سريع،
00:04:55إذا كنت تطبق الخطوات، فإن السكربت بالكامل يستغرق حوالي 25 دقيقة لينتهي. وربما يكون ذلك
00:05:00نفس الوقت الذي ستستغرقه لو قمت به خطوة بخطوة. يعود ذلك فقط لوجود العديد من الأوامر
00:05:05المستقلة التي يتعين عليك مراقبتها. ومعظم الوقت ينقضي في الواقع في تدريب نموذج القصص الصغير (Tiny Stories).
00:05:11استغرق ذلك حوالي 13 دقيقة على جهاز MacBook الخاص بي. وبمجرد اكتمال التدريب، ستلاحظ أن لمبات LED على اللوحة
00:05:18بدأت بالوميض. وتلك إشارة إلى أننا على وشك تحميل النموذج. وبمجرد تحميله،
00:05:24يمكننا أن نرى هنا المثال الأساسي الأول لقصة فتاة صغيرة. وبالفعل،
00:05:29فنحن نحصل على تسعة رموز في الثانية. ولكن ستلاحظ أنه عند نقطة معينة،
00:05:33سيُعيد القصة من جديد. فالنموذج يدور في نوع من الحلقات التكرارية. وإذا أردت
00:05:39إعطاءه موجه نصي مخصص، فقد أدرجت أيضاً سكربت تجريبي يمكنك استخدامه لتشغيل موجهاتك
00:05:44المخصصة. لذلك في هذا المثال، لنبدأ قصة عن آلي (روبوت). وهناك شيء آخر يجب ملاحظته وهو أنك لو
00:05:50غيرت الموجه، فسيتوجب عليك إعادة رفع السكربت على ESP32 مجدداً. وهذا من قيود هذه الطريقة.
00:05:56فهي لا تستطيع سوى تشغيل موجه واحد فقط مثبت مسبقاً في كل مرة. وكما ترون،
00:06:02فنحن نحصل بالفعل على ذكر للآلي في القصة. والقصة مختلفة بالفعل بعض الشيء هذه المرة.
00:06:08ولكن لاحظ ما يحدث بعد نهاية الفقرة. نعود مجدداً إلى قصة الفتاة
00:06:13الصغيرة. لذا ليس لدي أدنى فكرة عن سبب حدوث هذا. ولكن بوضوح، يميل النموذج للعودة إلى تلك
00:06:19القصة المحددة عن تلك الفتاة الصغيرة. ولنجرب مثالاً آخر. وهذه المرة، لنستخدم
00:06:24العبارة الشهيرة المكتوبة في بداية كل فيلم من أفلام “حرب النجوم” (Star Wars). ولنرَ إلى أين
00:06:30سينقلنا ذلك. هذا مثال مثير الاهتمام. يمكننا أن نرى أن النموذج ينجرف فوراً للعودة إلى
00:06:36سرد قصة الفتاة الصغيرة مجدداً. وأنا أفترض أنه بالنسبة لنموذج بهذا الحجم، فهو لا يفهم حتى
00:06:42ما هي المجرة. وربما لهذا السبب فهو يتجاهل الموجه المحدد الخاص بنا في هذه الحالة. و
00:06:47مرة أخرى، نرى أن الفقرة التالية تبدأ القصة نفسها. لذا، بالرغم من أن هذه التجربة
00:06:53مذهلة ورؤية نموذج ينتج تسعة رموز في الثانية على شريحة ميكروية ضئيلة هي أداء مدهش حقاً،
00:06:59إلا أنها تظل إثبات مفهوم محدود جداً. وكما رأينا، بغض النظر عما تطلبه من النموذج، فسوف
00:07:06ينجرف دائماً نحو سرد القصص لأن هذا ما تم تدريبه عليه. ولكن إذا وجدت هذا الاختبار
00:07:11ممتعاً، فقد قدمت فيديو آخر في مجال مشابه حيث اختبرت ما إذا كان جيل Raspberry Pi
00:07:18الأول يمكنه بالفعل تشغيل نموذج لغوي كبير حقيقي محلياً. لذا تفقد ذلك الفيديو إذا كنت مهتماً. وإلى هنا
00:07:24نصل للختام يا أصدقاء. هكذا تشغل نموذجاً لغوياً بـ 28.9 مليون معامل على شريحة ESP32. لقد اختبرناه
00:07:32وهو يعمل. تحية لـ “سلافا” على إنشاء هذا المشروع. ولكن ما رأيك في هذه التجربة؟
00:07:38هل ترى أي أمثلة من العالم الحقيقي قد يكون فيها هذا التطبيق مفيداً؟ شاركنا
00:07:43بأفكارك في قسم التعليقات بالأسفل. ويا أصدقاء، إذا كانت تعجبكم هذه الأنواع من الشروحات التقنية،
00:07:48فأخبروني بذلك عبر الضغط على زر الإعجاب أسفل الفيديو. وأيضاً لا تنسوا
00:07:53الاشتراك في قناتنا. كان معكم أندريس من Betterstack وسأراكم في الفيديوهات القادمة.

Description

A developer got a 28.9-million-parameter language model running entirely offline on an $8 ESP32-S3 microcontroller, a chip with just 512KB of RAM, using a memory trick borrowed from Google's Gemma architecture called Per-Layer Embeddings. In this video we break down how the trick actually works, reproduce the entire training and flashing process ourselves from a bare board, and put the model through some prompt tests of our own, including one it stubbornly refuses to follow. If you're curious how far you can push AI onto hardware that was never meant to run it, this one's for you. 🔗 Relevant Links Esp32-ai: https://github.com/slvDev/esp32-ai build_and_flash.sh: https://gist.github.com/andrisgauracs/ce459630660f82cf4ca7e43aa81604c7 run_prompt.sh: https://gist.github.com/andrisgauracs/e84b842d0f5e301485ecbf6654b0838e ❤️ More about us Radically better observability stack: https://betterstack.com/ Written tutorials: https://betterstack.com/community/ Example projects: https://github.com/BetterStackHQ 📱 Socials Twitter: https://twitter.com/betterstackhq Instagram: https://www.instagram.com/betterstackhq/ TikTok: https://www.tiktok.com/@betterstack LinkedIn: https://www.linkedin.com/company/betterstack 📌 Chapters: 00:00 Running an LLM on an $8 Chip 00:43 The ESP32’s Memory Problem 01:12 How Did They Make It Work? 01:30 The Per-Layer Embedding Trick 02:04 Fitting 28.9 Million Parameters 02:36 What This Tiny LLM Can Actually Do 02:58 TinyStories and Karpathy’s llama2.c 03:41 Building It Ourselves 03:47 Choosing the Right ESP32 04:23 The One-Shot Installation Script 04:52 Training and Flashing the Model 05:24 Testing the LLM at 9 Tokens per Second 05:38 Trying Custom Prompts 06:21 The Star Wars Prompt Test 06:51 Is an ESP32 LLM Actually Useful? 07:23 Final Thoughts

Community Posts

No posts yet. Be the first to write about this video!

Write about this video