إنشاء نموذج لغوي محلي (On-Device LLM) يدعم الإدخال الفوري باستخدام ESP32S3 وفلاش 16 ميجابايت
TuBrief 편집팀
2026년 8월 12일
0
Computing/Software원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
عندما تقرر تشغيل نموذج لغوي بـ 28.9 مليون معامل على لوحة ESP32-S3 بسعر 8 دولارات، ستشعر بالإحباط سريعاً. فالنموذج الذي يعمل بسلاسة في مقاطع العرض التوضيحي يتوقف عن الاستجابة بمجرد ربطه بالأجهزة الطرفية التي تصنعها بنفسك. فذاكرة SRAM لا تتجاوز 512 كيلوبايت، وإذا اضطررت إلى إعادة حرق قسم بحجم 15 ميجابايت في كل مرة تتغير فيها جملة واحدة، ستفقد أعصابك أثناء التطوير. للتغلب على هذه القيود وإنشاء جهاز يعمل بمدخلات لوحة المفاتيح الفعلية، يجب عليك تصميم التخزين المؤقت للذاكرة ومخازن الإدخال والإخراج بشكل مختلف تماماً منذ البداية.
إن إعادة حرق اللوحة في كل مرة تريد فيها تغيير جملة اختبار واحدة هو إهدار للوقت. من خلال ربط مقاطعة UART غير المتزامنة مع إشارات FreeRTOS الثنائية (Semaphores)، فلن تحتاج إلى إعادة تشغيل اللوحة. فبمجرد كتابة جملة عبر شاشة المراقبة التسلسلية أو لوحة المفاتيح، سيفهمها النموذج على الفور.
تتيح لك هذه التشكيلة تقليل الوقت المستغرق في تعديل واختبار النصوص بنسبة تزيد عن 80%.
`
+------------------+ +-------------------+ +--------------------+
| External UART | ---> | HW FIFO Buffer | ---> | SW Ring Buffer |
| (Keypad/Monitor) | | (120 Bytes) | | (2048 Bytes) |
+------------------+ +-------------------+ +--------------------+
|
v
+------------------+ +-------------------+ +--------------------+
| LLM Forward Pass | <--- | xPromptSemaphore | <--- | BTK1 Tokenizer |
| (Inference Task) | | (Binary Lock) | | (43,056 B Library) |
+------------------+ +-------------------+ +--------------------+
`
باستخدام هيكلية التضمينات حسب الطبقة (Per-Layer Embeddings - PLE) التي اقترحها باحثو Google Gemma 3n، يمكنك تقسيم نموذج بحجم 14.9 ميجابايت تم تقليصه إلى 4 بتات وتحميله. ضع جدول التضمينات الذي يبلغ 25 مليون معامل في ذاكرة فلاش SPI بحجم 16 ميجابايت، وضع أوزان رأس الإخراج (Output Head - 3.1 مليون معامل) وذاكرة التخزين المؤقت KV في ذاكرة PSRAM بحجم 8 ميجابايت. أما النواة الحسابية الكثيفة (Dense Compute Core) الأكثر استخداماً والتي تضم 559 ألف معامل ومخزون التنشيط الساخن (Hot Activation)، فيتم زرعها في ذاكرة SRAM بحجم 512 كيلوبايت.
إن رفع السرعة إلى أكثر من 14 رمزالً في الثانية ليس بالأمر السهل كما تبدو:
__attribute__((noinline)) مباشرة إلى دالة حساب matvec_i8_range. إذا قام المترجم (Compiler) بتضمين الكود تلقائياً (Inlining)، فس يحدث خطأ في ذاكرة التخزين المؤقت I-RAM وترتفع وقت الحسابات من 94.9 مللي ثانية إلى 155.2 مللي ثانية بدلاً من التحسن.ple_model_proj و qkv على نوى Dual Xtensa LX7 في ESP32-S3. لا يمكن الوصول إلى السرعة المطلوبة إلا بتشغيل النواتين في نفس الوقت.عند إجراء النقل (Porting) بلغة C البسيطة، ستكون السرعة محبطة للغاية عند 0.57 رمزالً في الثانية. ولكن بمجرد الانتهاء من تهيئة INT8 والتخزين المؤقت في SRAM، تتجاوز السرعة 14.0 رمزالً في الثانية.
| مرحلة التحسين | زمن التأخير الحسابي لكل رمز | عدد الرموز المنشأة في الثانية | التقنيات الرئيسية المستخدمة |
|---|---|---|---|
| النقل البحت بلغة C (الأساس) | 1,757.2 مللي ثانية | 0.57 رمز/ثانية | نواة واحدة، حسابات FP32 |
| تحسين Scalar وتحميل Head على PSRAM | 193.9 مللي ثانية | 4.61 رمز/ثانية | تخصيص Output Head على PSRAM |
| تطبيق FP32 ثنائي النواة | 139.4 مللي ثانية | 6.22 رمز/ثانية | حسابات مقسمة للطبقات على النواتين |
| تحسين SRAM + INT8 Staging | 94.9 مللي ثانية | 9.88 رمز/ثانية | تقييس INT8، تطبيق noinline |
| توسيع مخزن التحميل المسبق SRAM | ~71.4 مللي ثانية | 14.0+ رمز/ثانية | التحميل المسبق للطبقات الأولى في SRAM |
إذا استمر تشغيل النواتين بتردد 240 ميجاهرتز، فسيرتفع استهلاك التيار إلى 210 مللي أمبير (777 ميجاوات). بغض النظر عن سخونة اللوحة، ستفقد البطارية شحنها في لمح البصر. يجب استخدام أمر esp_pm_configure لخفض التردد إلى 40 ميجاهرتز وتفعيل السكون الخفيف التلقائي عندما لا تكون هناك عمليات استدلال.
esp_pm_config_esp32s3_t، اضبط max_freq_mhz على 240 و min_freq_mhz على 40، وفعل خيار light_sleep_enable.esp_sleep_pd_config(ESP_PD_DOMAIN_VDDSDIO, ESP_PD_OPTION_ON). يجب الحفاظ على طاقة فلاش SPI والذاكرة حتى في حالة السكون لكي لا تُفقد البيانات.uart_set_wakeup_threshold و esp_sleep_enable_uart_wakeup لضبط مقاطعة الاستعادة بحيث يستيقظ وحدة المعالجة المركزية (CPU) من وضع السكون فور ورود إشارة تسلسلية.إذا استمرت العمليات باستخدام بطارية ليثيوم بوليمر 3.7 فولت بسعة 1000 مللي أمبير/ساعة دون توقف، فلن تدوم سوى 4.7 ساعات. ولكن في وضع السكون الخفيف، ينخفض التيار بشكل حاد إلى 0.24 مللي أمبير (0.88 ميجاوات). في بيئة الاستخدام الفعلية التي تتخللها أوقات انتظار، يتم الحفاظ على متوسط التيار في حدود 15 إلى 30 مللي أمبير، مما يزيد من وقت استخدام البطارية لأكثر من 3 أضعاف.