المراجعة والاختبار النهائي
عشر وحدات للانتقال من تنسور خام إلى نموذج مصدَّر ومنشور في خدمة. هذه هي الدورة مُكثَّفة، ثم الخيوط التي تعبرها، ثم مقدّمة لاختبار الأربعين سؤالاً.
الدورة في لمحة
| الوحدة | الجوهر الواجب حفظه |
|---|---|
| 1. تنسورات PyTorch | shape وdtype وdevice؛ view تشترط التجاور وfrom_numpy تشارك الذاكرة |
| 2. Autograd | الرسم ديناميكيّ، والتدرّجات تتراكم في .grad؛ لذلك zero_grad أوّل ما تفعله |
| 3. nn.Module | صرّح الطبقات في __init__، ولا تنادِ forward مباشرةً؛ التنسور خارج nn.Parameter لا يتعلّم |
| 4. Dataset وDataLoader | shuffle=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 وONNX | trace لمسار واحد، 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 سليم يمرّ بمحطّات يمكن ذكرها بترتيب:
- بيانات مقسَّمة قبل أيّ معالجة، إحصائيات محسوبة على التدريب وحده.
Datasetمخصّص أو جاهز، ثمّDataLoaderبـnum_workersمضبوط.- نموذج مُصرَّح كصنف يرث
nn.Module، معsuper().__init__(). - حلقة تدريب من خمس خطوات بترتيب لا يتغيّر:
zero_grad، أمامي، خسارة،backward،step. - تقييم في
eval()معno_grad()، ومقاييس بالحقبة لا بالخطوة. - مُحسِّن AdamW وجدولة
CosineAnnealingLRكنقطة انطلاق. - حفظ كامل بعد كلّ حقبة (نسخة أخيرة، نسخة أفضل شرطية).
- دقّة مختلطة إن كان GPU حديثًا وحزمة كبيرة كافية.
- تعلّم بالنقل إن كانت البيانات محدودة والمعمارية معروفة.
- تصدير بـ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 مع اشتراك نشط. يمكنك أيضًا بدء الامتحان من دوراتي.