انتقل إلى المحتوى الرئيسي

المراجعة والاختبار النهائي

عشر وحدات للانتقال من تنسور خام إلى نموذج مصدَّر ومنشور في خدمة. هذه هي الدورة مُكثَّفة، ثم الخيوط التي تعبرها، ثم مقدّمة لاختبار الأربعين سؤالاً.

الدورة في لمحة

الوحدةالجوهر الواجب حفظه
1. تنسورات PyTorchshape وdtype وdevice؛ view تشترط التجاور وfrom_numpy تشارك الذاكرة
2. Autogradالرسم ديناميكيّ، والتدرّجات تتراكم في .grad؛ لذلك zero_grad أوّل ما تفعله
3. nn.Moduleصرّح الطبقات في __init__، ولا تنادِ forward مباشرةً؛ التنسور خارج nn.Parameter لا يتعلّم
4. Dataset وDataLoadershuffle=True للتدريب فقط؛ الإحصائيات تُقاس على التدريب وحده لتفادي التسرّب
5. حلقة التدريبtrain()/eval() غير no_grad()؛ الاثنان لازمان للتقييم السليم
6. المُحسِّنات والجدولةAdamW خيار افتراضيّ؛ OneCycleLR يتقدّم لكلّ خطوة، لا لكلّ حقبة
7. GPU والدقّة المختلطةpin_memory مع non_blocking؛ GradScaler مع float16 لا مع bfloat16
8. نقاط الحفظاحفظ النموذج والمُحسِّن والجدولة والحقبة والبذرة؛ map_location عند تغيير الجهاز
9. التعلّم بالنقلاستبدال الرأس، ثمّ ضبط دقيق بمعدّل مئة مرّة أصغر؛ BatchNorm يستمرّ في التحديث لو بقي train()
10. TorchScript وONNXtrace لمسار واحد، script للتفرّعات؛ دائمًا eval() قبل التصدير

الخيوط التي تعبر الدورة

التدريب والاستدلال نظامان متمايزان، وPyTorch لن يُنبّهك. Dropout يعطّل عصبونات في أحدهما لا في الآخر. BatchNorm يحسب إحصائيات الحزمة، ثم المتوسّطات الجارية. النموذج المُغلَّف بتعلّم بالنقل مع requires_grad=False يترك BatchNorm يتحدّث ما لم يُوضَع في eval(). النموذج المُصدَّر يُدرِج Dropout في الرحلة الأمامية إن لم يُقلَب إلى eval() قبل التصدير. أي نسيان من هذه القائمة لا يرفع خطأً؛ يُدهور النتيجة بصمت. إنه أشيع مصدر للأمراض الصامتة في PyTorch، ويستحقّ فحصًا مقصودًا قبل كلّ استدلال.

التدرّجات تتراكم، وهذا ميزة بشرط أن تتذكّرها. .grad يُجمع لا يُستبدل. الميزة: تمرير حزم صغيرة متعدّدة كأنّها حزمة كبيرة، على GPU ذي ذاكرة محدودة. العلّة: نسيان zero_grad في تكرار واحد، وينفجر التدريب صعودًا نحو NaN بلا خطأ. عادة صارمة: أوّل استدعاء في حلقة التكرار هو zero_grad، مهما رأيت من كود.

العقد بين النموذج والبيانات يجب أن يكون مكتوبًا لا مضمرًا. الأشكال، الأنواع، المتوسّطات والانحرافات، القنوات، أحجام الحزم: كلّها عقود ضمنيّة يخفق التدريب بسببها بصمت. عادات دفاعيّة: طبع shape لكلّ تنسور في forward أثناء الاستكشاف، استخدام weights.transforms() بدل نسخ القيم، دمج المعالجة القبلية في النموذج قبل التصدير. كلّ شيء صريح لا يُترك للذاكرة.

التسريع بعد الصواب، والقياس قبل التسريع. الوحدة السابعة تُقدّم مضاعفات جميلة، لكنّها لا تُصلح حلقة معطوبة. الترتيب الصحيح: حلقة تعمل، إفراط في تعلّم عشر مشاهدات، مقاييس تحقّق موثوقة، ثم الدقّة المختلطة وtorch.compile. الترتيب المعكوس يُخفي الأخطاء ولا يحلّها.

بيئة العمل النموذجية

مشروع PyTorch سليم يمرّ بمحطّات يمكن ذكرها بترتيب:

  1. بيانات مقسَّمة قبل أيّ معالجة، إحصائيات محسوبة على التدريب وحده.
  2. Dataset مخصّص أو جاهز، ثمّ DataLoader بـnum_workers مضبوط.
  3. نموذج مُصرَّح كصنف يرث nn.Module، مع super().__init__().
  4. حلقة تدريب من خمس خطوات بترتيب لا يتغيّر: zero_grad، أمامي، خسارة، backward، step.
  5. تقييم في eval() مع no_grad()، ومقاييس بالحقبة لا بالخطوة.
  6. مُحسِّن AdamW وجدولة CosineAnnealingLR كنقطة انطلاق.
  7. حفظ كامل بعد كلّ حقبة (نسخة أخيرة، نسخة أفضل شرطية).
  8. دقّة مختلطة إن كان GPU حديثًا وحزمة كبيرة كافية.
  9. تعلّم بالنقل إن كانت البيانات محدودة والمعمارية معروفة.
  10. تصدير بـTorchScript أو ONNX مع تحقّق عدديّ قبل النشر.

هذا القالب مفيد للتذكّر، لكن الأهمّ من ترتيبه هو أنّ كلّ خطوة قابلة للاختبار وحدها.

اختبار الأربعين سؤالاً

يتضمّن الاختبار 40 سؤالاً موزّعة على الوحدات العشر: التنسورات وقواعد البثّ، Autograd وتراكم التدرّجات، تصميم nn.Module، DataLoader وتفادي التسرّب، حلقة صحيحة وعلامات فرط التخصيص، اختيار المُحسِّن وجدولة lr، ميكانيك الدقّة المختلطة، تركيبة نقطة حفظ كاملة، مراحل التعلّم بالنقل، وسلوك trace مقابل script.

عدّة أسئلة تعرض حالات للتشخيص: خسارة تصير NaN، دقّة تحقّق تتغيّر حسب الحزمة، تدريب لا يستأنف كما بدأ، نموذج مصدَّر يُنتج توقّعات مختلفة عن الأصل، تسريع دقّة مختلطة غائب. المُقيَّم هو الحُكم، لا استظهار الصيغ.

في حال النجاح تُمنح شهادة الإتمام فورًا، ورقمها قابل للتحقّق من أيّ طرف على المنصّة.

قبل أن تبدأ

استعِد الجدول أعلاه، واسأل نفسك عن كلّ سطر: «كيف سأرى أنّني مخطئ هنا؟». إن عرفت أن تُبيّن لماذا يستمرّ BatchNorm في التحديث رغم requires_grad=False، ولماذا torch.no_grad() لا يُغني عن eval()، ولماذا GradScaler يُفسد bfloat16، ولماذا trace قد لا يُطابق النموذج على مسار جديد، فأنت مستعدّ. حظًّا موفّقًا!

في الخلاصة

  • العادات الخمس: zero_grad أوّلاً في التكرار، eval مع no_grad معًا، pin_memory مع non_blocking معًا، حفظ كامل للاستئناف، تحقّق عدديّ بعد كلّ تصدير.
  • العلّة الأشيع هي الخلط بين training وeval، ولا يرفع خطأً في PyTorch؛ فحص مقصود قبل كلّ نشر أو تقييم.
  • العلاج قبل التسريع: التأكّد من صحّة الحلقة قبل الدقّة المختلطة وقبل torch.compile؛ تسريع نموذج معطوب يُخفي عطبه لا يُصلحه.
  • الشهادة تُمنح فورًا عند النجاح في اختبار الأربعين سؤالاً، ورقمها قابل للتحقّق من أيّ طرف. حظًّا سعيدًا.

الامتحان النهائي

هل أنت مستعدّ لاعتماد هذه الدورة؟

40 سؤالًا تُختار عشوائيًّا من بنك أسئلة الدورة · حدّ النجاح 70 % · شهادة PDF قابلة للتحقّق تُصدَر فورًا عند النجاح.

ابدأ الامتحان

يلزم تسجيل الدخول إلى حسابك في InSkillML مع اشتراك نشط. يمكنك أيضًا بدء الامتحان من دوراتي.