غيّرت Apple Silicon بشكل أساسي مشهد الاستدلال المحلي لنماذج اللغة الكبيرة (LLM). من خلال الاستفادة من بنية الذاكرة الموحدة في شرائح M1 وM2 وM3، يمكن للمطورين تشغيل نماذج كبيرة محليًا دون عقوبات الكمون المرتبطة عادةً بنقل البيانات بين المعالج المركزي (CPU) والوحدة الرسومية (GPU). ومع ذلك، فإن تحقيق الأداء الأقصى يتطلب أكثر من مجرد تجميع الكود؛ فهو يتطلب نهجًا استراتيجيًا لاختيار الواجهة الخلفية وإدارة الذاكرة. في هذا الدليل، سنستكشف كيفية تحسين llama.cpp لاستخلاص كل دورة من عتاد ماك الخاص بك.
فهم الواجهة الخلفية Metal
بشكل افتراضي، يتم تجميع llama.cpp مع تفعيل دعم Metal على نظام macOS. وهذا أمر بالغ الأهمية لأن محولات أداء Metal (MPS) توفر نوى (kernels) مُحسّنة للغاية لعمليات ضرب المصفوفات، والتي تشكل العمود الفقري الحسابي لنماذج Transformer. على عكس CUDA على وحدات معالجة الرسوميات من NVIDIA، والتي تتمتع بنظام بيئي ناضج من المكتبات، تم تصميم واجهة Metal الخلفية في llama.cpp لتقليل العبء الناتج عن إطلاق النوى. عند تنفيذ الاستدلال، يتم تخزين المتجهات (tensors) مباشرةً في ذاكرة GPU، مما يتيح وصولاً سريعاً. المفتاح للأداء هنا هو التأكد من أن عملية البناء الخاصة بك تستخدم فعلياً واجهة Metal الخلفية وليس العودة إلى التنفيذ على المعالج المركزي فقط، والذي سيؤدي إلى اختناق كبير في الإنتاجية.
الاستفادة من بنية الذاكرة الموحدة
يسمح نظام الذاكرة الموحدة في Apple Silicon لكل من المعالج المركزي والوحدة الرسومية بالوصول إلى نفس حوض الذاكرة دون نسخ صريح. بالنسبة لنماذج اللغة الكبيرة، هذا تغيير جذري. تتطلب إعدادات وحدات معالجة الرسوميات المنفصلة التقليدية نقل أوزان النموذج من ذاكرة النظام (RAM) إلى ذاكرة الفيديو (VRAM)، وهي عملية قد تستغرق ثوانٍ أو حتى دقائق للنماذج الكبيرة. على Apple Silicon، تقيم أوزان النموذج في الذاكرة الموحدة، ويمكن للوحدة الرسومية الوصول إليها عبر وصلات عالية النطاق. هذا يلغي خطوة "النقل" (offload) بالكامل. ومع ذلك، يجب أن تتأكد من تحميل نموذجك في ذاكرة GPU بشكل صحيح. في llama.cpp، يتم التحكم في ذلك بواسطة معامل -ngl (عدد طبقات GPU).
إعدادات عملية لتحقيق أقصى إنتاجية
لتحقيق إنتاجية عالية، تحتاج إلى موازنة عدد الطبقات المنقولة إلى GPU مع نطاق الذاكرة المتاح لديك. فيما يلي مثال عملي على كيفية تشغيل نموذج LLaMA 2 كمّي (quantized) بأعلام (flags) مثالية لشريحة M2 Max:
# تحميل النموذج مع جميع الطبقات على GPU
# -ngl 99 يضمن نقل جميع الطبقات الممكنة إلى GPU
# -c 4096 يضبط حجم نافذة السياق
# -b 512 يضبط حجم الدفعة (batches الأكبر غالباً تعطي إنتاجية أفضل)
./llama-cli -m ./llama-2-13b-q4_K_M.gguf -ngl 99 -c 4096 -b 512
لاحظ استخدام -b 512. على الرغم من أن حجم الدفعة الأكبر يستهلك ذاكرة أكثر، إلا أنه يسمح للوحدة الرسومية بمعالجة رموز متعددة (tokens) بالتوازي، وهو أمر حاسم لتحقيق معدلات عالية من الرموز في الثانية (TPS). إذا كنت مقيداً بالذاكرة، يمكنك تقليل هذا الرقم، ولكن ابدأ بارتفاع وانزل تدريجياً حتى تلاحظ انخفاضاً في الأداء.
نصائح متقدمة: التكميم والسياق
التكميم (Quantization) هو الرافعة الرئيسية الثانية للأداء. استخدام مخطط تكميم 4 بت (مثل Q4_K_M أو Q4_0) يقلل من البصمة الذاكرة بشكل كبير، مما يترك مساحة أكبر لنافذة السياق وحجم الدفعة. على Apple Silicon، غالباً ما يكون النطاق الترددي (bandwidth) هو العامل المحدد بدلاً من القدرة الحسابية الخام. من خلال تقليل كمية البيانات التي تحتاج إلى النقل بين وحدات الذاكرة، يؤثر التكميم مباشرةً على سرعة الاستدلال. بالإضافة إلى ذلك، حافظ على نافذة السياق أصغر ما يمكن عملياً. سياق 4096 رمزاً يكون عادةً كافياً لمعظم تطبيقات الدردشة وسيؤدي إلى توليد رموز أسرع من سياق 16k.
مراقبة الأداء
للتحقق من أن تحسيناتك تعمل، قم بمراقبة استخدام GPU باستخدام Activity Monitor في نظام macOS. ابحث عن تبويب "GPU" وتأكد من أن عمليةك تستخدم نوى GPU بنشاط. إذا رأيت استخداماً منخفضاً لـ GPU على الرغم من الاستخدام العالي للمعالج المركزي، فقد لا تكون قد نقلت طبقات كافية إلى GPU. يجب أن يؤدي زيادة معامل -ngl إلى نقل العبء إلى واجهة Metal الخلفية.
الخلاصة
تحسين llama.cpp لـ Apple Silicon هو مزيج من فهم بنية العتاد وضبط معاملات البرمجيات. من خلال الاستفادة من واجهة Metal الخلفية ونظام الذاكرة الموحدة، يمكنك تحقيق سرعات استدلال محلي تنافس واجهات برمجة التطبيقات السحابية للعديد من حالات الاستخدام. ابدأ بنموذج كمّي 4 بت، وانقل جميع الطبقات إلى GPU، وضبط حجم الدفعة للعثور على النقطة المثالية لإعداد عتادك المحدد. بهذه الاستراتيجيات، يصبح ماك الخاص بك أداة قوية لتطوير الذكاء الاصطناعي الخاص عالي الإنتاجية.