تشغيل استدلال LLM خفيف على الموبايل والمتصفح باستخدام WebGPU وWASM: دليل عملي

١٨ مارس ٢٠٢٦
Close-up of colorful programming code on a computer screen, showcasing digital technology.

مقدمة سريعة: لماذا WebGPU + WASM الآن مهمّان للتطبيقات العربية؟

تشغيل استدلال LLM على جهاز المستخدم (الموبايل أو المتصفح) يقلل زمن الاستجابة، يحسّن خصوصية البيانات، ويخفض تكلفة الخوادم. مع وصول دعم WebGPU لبيئة المتصفّحات وانتشار تحسينات WebAssembly الحديثة، أصبح بالإمكان تشغيل نماذج خفيفة مُكمّنة بواسطة الكمّيات (quantized) محلياً وبزمن استجابة مقبول.

المزج بين واجهة WebGPU لحسابات الـGPU في المتصفّح وملفات WASM/wasm‑runtime للـC/C++ أو Rust يوفّر مسار عملي لتسريع الانفرانس بدون خادم. تقارير ومشروعات حديثة تُظهر اعتماد مشاريع مثل ONNX Runtime Web وWebLLM على WebGPU لتسريع الاستدلال داخل المتصفّح، وهو ما يفتح آفاقاً لتطبيقات عربية تعمل دون إرسال النصوص إلى سحابة طرف ثالث.

مخطط عملي: من النموذج إلى المتصفح/الموبايل (خطوات متسلسلة)

  1. اختيار نموذج مناسب للحجم والذاكرة: استهدف نماذج مُصغّرة (مثل Tiny/Llama‑small/quantized 4‑/5‑bit) أو نماذج مصممة للحدّ الأدنى من الذاكرة.
  2. الكمّ والتقليص (Quantization & Pruning): استخدم أدوات تحويل إلى صيغ منخفضة الدقة (Q4/Q5/Q6/AWQ) لحفظ الوزن وتقليل استخدام الذاكرة.
  3. تحويل النموذج لصيغة متوافقة مع المتصفّح: أنشئ نسخة GGUF/ONNX أو حوّل إلى ملف WASM/wasm‑lib مناسب (WebLLM، ONNX Runtime Web، أو binding لـllama.cpp).
  4. اختيار runtime داخل المتصفح: إذا كان الهدف دعم تسريع GPU فاختر WebGPU‑accelerated runtimes (مثل WebLLM أو ONNX Runtime Web). أما كخيار fall‑back فاستعمل WASM CPU runtime (مثل wllama/llama.cpp WASM bindings) لضمان التوافق عندما لا يتوفر WebGPU.
  5. تحميل موزّع للوزن (Streaming / Range Requests): قسّم ملفات الوزن إلى قطع صغيرة وقم بتحميلها تدريجياً عند الحاجة لتقليل وقت الانتظار والذاكرة الفورية.
  6. تحسين تجربة المستخدم: استخدم مؤشر تقدم، partial streaming للنتائج، وقيود على سياق الدردشة (windowing) لتقليل متطلبات الذاكرة أثناء الحوار.

أمثلة أدوات ومشروعات يمكن الاعتماد عليها: WebLLM (محرك WebGPU عالي الأداء)، ONNX Runtime Web (يدعم WebGPU backend)، وواجهات WASM لـllama.cpp (wllama) كخيار احتياطي.

اعتبارات الأداء والتوافق على الموبايل والمتصفّح

دعم المتصفحات والحدود العملية

اعتبار التوافق مهم: في نهاية 2025 وبداية 2026 شهدت منصّة الويب انتشار دعم WebGPU عبر المتصفّحات الرئيسية، مما يجعل WebGPU مساراً قابلاً للاعتماد في مشاريع الإنتاج لكن لا يزال يجب فحص توافره على جهاز المستخدم قبل الاعتماد الحصري عليه. عند عدم توفر WebGPU يجب التراجع إلى تشغيل WASM على CPU أو إظهار خيار خفيف (fallback).

الذاكرة وحجم النموذج

القيود التاريخية للـWASM (ذاكرة 32‑bit تُقيد إلى ~4GB) كانت حاجزاً لتشغيل نماذج كبيرة داخل المتصفح. تحديثات WebAssembly (Wasm 3.0 وميزة Memory64) تفتح سقفاً أكبر للذاكرة داخل بيئات Wasm الحديثة، ما يجعل تحميل نماذج أكبر أكثر واقعية على المتصفّح في الأجهزة القوية أو عبر بيئات WASI مُحدّثة. لكن التطبيق العملي يتطلب اختبار القيود على المنصّة المستهدفة (iOS/Android/desktop) لأن الحدود النهائية قد تختلف بحسب المتصفّح والنسخة.

الطاقة والبطارية

على الأجهزة المحمولة، الـGPU المحلي قد يستهلك طاقة أكبر؛ لذلك في وضع الموبايل ننصح بتشغيل نماذج أصغر، استخدام استدلال متقطع (on‑demand) وقياس استهلاك الطاقة خلال اختبارات الحقل. إذا تطلبت الدقة موارد أعلى، ففكّر بمعمارية هجينة: inference خفيف محلي + استدعاء edge/server لنوبات معالجة معقّدة.

تشغيل خارج المتصفّح (WASI / wasi‑gfx)

للتشغيل على بيئات edge أو runtimes مبنيّة على WASI، تحسّن مشاريع مثل wasi‑gfx من قابلية تشغيل WebGPU‑style code خارج المتصفّح وتمكين إعادة استخدام شيفرة WebGPU مع تغييرات بسيطة، ما يفيد تطبيقات edge أو حاويات خفيفة تعمل قرب المستخدم.

خلاصة سريعة: قائمة مراجعة ونموذج عملي صغير

قائمة مُركّزة قبل النشر:

  • تحقق من وجود WebGPU (feature detect) قبل تحميل نسخة WebGPU من runtime.
  • قدّم مسار fall‑back إلى WASM CPU runtime (مثلاً wllama أو llama.cpp WASM bindings).
  • استخدم كوانتيزيشن (Q4/Q5) وتقسيم الوزن لتقليل حجم التحميل.
  • قِس استهلاك الذاكرة/الطاقة على الأجهزة المستهدفة واختبر على Android وiOS (نسخ المتصفحات الحديثة).
  • ضع سياسات خصوصية واضحة (عدم رفع بيانات حساسة للخادم إذا كان الهدف تشغيل محلي).

مقتطف كود (فحص WebGPU بسيط)

if ('gpu' in navigator) {
  // متصفح يدعم WebGPU — تابع تحميل runtime WebGPU
} else {
  // استخدم WASM CPU runtime كـ fallback
}

مصادر مرجعية سريعة للمتابعة والقراءة: مقالات web.dev حول دعم WebGPU، ONNX Runtime Web للانفرانس عبر WebGPU، مشروع WebLLM كمحرّك WebGPU للـLLM، وواجهات WASM لــllama.cpp (wllama). للفرق التي تهدف لتشغيل نماذج أكبر داخل المتصفّح راجع التقدّم في WebAssembly (Wasm 3.0 / Memory64).

إذا رغبتَ، أستطيع تزويدك بمثال مشروع React/Flutter + WebLLM جاهز للتجربة مع تعليمات خطوة‑بخطوة لتجهيزه لملفات GGUF/ONNX مخفّضة الحجم ودمجه في PWA قابلة للتثبيت على الموبايل.