
كيف تكشف أداة PyTorch Profiler كلفة Attention؟
شرح لنتائج تجربة Hugging Face التي تقارن attention اليدوي بخلفيات SDPA، وتوضح لماذا يجب قراءة أثر CPU وGPU والذاكرة معًا.
يعرض الجزء الثالث من سلسلة Hugging Face عن PyTorch Profiler طريقة قراءة تنفيذ attention على CPU وGPU. القيمة ليست في إعلان أداة جديدة، بل في مقارنة ما نتوقع أن تنفذه الشيفرة بما يظهر فعليًا في مسار الأداء.
من التنفيذ اليدوي إلى SDPA
يبني المثال attention السببي يدويًا من ضرب المصفوفات والتحجيم والقناع وsoftmax ثم ضرب القيم. أظهر المسار ست عمليات GPU، بينها نسخة ذاكرة لم تكن متوقعة. بتغيير masked_fill إلى نسخته التي تعدل المصفوفة في مكانها، اختفت عملية النسخ في تجربة الاستدلال التي أجريت تحت torch.no_grad.
هذا لا يجعل التعديل مناسبًا تلقائيًا للتدريب. يحذر المقال من أن العمليات الموضعية قد تكتب فوق قيم يحتاجها autograd في المسار الخلفي. الدرس هو تفسير سبب العملية قبل حذفها، واختبار الصحة إلى جانب السرعة.
بعد ذلك يستخدم المقال scaled_dot_product_attention أو SDPA. توضح وثائق PyTorch أن torch.nn.attention يوفر أدوات لاختيار الخلفية، بينما يستطيع SDPA اختيار تنفيذ متوافق مع شكل المدخلات ونوع البيانات والعتاد والقناع.
لماذا تختلف الخلفيات؟
قارن المقال أربع خلفيات على جهاز NVIDIA A100-SXM4-80GB وبحالة اختبار محددة:
- الخلفية الحسابية تفكك العمل إلى عمليات مرجعية متعددة وتهتم بسلامة النوع والحالات الخاصة. - الخلفية efficient تنفذ العمل في kernel مدمجة. - Flash Attention تتجنب كتابة مصفوفة الدرجات الكاملة إلى ذاكرة HBM عبر العمل على أجزاء والاحتفاظ بالنتائج الوسيطة داخل الشريحة. - cuDNN تستخدم kernel مولدة ومضبوطة بحسب المسألة، وقد تنقل جزءًا من الكلفة إلى تحضير الخطة على CPU.
في أرقام التجربة المنشورة، كانت Flash الأسرع على GPU للحالة المختبرة، لكن هذه ليست نتيجة عامة لكل شكل أو جهاز. يذكر المقال نفسه أن cuDNN قد تتفوق مع أشكال أخرى.
لا تقرأ مؤشرًا منفردًا
بدت إشغال Flash منخفضة في profiler رغم سرعتها، لأن كل block تستخدم موارد كبيرة داخل الشريحة. كما ظهر إشغال cuDNN صفرًا بسبب فجوة في إسناد القياس لمسار تشغيل معين، لا لأن GPU متوقف. كذلك لم تعن قلة عمليات ATen الظاهرة في cuDNN اختفاء العمل؛ جزء منه أصبح داخل المكتبة.
هذه أمثلة على خطورة تحسين رقم منفرد. اقرأ زمن CPU وGPU، وحركة الذاكرة، وعدد kernels، وشكل المدخلات، وصحة الناتج معًا.
طريقة اختبار قابلة للتكرار
ثبت الجهاز وإصدار PyTorch ونوع البيانات والأبعاد والقناع ووضع التدريب أو الاستدلال. نفّذ إحماءً قبل القياس، وكرر التجربة، ثم احتفظ بمسار profiler مع النتيجة. ابدأ بتوقع مكتوب للعمليات التي يفترض أن تظهر؛ أي اختلاف هو نقطة التحقيق الأولى.
لا تنقل أرقام المقال مباشرة إلى إنتاجك. استخدم سكربتاته لفهم المنهج، ثم قس نموذجك وأشكالك وعتادك. التحسين المقبول هو ما يقلل الزمن أو الذاكرة مع بقاء الدقة والاستقرار ضمن الحدود المطلوبة.
المصادر
- [Hugging Face — Profiling in PyTorch: Attention Is All You Profile](https://huggingface.co/blog/torch-attention-profile) - [PyTorch — torch.nn.attention](https://docs.pytorch.org/docs/stable/nn.attention.html)
تم التعديل


