كيف نجعل في Ultralytics نماذج YOLO أسرع على شريحتك المفضلة
كيف تحسّن Ultralytics نماذج YOLO لزيادة السرعة عبر وحدات CPU ووحدات GPU والأجهزة الطرفية. سنشرح الشرائح والذاكرة وتقنيات ذكية مثل التكميم والدمج والتقليم.

في Ultralytics، نطوّر نماذج الرؤية الحاسوبية؛ وبعبارة أخرى، نعلّم الحواسيب كيف ترى! فكّر في هذه النماذج باعتبارها وصفات رياضية عملاقة. فهي تتكوّن من عمليات (نسمّيها طبقات) وكومة هائلة من الأرقام نسمّيها أوزانًا.
تعالج نماذج Ultralytics YOLO الصور على حقيقتها: مصفوفات من الأرقام! فكل بكسل ليس في الواقع سوى قيم لونية، أي مقدار الأحمر والأخضر والأزرق (ومن هنا RGB) لكل نقطة تكوّن الصورة. نسمّي هذه المصفوفات الرقمية «موترات» لأن ذلك يبدو أروع بكثير من «مصفوفات متعددة الأبعاد»، التي تبدو بدورها أروع بكثير من «أرقام مكدّسة فوق أرقام مكدّسة فوق أرقام».
عندما تُدخل صورة إلى نموذجنا، تبدأ رحلة ملحمية عبر الشبكة. تخيّل موترك يتنقّل عبر طبقة تلو الأخرى، ويتحوّل ويلتوي ويتشوّه رياضيًا بأجمل طريقة ممكنة. فكّر في الأمر كحفلة رقص تختلط فيها الأرقام وتتفاعل، فتستخلص جوهر ما يجعل القطة قطة والسيارة سيارة. نسمّي هذه العملية استخراج السمات.
ما الذي يخرج من الطرف الآخر؟ المزيد من الأرقام! أرقام ذات معنى. في مهام الكشف، تخبرك هذه الأرقام بدقة بمكان الأشياء في صورتك وماهية تلك الأشياء على الأرجح. «مرحبًا، هناك احتمال بنسبة 95% أن يكون ذلك كلبًا عند الإحداثيات (x, y)!» نسمّي هذه العملية السحرية الاستدلال.
لكن قبل أن تتمكن نماذجنا من أداء سحرها، يجب أن تذهب إلى المدرسة؛ أي يجب تدريبها. ومرحلة التدريب هي حيث تشتد الأمور.
أثناء التدريب، في كل مرة نعرض فيها صورة على الشبكة، لا نحصل على إجابة فحسب. بل ننفّذ أمرين إضافيين بالغَي الثقل. أولًا، نحسب مدى خطأ الشبكة (نسمّي ذلك الخسارة، أي المسافة عن مركز الهدف تقريبًا). ثانيًا، وهذا هو الجزء المهم، نحدّث كل رقم (أو وزن) في الشبكة استنادًا إلى تلك الخسارة. فكّر في الأمر كضبط آلاف المقابض الصغيرة في آن واحد، بحيث يُحسَب كل تعديل لجعل الشبكة أكثر دقة في كل مرة.
نحن ندرّب الشبكة أساسًا من خلال التصحيح: فكل خطأ يعلّمها ما لا ينبغي فعله، ونعدّل كل تلك الأوزان لكي تقترب من الإجابة الصحيحة عندما ترى صورة مشابهة مرة أخرى. وباختصار، تتعلّم الشبكة بدفعها تدريجيًا في الاتجاه الصحيح، خطأً بعد خطأ، حتى تبدأ بإتقان التنبؤات.
عن كم عدد من الأرقام نتحدث؟ حسنًا، يحتوي YOLO11n الصغير اللطيف على بضعة ملايين من المعلمات. أما YOLO11x؟ فهذا العملاق يضم أكثر من 50 مليون معلمة! وتعني المعلمات الأكثر إمكانية ترميز تفاصيل أكثر، مثل الفرق بين الرسم بأقلام التلوين وامتلاك لوحة ألوان فنان كاملة.
أثناء الاستدلال، يصبح عدد المعلمات هذا بالغ الأهمية. فتشغيل شبكة تضم 3 ملايين معلمة يشبه الركض حول الحي. أما تشغيل شبكة تضم 50 مليون معلمة؟ فهو أشبه بالركض في ماراثون أثناء التلاعب بمشاعل ملتهبة.
إذًا، ما الحوسبة بالضبط؟ كيف تحدث كل هذه العمليات الحسابية على الأرقام فعليًا؟ كيف نجعلها أسرع؟ وماذا يعني «تحسين الحوسبة» أصلًا؟
كيف تنفّذ الشرائح العمليات الحسابية فعليًا#
تحدث الحوسبة باستخدام الشرائح. وهذه المربعات الصغيرة من السيليكون تشبه في الأساس أكثر قلاع الرمال تنظيمًا في الكون. فكل عملية ينفّذها حاسوبك، وكل جمع وكل مقارنة وكل عبارة «إذا حدث هذا فافعل ذاك»، منحوتة فعليًا داخل السيليكون. توجد دوائر مادية فعلية في مناطق محددة من الشريحة مخصّصة لجمع الأرقام، وأخرى للعمليات المنطقية. الأمر أشبه بمدينة صغيرة تتخصص أحياؤها المختلفة في أنواع مختلفة من الرياضيات.
قد يبدو هذا غريبًا، حتى لو كنت عالم حاسوب. والسبب أننا أمضينا الأربعين سنة الماضية في بناء طبقة من التجريد فوق أخرى، مثل لازانيا تقنية ارتفعت إلى حد أننا لم نعد نرى الطبق السفلي. لقد بسّطنا الأمور بدرجة كبيرة، حتى إن معظم المبرمجين اليوم لا يعرفون كيف تحدث الحوسبة فعليًا داخل السيليكون. وليس ذلك خطأهم، بل نتيجة التصميم!
لنقشّر هذه الطبقات. إليك شيفرة Python البسيطة جدًا:
x = 1
if x == 1:
y = x + 1نحن ننشئ متغيرًا x، ونسنده إلى 1، وإذا كان x يساوي 1 (تنبيه: إنه يساوي 1 فعلًا)، ننشئ y بالقيمة x زائد 1. ثلاثة أسطر. الأمر سهل.
لكن هنا يصبح الأمر مثيرًا للاهتمام. بين هذه الأسطر الثلاثة البريئة وبين تحرّك الإلكترونات فعليًا عبر السيليكون، توجد أربع طبقات ضخمة على الأقل من الترجمة (بل توجد طبقات أكثر في الواقع، لكن مدير المحتوى الرقمي لدينا يقول إن عدد كلماتي يسبّب لها القلق بالفعل). دعني أصطحبك في هذه الرحلة المحيّرة للعقل:
الطبقة 1: Python ← الرمز الثنائي أولًا، يقرأ Python شيفرتك ويصرّفها إلى شيء يُسمّى الرمز الثنائي، وهي لغة وسيطة أسهل على الحواسيب استيعابًا، لكنها ستتسبب في إرهاق عينيك إن حاولت قراءتها.
الطبقة 2: الرمز الثنائي ← شيفرة الآلة يأخذ مفسّر Python (مثل CPython) ذلك الرمز الثنائي ويترجمه إلى شيفرة الآلة، أي التعليمات الفعلية التي يفهمها المعالج. وهنا تتحول عبارتك الأنيقة "if x == 1" إلى شيء يشبه "LOAD register, COMPARE register, JUMP if zero flag set."
الطبقة 3: شيفرة الآلة ← الرمز المصغّر انعطافة مفاجئة! فالمعالجات الحديثة لا تنفّذ حتى شيفرة الآلة مباشرة. بل تفككها أكثر إلى رمز مصغّر، أي عمليات أصغر بكثير يمكن للمكوّنات الداخلية للشريحة التعامل معها. وقد تتحول تعليمة "ADD" الواحدة إلى عدة عمليات مصغّرة.
الطبقة 4: الرمز المصغّر ← الإلكترونيات المادية أخيرًا، نصل إلى السيليكون. تؤدي تلك العمليات المصغّرة إلى إطلاق إشارات كهربائية فعلية تتدفق عبر الترانزستورات. تنقلب مليارات المفاتيح الصغيرة تشغيلًا وإيقافًا، وترقص الإلكترونات عبر مسارات مصمّمة بعناية، وبطريقة سحرية ما، يصبح 1 + 1 مساويًا لـ 2.
توجد كل طبقة لإخفاء التعقيد الجنوني للطبقة التي تحتها. الأمر يشبه دمى التعشيش الروسية، باستثناء أن كل دمية تتحدث لغة مختلفة تمامًا، وأن أصغر دمية مصنوعة حرفيًا من برق محبوس في الرمل.
المفارقة؟ من المحتمل أن تؤدي أسطر Python الثلاثة هذه إلى تشغيل ملايين المفاتيح الترانزستورية. لكن بفضل هذه التجريدات، لا تحتاج إلى التفكير في أي من ذلك. كل ما عليك هو كتابة "y = x + 1" والثقة بأن السحر يحدث في مكان ما، عميقًا داخل السيليكون.
البنية#
تُنفّذ كل عملية تنفيذًا ماديًا داخل السيليكون، ويعتمد مكان حدوثها على الشريحة كليًا على طوبولوجيا الشريحة. الأمر أشبه بتخطيط المدن، لكن للإلكترونات. فهنا يوجد الجامع، وهناك يوجد المضاعِف، ويحتاج الجميع إلى التواصل بكفاءة.
لدينا مئات الشرائح المختلفة في السوق، صُمّمت كل منها لأغراض مختلفة. ما الذي يتغير بينها؟ الطوبولوجيا، أي كيفية تحديد مواضع العمليات وتنفيذها في المجال المادي. وهذا ما نسمّيه البنية، ولدينا عدد كبير منها:
- x86 (Intel وAMD) - جدّ الحوسبة المكتبية، معقّد لكنه قوي
- ARM - يشغّل هاتفك وبشكل متزايد حاسوبك المحمول، وصُمّم لتحقيق الكفاءة
- RISC-V - المتمرّد مفتوح المصدر، ويكتسب زخمًا في كل مكان
- PowerPC - وحش IBM، ولا يزال يعمل في أجهزة ألعاب الفيديو والخوادم
- MIPS - المفضّل أكاديميًا، بسيط وأنيق
- SPARC - إسهام Sun Microsystems (والتابعة الآن لـ Oracle) في الحوسبة عالية الأداء
- بنى GPU (أنوية CUDA من NVIDIA وRDNA من AMD) - وحوش المعالجة المتوازية
لا ترتّب كل بنية ترانزستوراتها بطريقة مختلفة فحسب، بل تتحدث أيضًا لغة مختلفة. فالتجريدات التي نستخدمها لإرسال التعليمات إلى هذه الآلات مختلفة تمامًا. الأمر يشبه الاضطرار إلى كتابة إرشادات سفر لشخص ما، لكنك قد تحتاج، اعتمادًا على سيارته، إلى الكتابة بالفرنسية أو الصينية أو بلغة الرقص التعبيري.
نبض السيليكون#
وقود شرائحنا هو الإلكترونات، أي الكهرباء التي تتدفق إلى الشريحة لتوفير الطاقة اللازمة للحوسبة. لكن الطاقة وحدها لا تكفي. لكي تعمل الشريحة فعلًا وتنقل البيانات عبر طوبولوجيتها المعقدة، يعتمد كل شيء على مكوّن بالغ الأهمية: الساعة. فهي التي تجعل الإلكترونات تتدفق عبر مسارات محددة في أوقات محددة. ومن دونها، لن يكون لديك سوى سيليكون مزوّد بالطاقة ولا يفعل شيئًا.
تخيّل محاولة تنسيق عرض ضخم يجب أن تتحرك فيه مليارات المكوّنات بتناغم تام. من دون إيقاع، ستعم الفوضى. وهذا بالضبط ما تفعله الساعة لمعالجك. إنها بلورة تهتز بمعدل ثابت بشكل مذهل، وترسل نبضات كهربائية مليارات المرات في الثانية.
عندما تسمع عبارة «معالج بسرعة 3.5 GHz»، فإن GHz (غيغاهرتز) هي سرعة الساعة، أي 3.5 مليارات نبضة في الثانية. وتُسمّى كل نبضة دورة ساعة، وهي وحدة الزمن الأساسية في الحوسبة.
لا يحدث أي شيء بين دورات الساعة. يتجمّد الحاسوب بأكمله منتظرًا النبضة التالية. إنه أشبه بأعنف لعبة «إشارة حمراء، إشارة خضراء» في الكون. وفي كل «إشارة خضراء» (نبضة الساعة):
- تنتقل البيانات بين المكوّنات
- تُنفّذ الحسابات
- تُتخذ القرارات المنطقية
- تُقرأ الذاكرة أو يُكتب فيها
تستغرق بعض العمليات دورة واحدة (مثل عملية جمع بسيطة)، بينما تستغرق عمليات أخرى دورات عديدة (مثل القسمة أو جلب البيانات من RAM). ويجري كل ذلك بتنسيق دقيق، إذ تنفّذ مليارات المكوّنات عملياتها المحددة، متزامنة جميعًا مع هذه النبضات المتواصلة.
يمكنك رفع تردد معالجك بجعل البلورة تهتز بسرعة أكبر؛ فيحدث كل شيء بسرعة أكبر، لكنه يولّد حرارة أكثر أيضًا ويصبح أقل استقرارًا. وإذا بالغت في ذلك، فسيتعطل حاسوبك لأن الإلكترونات تعجز حرفيًا عن مواكبة الإيقاع.
في الماضي، كانت هذه العمليات تُنفّذ باستخدام آلات بحجم الغرف. لكن المكوّنات التي تنفّذ كل هذه الحوسبة بسيطة بشكل ملحوظ: إنها مجرد مفاتيح. مفاتيح تشغيل وإيقاف.
صِل عددًا كافيًا من هذه المفاتيح معًا بالنمط الصحيح، وستحصل على حوسبة. فالثورة الرقمية بأكملها تختزل في ترتيب متطور للمفاتيح.
تعني هذه البساطة أنه إذا امتلكت مفاتيح، أي مفاتيح، فيمكنك بناء حاسوب. لقد بنى الناس حواسيب عاملة من أنابيب المياه والصمامات، وقطع الدومينو، ومكعبات LEGO، والكرات الزجاجية، وحتى من حجر الريدستون في Minecraft.
لم تتغير المبادئ منذ أربعينيات القرن العشرين. لقد أصبحنا بارعين للغاية في جعل المفاتيح صغيرة جدًا. يمتلك هاتفك قدرة حوسبية تفوق قدرة جميع الحواسيب التي أرسلت البشر إلى القمر، وهو يتسع في جيبك لأننا اكتشفنا كيفية صنع المفاتيح على المقياس الذري.
عندما نشغّل شبكات عصبية تضم ملايين المعلمات، فإننا نقلب هذه المفاتيح الصغيرة مليارات المرات في الثانية، متزامنة تمامًا مع نبض البلورة. فكل تحديث للوزن، وكل عملية ضرب مصفوفات، وكل دالة تنشيط، تسير جميعها على إيقاع الساعة.
لا عجب أن تدريب النماذج يجعل حاسوبك يبدو كأنه يحاول الإقلاع!
جعل الشبكات العصبية تنطلق بسرعة BRRRRR#
حسنًا، لدينا إذًا هذه الشرائح التي ترقص فيها مليارات المفاتيح على إيقاع بلورة، ونريد تشغيل شبكات عصبية تضم ملايين المعلمات عليها. ينبغي أن يكون الأمر سهلًا، أليس كذلك؟ ما عليك سوى إلقاء الأرقام على الشريحة وإطلاقها!
يشبه تشغيل الشبكات العصبية بسرعة محاولة طهي وجبة من خمسة أطباق في مطبخ تبعد ثلاجته ثلاثة مبانٍ، ولا تملك فيه سوى مقلاة واحدة، ويزن كل مكوّن 500 رطل. فالرياضيات نفسها ليست المشكلة الكبرى؛ بل كل ما عداها.
عدم توافق البنية#
صُمّمت معظم الشرائح لتشغيل Microsoft Word، لا الشبكات العصبية. فقد بُني CPU لديك على أساس أنه سيمضي حياته في تشغيل عبارات if والحلقات، وحساب ضرائبك أحيانًا (وهي العملية الحسابية الوحيدة التي تستنزف حتى الحواسيب الفائقة عاطفيًا). وهو محسّن للعمليات التسلسلية: نفّذ هذا، ثم ذاك، ثم الأمر الآخر.
لكن الشبكات العصبية مختلفة تمامًا. فهي تريد تنفيذ كل شيء في آن واحد. أثناء التدريب، تحدّث ملايين الأوزان استنادًا إلى مدى خطأ تنبؤاتك. وأثناء الاستدلال (أي استخدام النموذج المدرّب فعليًا)، تدفع البيانات عبر ملايين العمليات الحسابية المتزامنة. تخيّل أنك بحاجة إلى ضرب مليون رقم في مليون رقم آخر. يريد CPU لديك، بارك الله فيه، تنفيذها واحدًا تلو الآخر، مثل محاسب سريع جدًا لكنه منهجي للغاية.
لهذا أصبحت GPU العمود الفقري لحوسبة الذكاء الاصطناعي. فقد صُمّمت GPU لألعاب الفيديو، حيث تحتاج إلى حساب لون ملايين البكسلات في الوقت نفسه. واتضح أن حساب ألوان البكسلات وإجراء العمليات الرياضية للشبكات العصبية متشابهان على نحو مفاجئ: فكلاهما يتضمن تنفيذ العملية نفسها على كميات هائلة من البيانات بالتوازي.
لكن حتى GPU ليست مثالية للشبكات العصبية. ولهذا تبني الشركات الآن شرائح متخصصة للذكاء الاصطناعي (TPU وNPU وكل اختصار آخر ينتهي بـ PU). صُمّمت هذه الشرائح من الأساس لأداء مهمة واحدة: جعل الشبكات العصبية سريعة. إنها تشبه توظيف طاهٍ لا يعرف سوى طهي طبق واحد، لكنه يطهوه بسرعة تفوق البشر. وبينما يعاني CPU في تنفيذ عمليات المصفوفات تسلسليًا، ويتعامل GPU معها جيدًا إلى حد ما بالتوازي، تلتهم هذه الشرائح المتخصصة المصفوفات على الإفطار والغداء والعشاء.
جدار الذاكرة (أو: لماذا يصعب نقل البِتّات أكثر من إجراء العمليات الحسابية)#
في حوسبة الشبكات العصبية الحديثة، نقضي وقتًا وطاقة أكبر في نقل البيانات من الوقت والطاقة اللذين نقضيهما فعلًا في إجراء العمليات الحسابية عليها.
فكّر في شريحة حاسوبك كأنها عالم رياضيات بارع يعمل بسرعة البرق، لكن جميع مراجعه مخزّنة في مبانٍ مختلفة عبر المدينة. يستطيع حل أي معادلة فورًا، لكنه يحتاج أولًا إلى الحصول على الأرقام، وتستغرق تلك الرحلة وقتًا طويلًا.
يمكن لشريحتك ضرب رقمين في دورة ساعة واحدة (تذكّر أنها إحدى مليارات النبضات في الثانية). سرعة البرق! لكن جلب هذين الرقمين من الذاكرة إلى الشريحة؟ قد يستغرق مئات الدورات. الأمر أشبه بقدرة عالم الرياضيات على حل مسألة في ثانية واحدة، لكنه يحتاج إلى خمس دقائق سيرًا إلى المكتبة والعودة منها.
والسبب هو المسافة (والمساحة). تتحرك الكهرباء بسرعة، لكنها ليست لانهائية السرعة. وكلما زادت المسافة التي تقطعها البيانات على الشريحة، طال الوقت اللازم. وقد حلّ مصممو الحواسيب هذه المشكلة بإنشاء تسلسل هرمي للذاكرة، يشبه وجود مواقع تخزين متعددة على مسافات مختلفة:
- السجلات (مبنية مباشرة داخل وحدات الحوسبة): مكتب عالم الرياضيات. وصول فوري! لكنها صغيرة؛ فلا يمكنك الاحتفاظ هنا إلا بنحو 32 رقمًا. الأمر يشبه وجود ملاحظات لاصقة أمامك مباشرة.
- ذاكرة التخزين المؤقت L1 (على بُعد ميكرومترات): رف الكتب في المكتب. يستغرق التقاط شيء منها 3-4 دورات. ويمكنك هنا تخزين بضعة آلاف من الأرقام.
- ذاكرة التخزين المؤقت L2 (على بُعد مليمترات): خزانة الملفات في آخر الممر. تستغرق 10-15 دورة، وتتسع لبضعة ملايين من الأرقام.
- ذاكرة التخزين المؤقت L3 (في الجهة الأخرى من الشريحة): غرفة التخزين في الطابق السفلي. تستغرق 30-50 دورة، وتتسع لعشرات الملايين من الأرقام.
- RAM (على شريحة مختلفة تمامًا): المستودع عبر المدينة. تستغرق 100-300 دورة. وهنا تعيش مليارات أرقامك.
- SSD/القرص الصلب (متصل عبر الكابلات): مدينة أخرى بالكامل. يستغرق ملايين الدورات. تخزين هائل، وسرعة جليدية.
تختلف البنى الدقيقة؛ فقد تتجاوز شريحة هاتفك ذاكرة التخزين المؤقت L3، بينما قد يحتوي CPU الخادم على كميات هائلة منها. لكن المبدأ يظل نفسه: الذاكرة الأقرب أسرع، لكنها أصغر.
وهنا يبدأ الألم بالنسبة إلى الشبكات العصبية. تخيّل أن نموذج Ultralytics YOLO لديك يحتوي على 50 مليون معلمة (أما ChatGPT فيحتوي على مليارات، بالمناسبة). هذه 50 مليون قيمة يجب أن تنتقل من الذاكرة إلى وحدات الحوسبة والعودة إليها. وحتى إذا كان حجم كل رقم 4 بايتات فقط، فهذا يعني 200 ميغابايت من البيانات التي يجب نقلها عبر نظامك.
قد تعالج الشريحة كل رقم في دورة واحدة، لكن إذا استغرق جلب ذلك الرقم من RAM مئة دورة، فأنت تقضي 99% من وقتك في انتظار التسليم. الأمر يشبه امتلاك سيارة سباق Formula 1 عالقة في ازدحام مروري. كل تلك القدرة الحوسبية جالسة هناك، تنتظر وصول البيانات.
إليك الرؤية الحاسمة: هذه هي عنق الزجاجة في الحوسبة الحديثة. ويُسمّى ذلك عنق زجاجة von Neumann. إن جعل الشرائح أسرع في الرياضيات سهل نسبيًا. أما جعل الذاكرة أسرع، فيصطدم بحدود مادية. ولهذا يحدث كل تحسين الأداء تقريبًا في الذكاء الاصطناعي على مستوى الذاكرة. فعندما يسرّع المهندسون الشبكات العصبية، نادرًا ما يجعلون العمليات الحسابية أسرع؛ بل يجدون طرقًا ذكية لتقليل نقل البيانات، أو تخزينها مؤقتًا على نحو أفضل، أو الوصول إليها بذكاء أكبر.
لا تركّز شرائح الذكاء الاصطناعي الحديثة على سرعة الحوسبة فحسب؛ بل تولي اهتمامًا بالغًا لعرض نطاق الذاكرة واستراتيجيات نقل البيانات. فهي تجلب البيانات مسبقًا، وتعيد استخدام القيم الموجودة بالفعل في ذاكرة التخزين المؤقت، وتنظّم العمليات الحسابية لتقليل رحلات الذاكرة. والفائزون في سباق عتاد الذكاء الاصطناعي ليسوا من يملكون أسرع حاسبات، بل من اكتشفوا كيفية إبقاء تلك الحاسبات مزوّدة بالبيانات. فاللعبة بأكملها تدور حول تحسين أنماط الوصول إلى الذاكرة.
في كل مرة تنقل فيها بِتًا من البيانات، تحرق طاقة. ليست كمية كبيرة؛ فنحن نتحدث عن بيكوجولات، لكن عندما تنقل تيرابايتات في الثانية، تتراكم بسرعة. بل إن نقل البيانات مسافة 1mm عبر الشريحة يستهلك طاقة أكبر من إجراء العملية الحسابية نفسها!
لهذا يبدو حاسوبك المحمول كأنه محرك طائرة عند تدريب الشبكات العصبية. ليست الرياضيات هي التي تولّد الحرارة؛ بل نقل البيانات. فكل تحديث للمعلمات، وكل حساب للتدرج، وكل مرور أمامي، يسخّن غرفتك حرفيًا.
إن مسرّعات الذكاء الاصطناعي الحديثة تمارين في الديناميكا الحرارية أساسًا. ما مقدار الحوسبة التي يمكننا حشدها قبل أن تنصهر الشريحة؟ وما سرعة إبعاد الحرارة؟ الأمر أشبه بكسر سرعة المعالج، لكن الساعة مضبوطة دائمًا على 11، ونحن نحاول فقط ألّا نشعل حريقًا.
الحل؟ تصميم يراعي البنية#
ليست أسرع الشبكات العصبية بالضرورة أذكاها، بل هي المصمّمة مع وضع الشرائح في الحسبان. فهي:
- تحافظ على البيانات محليًا قدر الإمكان
- تعيد استخدام العمليات الحسابية بإصرار
- تتوافق تمامًا مع إمكانات العتاد
- تقلّل نقل الذاكرة مهما كانت التكلفة
الأمر يشبه الفرق بين وصفة تقول «استخدم مكوّنات من متجر البقالة المحلي» وأخرى تتطلب استيراد توابل من التبت، وجبن من فرنسا، وماء من القارة القطبية الجنوبية. قد يكون مذاق كلتيهما جيدًا، لكن إحداهما بالتأكيد أكثر عملية.
ولهذا فإن جعل الشبكات العصبية سريعة هو شكل من أشكال الفن. فلا يكفي امتلاك رياضيات جيدة؛ بل تحتاج إلى فهم العتاد، واحترام التسلسل الهرمي للذاكرة، والرقص بانسجام تام مع البنية.
مرحبًا بك في عالم تلتقي فيه علوم الحاسوب بالفيزياء والهندسة والسحر الخالص. عالم يكلف فيه نقل الرقم أكثر من إجراء العمليات الحسابية عليه. عالم تكون فيه المعالجة المتوازية سريعة، لكن التزامن قاتلًا. عالم لا يكون فيه عدوك الأكبر هو التعقيد، بل المسافة.
كيف نجعل YOLO أسرع#
عندما تدرّب نموذج YOLO، تحصل على شبكة عصبية تعمل بصورة رائعة على إعداد التدريب لديك. لكن إليك الحقيقة: إن GPU المخصّصة للألعاب، وهاتف iPhone، وتلك الشريحة الصغيرة في كاميرا المراقبة، تتحدث جميعها لغات مختلفة تمامًا. فلها نقاط قوة مختلفة، ونقاط ضعف مختلفة، وأفكار مختلفة جدًا حول كيفية معالجة البيانات.
فكّر في الأمر بهذه الطريقة: تحتوي GPU على آلاف الأنوية التي يمكنها العمل في الوقت نفسه، فهي مصمّمة للمعالجة المتوازية. وفي المقابل، قد تحتوي شريحة محمولة على دوائر خاصة مصمّمة تحديدًا لعمليات الذكاء الاصطناعي، لكنها لا تستطيع التعامل إلا مع أنواع معينة من الرياضيات. أما جهاز الحافة في كاميرا جرس بابك؟ فهو يحاول تشغيل الذكاء الاصطناعي بميزانية طاقة أصغر من ميزانية مصباح LED.
في Ultralytics، ندعم أكثر من عشرة تنسيقات تصدير مختلفة لأن كل تنسيق منها محسّن لعتاد مختلف. لا يتعلق الأمر بامتلاك خيارات كثيرة جدًا، بل بامتلاك الخيار المناسب لاحتياجاتك أنت تحديدًا.
دمج العمليات: إنجاز المزيد بموارد أقل#
في نموذج YOLO الأصلي، تحدث عمليات كثيرة بالتسلسل. فعلى سبيل المثال، قد نجري التفافًا، ثم نطبّع النتائج، ثم نطبّق دالة تنشيط. وهذه ثلاث خطوات منفصلة، تتطلب كل منها عمليات قراءة وكتابة خاصة بها في الذاكرة.
لكن الجزء الذكي هو التالي: يمكننا دمج هذه العمليات في خطوة واحدة. فعند تصدير YOLO للنشر، ندمج هذه العمليات معًا. وبدلًا من:
- حساب الالتفاف ← الحفظ في الذاكرة
- التحميل من الذاكرة ← التطبيع ← الحفظ في الذاكرة
- التحميل من الذاكرة ← تطبيق التنشيط ← الحفظ في الذاكرة
نفّذ ما يلي:
- حساب الالتفاف + التطبيع + التنشيط ← الحفظ في الذاكرة
بالنسبة إلى نموذج YOLO نموذجي يعالج صورة بحجم 640×640، تلغي هذه الحيلة البسيطة غيغابايتات من عمليات نقل الذاكرة غير الضرورية. وعلى الهاتف المحمول، يشكّل ذلك الفرق بين كشف سلس في الوقت الفعلي وتأخر محبط.
استخدام أرقام أصغر: سحر التكميم#
لا يحتاج YOLO فعليًا إلى أرقام فائقة الدقة لاكتشاف الأجسام بدقة. أثناء التدريب، نستخدم 32 بت لتمثيل كل وزن، وهذا يشبه استخدام آلة حاسبة علمية لقياس مكونات شطيرة. أما عند النشر الفعلي؟ فتعمل 8 بتات بشكل جيد تمامًا.
يُسمّى هذا تكميمًا، وهو أحد أقوى أساليب التحسين لدينا. وباستخدام أرقام أصغر:
- ينكمش النموذج بنسبة 75% (من 200MB إلى 50MB لـ Ultralytics YOLO11x)
- يعمل بسرعة أكبر بمقدار 2-4 مرات على معظم الأجهزة
- يستهلك طاقة أقل بكثير (وسيشكركم بطارية هاتفكم)
ليست كل الطبقات في YOLO حساسة بالقدر نفسه لهذا التخفيض. فالطبقات المبكرة التي تكتشف الحواف والأشكال الأساسية؟ إنها متينة، ويمكننا استخدام أرقام من 8 بت دون أي مشكلات. أما طبقات الكشف النهائية التي تحدد «هل هذا قط أم كلب؟» فتحتاج إلى قدر أكبر قليلًا من الدقة. لذلك نضبط الدقة طبقةً تلو الأخرى، مستخدمين العدد الكافي من البتات للحفاظ على الدقة مع زيادة السرعة إلى أقصى حد.
وجدنا أنه مع التكميم الدقيق، يحافظ Ultralytics YOLO على 99.5% من دقته الأصلية، مع العمل بسرعة أكبر بثلاث مرات على الهواتف. وهذا هو الفرق بين نموذج بحثي وشيء يمكنك استخدامه فعليًا في العالم الحقيقي.
اختيار أفضل خوارزمية#
توجد عشرات الطرق المختلفة لتنفيذ العملية الرياضية نفسها. ويمكن حساب الالتفاف البسيط (العملية الأساسية في YOLO) باستخدام خوارزميات مختلفة تمامًا، ويعتمد الخيار الأفضل على أجهزتك المحددة وحجم الإدخال.
عند تصدير YOLO، يختبر إطار التحسين لدينا خوارزميات مختلفة فعليًا ويختار الأسرع لحالتك المحددة. يشبه ذلك وجود عدة طرق إلى الوجهة نفسها واختيار إحداها بناءً على حالة الازدحام الحالية. على GPU، قد نستخدم خوارزمية تعالج العديد من وحدات البكسل في وقت واحد. وعلى CPU، قد نستخدم خوارزمية محسّنة للمعالجة التسلسلية. الرياضيات واحدة، لكن استراتيجية التنفيذ مختلفة تمامًا.
الذاكرة: عنق الزجاجة الخفي#
هل تذكرون كيف تحدثنا عن كون الذاكرة عنق الزجاجة الحقيقي في الحوسبة الحديثة؟ ينطبق ذلك على YOLO بشكل خاص. قد يحتوي النموذج على 50 مليون مُعلَمة، وأثناء الاستدلال ينشئ غيغابايتات من النتائج الوسيطة. وغالبًا ما يكون نقل كل هذه البيانات أبطأ من الحساب الفعلي.
نستخدم عدة حيل لتقليل حركة الذاكرة إلى أدنى حد:
الجدولة الذكية: نرتب العمليات بحيث تُستخدم البيانات فورًا وهي لا تزال في ذاكرة التخزين المؤقت السريعة. وبالنسبة إلى شبكة هرمية السمات في YOLO، يقلل ذلك حركة الذاكرة بنسبة 40%.
التقسيم إلى مربعات: بدلًا من معالجة صورة كاملة دفعة واحدة، نقسمها إلى مربعات أصغر تتسع لها ذاكرة التخزين المؤقت. وهذا يعني أن المعالج يستطيع العمل باستخدام ذاكرة محلية سريعة بدلًا من الجلب المستمر من الذاكرة الرئيسية البطيئة.
إعادة استخدام المخازن المؤقتة: بدلًا من إنشاء ذاكرة جديدة باستمرار للنتائج الوسيطة، نعيد استخدام مخازن الذاكرة المؤقتة نفسها. وهذا فعال للغاية، إذ يمكن للعمود الفقري الكامل لـ YOLO أن يعمل باستخدام مجموعة من المخازن المؤقتة القابلة لإعادة الاستخدام.
التقليم: الأقل هو الأكثر#
إليكم حقيقة مفاجئة: غالبًا ما تكون نماذج YOLO مصممة بأكثر مما يلزم. يمكننا إزالة 30% من القنوات في العديد من الطبقات دون تأثير يُذكر في الدقة. ولا يقتصر ذلك على تصغير النموذج، بل يجعله أسرع أيضًا، لأن عدد العمليات الحسابية التي ينبغي تنفيذها يصبح أقل حرفيًا.
العملية أنيقة: نحلل الأجزاء من الشبكة التي تسهم بأقل قدر في نتائج الكشف النهائية، ونزيلها، ثم نضبط النموذج ضبطًا دقيقًا لتعويض ذلك. ويمكن أن يكون نموذج YOLO11m المقلّم أسرع بنسبة 30% مع الحفاظ على 99% من دقته الأصلية. وفي الأجهزة التي تعمل بالبطارية، قد يعني هذا المكسب في الكفاءة ساعات إضافية من التشغيل.
تسريع الأجهزة: الاستفادة من نقاط قوة كل شريحة#
تتميز المعالجات المختلفة بقدرات مختلفة، وفروق الأداء مذهلة. ويستغرق نموذج YOLO11n نفسه:
- 45 ميلي ثانية لكل إطار على CPU حديث من Intel
- 4 ميلي ثوانٍ على GPU من NVIDIA RTX
- 22 ميلي ثانية على معالج هاتف متطور
- 15 ميلي ثانية على TPU طرفية من Google Coral
هذه ليست مجرد فروق في السرعة ناتجة عن ترددات الساعة، بل تعكس فروقًا معمارية أساسية. تحتوي وحدات GPU على آلاف النوى التي تعمل بالتوازي، ما يجعلها مثالية لعمليات الالتفاف في YOLO. وتحتوي وحدات NPU المحمولة على دوائر متخصصة مصممة خصيصًا للشبكات العصبية. أما وحدات CPU فهي متعددة الاستخدامات، ومرنة لكنها غير متخصصة.
يكمن مفتاح التحسين في مواءمة عمليات YOLO مع ما تجيده كل شريحة. إذ يبرع GPU في تنفيذ العملية نفسها على كمية كبيرة من البيانات في وقت واحد. وقد لا يدعم NPU المحمول سوى عمليات معينة، لكنه ينفذها بكفاءة مذهلة. ولا يعمل TPU الطرفي إلا مع الأعداد الصحيحة ذات 8 بت، لكنه يحقق سرعة لافتة ضمن هذا القيد.
سحر الترجمة البرمجية#
عند تصدير نموذج YOLO، يحدث شيء لافت خلف الكواليس. فنحن لا نحوّل تنسيق الملف فحسب، بل نترجم النموذج برمجيًا خصيصًا للأجهزة المستهدفة. ويشبه ذلك الفرق بين Google Translate ومتحدث أصلي. وتؤدي عملية الترجمة البرمجية إلى:
- تحليل نموذجك لفهم بنيته ومتطلباته
- مراعاة إمكانات أجهزتك، وما تجيده وما يواجه صعوبة فيه
- إنشاء شيفرة محسّنة تتحدث اللغة الأصلية لأجهزتك
قد يعيد المترجم ترتيب العمليات للاستفادة بصورة أفضل من ذاكرة التخزين المؤقت في معالجك، أو يختار تعليمات متخصصة تدعمها شريحتك، أو حتى يستخدم التعلم الآلي للعثور على أفضل استراتيجية للتحسين. نعم، نحن نستخدم الذكاء الاصطناعي لتحسين الذكاء الاصطناعي؛ المستقبل حاضر!
يمكن لخطوة الترجمة البرمجية هذه أن تحدث فرقًا قدره 10 أضعاف في الأداء. فقد يتعثر نموذج YOLO نفسه مع الشيفرة العامة، لكنه ينطلق بسرعة مع التعليمات المحسّنة على النحو الصحيح.
النشر الطرفي في العالم الحقيقي#
لنتحدث عما يحدث عندما يلتقي YOLO بالعالم الحقيقي، وتحديدًا بعالم الأجهزة الطرفية الصعب. تخيلوا كاميرا أمنية تحتاج إلى تشغيل YOLO على مدار الساعة طوال أيام الأسبوع لاكتشاف الأجسام. فهي تواجه قيودًا قاسية:
- الذاكرة: ربما لا يتوفر سوى 512MB إلى 2GB من RAM إجمالًا
- الطاقة: غالبًا ما تكون 2-5 واط فقط (أقل من شاحن هاتف)
- التبريد: لا توجد مراوح، بل تبديد سلبي للحرارة فقط
- الموثوقية: يجب أن يعمل الجهاز باستمرار دون تعطل
إليكم ما يحققه التحسين عمليًا. كاميرا أمنية تشغّل YOLO11s:
- النموذج الأصلي: 15 واط، يعمل عند درجة حرارة مرتفعة تبلغ 85°C، ويحقق 20 FPS
- بعد التحسين بالتكميم والتقليم: 3 واط، ودرجة حرارة مريحة تبلغ 45°C، ويحقق 25 FPS
خفّضنا استهلاك الطاقة بنسبة 80% مع تحسين الأداء فعليًا! وهذا هو الفرق بين جهاز ترتفع حرارته وتُستنزف بطارياته، وآخر يعمل بموثوقية لسنوات.
يكمن المفتاح في اختيار المفاضلات المناسبة. ففي الأجهزة الطرفية، غالبًا ما نقوم بما يلي:
- استخدام تكميم INT8 (دقة أقل، وطاقة أقل بكثير)
- معالجة عدد أقل من الإطارات عندما يكون النشاط منخفضًا
- توزيع العمل على معالجات مختلفة لإدارة الحرارة
- إبقاء النماذج صغيرة بما يكفي لتتسع لها الذاكرة السريعة بالكامل
عملية التحسين#
في Ultralytics، نتبع نهجًا منهجيًا للتحسين. أولًا، نحلل أداء النموذج لفهم المواضع التي يُستهلك فيها الوقت فعليًا. وغالبًا لا تكون عنق الزجاجة في الموضع الذي تتوقعه. فقد يُستهلك 80% من الوقت في بضع طبقات فقط، أو قد تهيمن عمليات نقل الذاكرة على زمن الحساب.
بعد ذلك، نطبق التحسينات تكراريًا:
- البدء بأكبر مواطن الاختناق
- تطبيق تحسين واحد في كل مرة
- قياس كل من تحسن السرعة وتأثيره في الدقة
- الإبقاء على التحسينات التي توفر مفاضلات جيدة
- التكرار حتى نحقق أهدافنا
على سبيل المثال، عند نشر YOLO11m على هاتف:
- خط الأساس: 200ms لكل إطار، ونموذج بحجم 200MB
- بعد التكميم: 80ms لكل إطار، ونموذج بحجم 50MB
- بعد التقليم: 60ms لكل إطار، ونموذج بحجم 35MB
- بعد دمج العمليات: 45ms لكل إطار، ونموذج بحجم 35MB
تحسن كل خطوة الأداء مع الحفاظ على أكثر من 99% من الدقة الأصلية. والنتيجة؟ كشف الأجسام في الوقت الفعلي على جهاز يتسع في جيبك.
المستقبل: الحوسبة غير المتجانسة#
تزداد الأجهزة الحديثة ذكاءً في استخدام معالجات متعددة معًا. فهاتفك لا يحتوي على معالج واحد فحسب، بل على عدة معالجات، يتخصص كل منها في مهام مختلفة:
- يحتوي مستشعر الكاميرا على ISP (معالج إشارة الصورة) للمعالجة المسبقة
- ينفذ NPU (وحدة المعالجة العصبية) استدلال YOLO
- يتولى CPU المنطق المعقد والتنسيق
- يعرض GPU النتائج على الشاشة
يتعلق مستقبل تحسين YOLO بتقسيم النموذج بذكاء بين هذه المعالجات. فقد يتولى NPU عمليات الالتفاف الرئيسية، وينفذ CPU منطق الكشف النهائي، بينما يعرض GPU النتائج بصريًا. وينفذ كل معالج ما يجيده، ما ينشئ مسارًا أكثر كفاءة مما يستطيع أي معالج منفرد تحقيقه.
نطوّر خوارزميات تقسيم ذكية تحدد تلقائيًا أفضل طريقة لتوزيع YOLO بين المعالجات المتاحة، مع مراعاة إمكاناتها وتكلفة نقل البيانات بينها.
الخلاصة#
لا يقتصر تحسين نماذج YOLO على تحويل تنسيقات الملفات، بل يتعلق بتحويل الذكاء الاصطناعي المتطور إلى شيء يعمل فعليًا في العالم الحقيقي. ومن خلال تقنيات مثل التكميم (استخدام أرقام أصغر)، والتقليم (إزالة الأجزاء غير الضرورية)، ودمج العمليات (جمع الخطوات)، والإدارة الذكية للذاكرة، نحقق تحسينات في الأداء بمقدار 10-100 ضعف مع الحفاظ على الدقة.
ما الأمر اللافت؟ لا يوجد تحسين واحد «أفضل» على نحو عام. فالخادم السحابي ذو الطاقة غير المحدودة يحتاج إلى تحسينات مختلفة عن طائرة مسيّرة تعمل بالبطارية. كما يحتاج الهاتف المزود بشريحة مخصصة للذكاء الاصطناعي إلى معالجة مختلفة عن Raspberry Pi. ولهذا توفر Ultralytics خيارات تصدير عديدة، إذ يُحسّن كل خيار لسيناريوهات مختلفة.
يخدم كل تحسين ناقشناه هدفًا واحدًا: جعل الرؤية الحاسوبية متاحة في كل مكان. سواء أكنت تبني جرس باب ذكيًا، أو تطبيقًا لطائرة مسيّرة، أو خدمة سحابية ضخمة، فإننا نوفر الأدوات اللازمة لجعل YOLO يعمل ضمن قيودك.
عندما تصدّر نموذج YOLO باستخدام Ultralytics، فأنت لا تحفظ ملفًا فحسب، بل تستفيد من سنوات من الأبحاث في جعل الشبكات العصبية عملية. وأنت تحوّل نموذج ذكاء اصطناعي متطورًا إلى شيء يمكن تشغيله على أجهزة حقيقية، ضمن قيود حقيقية، لحل مشكلات حقيقية.
هذا ما نفعله في Ultralytics. نسد الفجوة بين أبحاث الذكاء الاصطناعي والنشر العملي. ونجعل الرؤية الحاسوبية تعمل في كل مكان، لأن مستقبل الذكاء الاصطناعي لا يتعلق بامتلاك أفضل النماذج فحسب، بل بجعل هذه النماذج مفيدة في العالم الحقيقي.









