كيفية سرد وطباعة جميع الطبقات في نموذج PyTorch

كيفية سرد وطباعة جميع الطبقات في نموذج PyTorch

مقدمة

في PyTorch، وهي أداة شائعة للتعلم العميق، قد تحتاج إلى رؤية وسرد جميع طبقات نموذجك. هذا مفيد جدًا عندما تحاول فهم كيفية بناء النموذج، أو فحص أجزائه، أو العمل مع طبقات معينة مباشرةً. ستستعرض هذه التدوينة ثلاث طرق مختلفة يمكنك من خلالها سرد وإظهار جميع الطبقات في نموذج PyTorch الخاص بك. علاوةً على ذلك، ستقدم هذه التدوينة طريقة ممتازة لتشغيل PyTorch على سحابة GPU.

فهم نماذج PyTorch

داخل نموذج PyTorch، توجد طبقات مختلفة، كل منها يقوم بمعالجة البيانات التي يستقبلها بطريقته الخاصة. تعمل هذه الطبقات معًا لتشكيل ما يُعرف ببنية النموذج. أثناء التدريب، تقوم بعض القيم داخل هذه الطبقات بضبط نفسها - تُسمى هذه المعلمات القابلة للتدريب - بهدف جعل النموذج أكثر ذكاءً بمرور الوقت.

أساسيات بنية نموذج PyTorch

في PyTorch، عند إعداد نموذج، ما تفعله هو تمديد الفئة nn.Module لإنشاء هيكلك الخاص. داخل هذا الإعداد، هناك طريقة إلزامية تُسمى forward. هذه الطريقة مهمة جدًا لأنها تأخذ بياناتك ثم تمررها عبر طبقات النموذج واحدة تلو الأخرى حتى تُخرج النتيجة. فكر في كل طبقة كعامل صغير خاص بها، مثل nn.Linear للتوصيلات المباشرة أو nn.Conv2d لتصفية الصور.

للتأكد من أن هذه العاملات تصطف بشكل صحيح وتنقل الأشياء بالترتيب، نستخدم فئة nn.Sequential. باستخدام هذه الأداة المفيدة، كل ما عليك فعله هو سرد طبقاتك بالترتيب الذي يجب أن تعمل به على البيانات. إنها مثل إخبارهم: “أنت أولاً! والآن دورك!” وهكذا حتى تقوم كل قطعة بعملها.

المكونات الرئيسية لنماذج PyTorch

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

تهيئة بيئتك لـ PyTorch

قبل الغوص في الأشياء الرائعة التي سنتحدث عنها لاحقًا في هذه التدوينة، يجب عليك تجهيز جهاز الكمبيوتر الخاص بك. هذا يعني تثبيت بضعة أشياء عليه مثل Python و PyTorch و torchvision.

أولاً، Python هي ما ستستخدمه عند القيام بالتعلم العميق باستخدام PyTorch. تأكد من تثبيتها على جهاز الكمبيوتر الخاص بك. إذا لم تكن مثبتة، توجه إلى موقع Python الرسمي حيث يمكنك تنزيلها وتثبيتها.

بعد ذلك يأتي تثبيت PyTorch نفسه. إنه في الأساس نجم العرض للتعلم العميق في عالم PyTorch. يمنحك جميع أنواع الأدوات والأشياء الجيدة لصنع وتعليم الشبكات العصبية كيفية تعلم الأشياء بنفسها. لتثبيته على نظامك، ما عليك سوى استخدام مدير الحزم pip مع pip install torch.

لكن انتظر - هناك المزيد! تحتاج أيضًا إلى torchvision في مجموعة أدواتك، لأنه إذا كان العمل مع الصور هو ما يثير حماسك، فإن هذه المكتبة لديها بعض المفاجآت لك. فكر في مجموعات البيانات المعدة مسبقًا أو النماذج المفيدة جدًا لمهام الرؤية، بالإضافة إلى طرق لتعديل تلك الصور لتكون مناسبة تمامًا للتدريب؛ مرة أخرى، يجعل pip الحياة سهلة هنا: pip install torchvision.

تثبيت PyTorch

لتثبيت PyTorch على جهاز الكمبيوتر الخاص بك، ما عليك سوى فتح المكان الذي تكتب فيه الأوامر (مثل الطرفية أو موجه الأوامر) واكتب:

pip install torch

هذا يخبر جهاز الكمبيوتر الخاص بك بتنزيل أحدث إصدار من PyTorch وتثبيته لك. ستحتاج إلى اتصال إنترنت جيد لأن هذا قد يستغرق بعض الوقت.

التحقق من تثبيت PyTorch

للتأكد من تثبيت PyTorch بشكل صحيح، يمكنك تجربة نص Python أساسي أو استخدامه في بيئة تفاعلية مثل Jupyter Notebook أو Python REPL. ما عليك سوى الدخول إلى بيئة Python التي تفضلها واستيراد الوحدة النمطية torch باستخدام هذا السطر من الكود:

import torch

سرد الطبقات في نموذج PyTorch

الآن بعد أن تعرفنا على الأساسيات حول كيفية بناء نموذج PyTorch، دعنا نتعمق في كيف يمكننا رؤية وسرد كل طبقة فيه.

استخدام طريقتي .children() و .modules()

لإظهار كل طبقة في نموذج PyTorch، يمكننا استخدام طريقتي .children() و .modules() مع تدوين النقاط. إليك كيفية القيام بذلك:

for name, module in model.named_modules():
    print(name, module)

مع مقتطف الكود أعلاه، نستخدم طريقة named_modules() للحصول على كل جزء من نموذج PyTorch الخاص بنا مع اسمه. من خلال المرور عليها واحدة تلو الأخرى وإظهار أسمائها وما هي عليه، نتمكن من عرض جميع أجزاء إعداد PyTorch الخاص بنا.

ما ينتج عن تشغيل هذا البت من Python هو قائمة تخبرنا بأسماء الطبقات المختلفة وتظهر لنا وحداتها أيضًا. هذه المعلومات مفيدة جدًا عندما تريد التعمق في طبقات معينة أو تغييرها بطريقة ما.

أمثلة عملية على سرد الطبقات

عند العمل مع نموذج PyTorch، من المفيد حقًا معرفة كيفية إظهار وسرد جميع أجزائه. يمكن أن يساعدك هذا في فهم النموذج بشكل أفضل، أو تعديل أجزاء معينة منه، أو إصلاح المشكلات. فيما يلي بعض الطرق السهلة للقيام بذلك:

  • للوصول مباشرة إلى جزء معين باستخدام اسمه:
    • ما عليك سوى استخدام تدوين النقاط مثل هذا: model.layer1.0.relu
  • عندما تريد المرور عبر كل جزء واحدًا تلو الآخر وربما تغيير الأشياء أثناء التقدم:
    • حلقة for بسيطة تتيح لك التجول عبر الوحدات المسماة حتى تتمكن من العمل عليها بشكل فردي.
  • إذا كان هدفك هو مجرد رؤية الأجزاء الموجودة مع تفاصيلها:
    • يمنحك الجمع بين طريقة named_modules() مع print كلًا من الأسماء والمعلومات حول كل وحدة.

طباعة تفاصيل الطبقات

إلى جانب مجرد تسمية الأجزاء المختلفة لنموذج PyTorch، قد ترغب أيضًا في مشاركة المزيد عن كل جزء. يتضمن ذلك عدد الإعدادات التي يحتوي عليها وكيف تبدو نتائجه.

الوصول إلى معلومات طبقة محددة

إذا كنت تغوص في نموذج PyTorch وتريد إلقاء نظرة خاطفة على تفاصيل طبقاته، فهناك أداة مفيدة تسمى “named_parameters” يمكن أن تساعد. هذه الوظيفة تشبه خريطة الكنز؛ إنها ترشدك عبر جميع المعلمات المسماة في نموذجك. باستخدام هذه الخريطة، يمكنك العثور على معلومات محددة حول كل طبقة.

إليك كيف تعمل: مع بضعة أسطر فقط من الكود، يمكنك طباعة كل شيء عن كل طبقة.

for name, parameter in model.named_parameters():
    print(name, parameter)

في هذه الأسطر من الكود، يخبرنا name بالطبقة التي ننظر إليها بينما يظهر لنا parameter الموتر لتلك الطبقة. إنه مثل الحصول على رؤية أشعة سينية لنموذج pytorch الخاص بك - رؤية ما يتكون منه كل جزء دون الحاجة إلى فتح أي شيء!

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

وظائف مخصصة لطباعة الطبقات

إذا كنت تريد رؤية طبقات معينة أو مجموعات منها في نموذج PyTorch، يمكنك ابتكار وظائفك الخاصة بمساعدة PyTorch و Python. ستحتاج هذه القطع من الكود إلى نموذجك كمدخل ثم ستظهر لك فقط الطبقات التي تشعر بالفضول حيالها.

خذ هذا المثال: إذا كنت مهتمًا بفحص جميع الطبقات التلافيفية في النموذج، إليك كيف يمكنك القيام بذلك:

def print_conv_layers(model):
    for name, module in model.named_modules():
        if isinstance(module, nn.Conv2d):
            print(name, module)

مع هذه الوظيفة، نمر عبر كل وحدة مسماة داخل نموذج pytorch الخاص بنا ونتحقق مما إذا كانت من النوع nn.Conv2d. إذا تم التحقق من ذلك، نتمكن من رؤية كل من اسمها وما بداخلها.

تقنيات متقدمة

إلى جانب الطرق البسيطة للنظر في أجزاء نموذج PyTorch وطباعتها، هناك بعض الحيل الرائعة التي يمكنك القيام بها لتعميق الفهم.

التكرار عبر الوحدات المسماة

عند العمل مع نموذج PyTorch، فإن المرور عبر الوحدات المسماة واحدة تلو الأخرى يتيح لك القيام بأشياء معينة لكل جزء. يمكنك استخدام وظيفة named_modules لهذا الغرض. إنها تعطيك مكررًا يمر عبر كل وحدة مسماة في نموذجك.

مع هذا الأسلوب، يصبح الدخول إلى أجزاء معينة من النموذج وتعديلها أمرًا ممكنًا. على سبيل المثال، إذا كانت هناك طبقة معينة تريد تعديلها أو التحقق من مخرجاتها لمزيد من التحليل.

طريقة مفيدة لتتبع هذه الوحدات هي وضعها في قاموس. هذا يجعل من السهل جدًا العثور على أي وحدة والعمل عليها بمجرد معرفة اسمها. إليك كيف يبدو:

named_modules_dict = dict(model.named_modules())
conv1 = named_module_dict['conv1']

في المثال أعلاه، يشير conv1 إلى الوحدة المسماة “conv1”. الآن بعد أن حصلت عليها مباشرة من قائمتك، يصبح إجراء أي عملية مطلوبة عليها أمرًا مباشرًا.

استخدام الخطافات لاستخراج مخرجات الطبقات

في PyTorch، تتيح لك الخطافات إعداد وظائف خاصة يتم استدعاؤها في أوقات معينة أثناء تشغيل النموذج. فكر في الأمر كإعداد نقطة تفتيش في لعبة فيديو حيث يحدث شيء محدد. هذه مفيدة حقًا إذا كنت تريد رؤية ما يحدث داخل أجزاء معينة من نموذجك.

لجعل هذه تعمل، أولاً، يجب عليك كتابة وظيفة. هذه ليست مجرد أي وظيفة رغم ذلك؛ إنها تحتاج إلى أربعة أشياء: الوحدة، الإدخال، الإخراج، والسياق. الجزء الأكثر أهمية هنا هو جزء “الإخراج” لأن هذا يتيح لك إلقاء نظرة خاطفة على ما تخرجه الطبقة وتغيير الأشياء حولها إذا لزم الأمر.

إليك كيف يمكنك ابتكار إحدى وظائف الخطاف هذه:

def hook_fn(module, input, output):
    # افعل ما تشاء مع الإخراج
    print(output)

بعد صياغة وظيفتك، يأتي بعد ذلك إرفاقها بطبقة في نموذجك. يمكنك القيام بذلك عن طريق استدعاء register_forward_hook على الطبقة التي تثير إعجابك:

layer.register_forward_hook(hook_fn)

مع كل شيء تم إعداده الآن، كلما تم تشغيل تلك القطعة المعينة من الكود أثناء المرور الأمامي - بام! تقفز وظيفتك المخصصة الصغيرة إلى العمل مما يسمح لك بالتلاعب بالمخرجات أو مجرد ملاحظتها في تلك اللحظة.

تسريع PyTorch باستخدام مثيل GPU من Novita AI

مثيل GPU من Novita AI، وهو حل قائم على السحابة، يبرز كخدمة نموذجية في هذا المجال. إنه يوفر الوصول إلى وحدات معالجة الرسومات NVIDIA RTX 3090، المشهورة بقدرتها على التعامل مع أعباء العمل الحسابية المكثفة. هذا مفيد بشكل خاص لمستخدمي PyTorch الذين يحتاجون إلى القوة الحسابية الإضافية التي توفرها وحدات معالجة الرسومات دون الحاجة إلى الاستثمار في أجهزة محلية.

إليك كيف يمكن دمج مثيل GPU من Novita AI مع PyTorch لتحسين الكفاءة:

التسريع الحسابي: التكامل السلس لـ PyTorch مع وحدات معالجة الرسومات الممكّنة بـ CUDA مثل RTX 3090 التي توفرها Novita AI GPU Instance يسمح بتسريع تدريب النموذج والاستدلال. تضمن طريقة .to(device) في PyTorch نقل النماذج والموترات بكفاءة إلى GPU، مما يطلق العنان لقدرات المعالجة المتوازية الضرورية للتعلم العميق.

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.to(device)

قابلية التوسع المرنة: يقدم مثيل GPU من Novita AI المرونة لتوسيع نطاق الموارد لأعلى أو لأسفل بناءً على متطلبات المشروع. هذا يعني أنه خلال فترات الاحتياج الحسابي العالي، يمكن تخصيص موارد GPU إضافية، وبمجرد اكتمال المهمة، يمكن إلغاء تخصيص هذه الموارد، مما يحسن التكاليف.

كفاءة التكلفة: يضمن نموذج الدفع حسب الاستخدام للخدمات السحابية مثل مثيل GPU من Novita AI أن يدفع المستخدمون فقط مقابل الموارد التي يستهلكونها. هذا فعال من حيث التكلفة بشكل خاص للمشاريع ذات الاحتياجات الحسابية المتقلبة أو لتلك التي تتطلب دفعة من القوة الحسابية لفترة محدودة.

الخاتمة

معرفة الأجزاء المختلفة لنموذج PyTorch أمر مهم حقًا إذا كنت تريد تحليل نماذجك وتعديلها بشكل جيد. باستخدام أدوات مثل .children() و .modules()، من السهل جدًا سرد وطباعة كل طبقة، مما يساعدك على فهم كيفية بناء النموذج. إذا كنت بحاجة إلى تفاصيل أكثر تحديدًا حول كل طبقة، فإن إنشاء وظائف مخصصة يمكن أن يفعل المعجزات للتحليل المتعمق. إتقان هذه الطرق يعني أنك ستكون أفضل في العمل مع نماذج PyTorch، مما يجعل مشاريع التعلم العميق الخاصة بك أكثر روعة.

Novita AI هي المنصة السحابية الشاملة التي تمكن طموحاتك في الذكاء الاصطناعي. واجهات برمجة تطبيقات متكاملة، بدون خادم، مثيل GPU - الأدوات الفعالة من حيث التكلفة التي تحتاجها. تخلص من البنية التحتية، وابدأ مجانًا، وحقق رؤيتك في الذكاء الاصطناعي.

قراءة موصى بها:

  1. CUDA 12: تحسين الأداء لحوسبة GPU
  2. دليل سريع وسهل لضبط Llama بدقة