درون cuda-convnet: لایههای دو GPU در AlexNet و دوران ImageNet

دستاورد AlexNet در سال 2012 به مهندسی سطح پایین GPU با cuda-convnet و معماری تقسیمشده میان دو GPU متکی بود و مستقیما رقابتی سریع برای ساخت مدلهای بینایی رایانهای عمیقتر و کارآمدتر به راه انداخت.
1. cuda-convnet در پشت صحنه چگونه کار میکرد
پیش از آنکه NVIDIA کتابخانه cuDNN را بسازد، Alex Krizhevsky برنامه cuda-convnet را با CUDA C++ خام نوشت تا بیشترین سرعت را از GPUهای اولیه با معماری Fermi یعنی GTX 580 بگیرد. کتابخانههای امروزی معمولا کانولوشنها را به ضربهای بسیار بزرگ ماتریسی باز میکنند (im2col) که حافظه بسیار زیادی مصرف میکند. چون هر GTX 580 فقط 3 GB حافظه VRAM داشت، Krizhevsky روالهای مستقیم و کممصرف GPU را طراحی کرد.
- چیدمان حافظه با اولویت دسته (CHWN). چارچوبهای امروزی بهطور پیشفرض از NCHW (دسته، کانالها، ارتفاع، عرض) استفاده میکنند که همه پیکسلهای یک تصویر را در حافظه کنار هم قرار میدهد. Krizhevsky تانسورها را به ترتیب CHWN ذخیره کرد و بُعد دسته (N) را در انتها گذاشت. وقتی 32 رشته GPU در یک warp، تعداد 32 تصویر متفاوت را دقیقا در موقعیت پیکسلی یکسان پردازش میکردند، خواندنهای حافظه آنها کاملا پیوسته و تجمیعشده بود و پهنای باند VRAM به بیشترین حد استفاده میرسید.
- کاشیبندی حافظه اشتراکی. خواندن از VRAM سراسری صدها چرخه ساعت زمان میبرد، در حالی که حافظه اشتراکی روی تراشه (فقط 48 KB بهازای هر Streaming Multiprocessor در GTX 580) تنها چند چرخه نیاز دارد. بلوکهای رشته، تکههای دوبعدی کوچکی از پیکسلهای تصویر و وزنهای فیلتر را در حافظه اشتراکی بارگذاری میکردند و پیش از نوشتن نتایج نهایی در VRAM، دهها ضرب داخلی را محاسبه میکردند.
- استفاده مجدد از ثباتها در سطح warp. Krizhevsky هر بلوک رشته را مامور کرد همزمان یک کاشی از پیکسلهای خروجی را برای چندین فیلتر محاسبه کند. با نگه داشتن وزنهای فیلتر در ثباتهای سریع GPU، یک تکه تصویر بارگذاریشده از حافظه اشتراکی همزمان برای فیلترهای متعدد دوباره استفاده میشد و ترافیک حافظه بهشدت کاهش مییافت.
2. لایههای مشخص AlexNet و تقسیم میان دو GPU
AlexNet دارای 8 لایه یادگرفتهشده (5 لایه کانولوشنی و 3 لایه تماما متصل) با مجموع تقریبا 60 میلیون پارامتر بود. چون یک GTX 580 بهتنهایی حافظه VRAM موردنیاز، یعنی بیش از 3 GB، را برای فعالسازیها، وزنها و گرادیانها نداشت، Krizhevsky شبکه را بهصورت عمودی به دو جریان موازی تقسیم کرد.
| لایه | نوع | مجموع فیلترها / نورونها | سهم هر GPU | ارتباط میان GPUها |
|---|---|---|---|---|
| ورودی | تصویر RGB | 224 × 224 × 3 | در هر دو GPU کپی میشود | هیچکدام |
| Conv 1 | کانولوشن 11×11 (گام 4) + MaxPool | 96 فیلتر | 48 فیلتر در هر GPU | مجزا (بدون همگامسازی) |
| Conv 2 | کانولوشن 5×5 + MaxPool | 256 فیلتر | 128 فیلتر در هر GPU | مجزا (فقط Conv 1 مربوط به GPU خودش را میخواند) |
| Conv 3 | کانولوشن 3×3 | 384 فیلتر | 192 فیلتر در هر GPU | همگامسازی کامل (هر 256 نقشه را از هر دو GPU میخواند) |
| Conv 4 | کانولوشن 3×3 | 384 فیلتر | 192 فیلتر در هر GPU | مجزا (فقط Conv 3 مربوط به GPU خودش را میخواند) |
| Conv 5 | کانولوشن 3×3 + MaxPool | 256 فیلتر | 128 فیلتر در هر GPU | مجزا (فقط Conv 4 مربوط به GPU خودش را میخواند) |
| FC 6 | تماما متصل + Dropout | 4,096 نورون | 2,048 نورون در هر GPU | همگامسازی کامل (به همه خروجیهای Conv 5 متصل میشود) |
| FC 7 | تماما متصل + Dropout | 4,096 نورون | 2,048 نورون در هر GPU | همگامسازی کامل (به همه نورونهای FC 6 متصل میشود) |
| FC 8 | تماما متصل (Softmax) | 1,000 کلاس | 1,000 کلاس (ترکیبی) | همگامسازی کامل (پیشبینیهای نهایی ImageNet را خروجی میدهد) |
- تخصصیابی طبیعی ویژگیها. جالب آنکه چون لایههای 1 و 2 هرگز میان GPUها ارتباط نداشتند، این دو کارت بهطور پیوسته نقشهای تخصصی پیدا کردند. یک GPU آشکارسازهای لبه و بافت مستقل از رنگ (فیلترهای خاکستری شبیه Gabor) را یاد گرفت، در حالی که GPU دیگر در لکهها و فامهای رنگی خاص تخصص یافت.
- به حداقل رساندن گلوگاههای PCIe. انتقال داده از طریق گذرگاه PCIe مادربرد کند بود. Krizhevsky با محدود کردن سختگیرانه ارتباط میان GPUها به Conv 3 و لایههای تماما متصل، GPUها را با تمام سرعت مشغول محاسبه نگه داشت، بدون اینکه برای انتقال داده متوقف شوند.
3. در ادامه دوران ImageNet چه اتفاقی افتاد
پیروزی AlexNet رقابتی سالانه در مسابقه ImageNet به راه انداخت و شبکهها را تنها در سه سال از 8 لایه به بیش از 150 لایه رساند.
- 2013 - ZFNet (بصریسازی و تنظیم). Matthew Zeiler و Rob Fergus روشهای کانولوشن معکوس را معرفی کردند تا نشان دهند AlexNet واقعا درون لایههای پنهان چه میبیند. ZFNet با کاهش اندازه فیلتر لایه اول AlexNet از 11×11 به 7×7 و کاهش گام، نرخ خطای پنج انتخاب برتر ImageNet را از 15.3% به 14.8% رساند.
- 2014 - VGGNet (عمق با فیلترهای یکنواخت 3×3). پژوهشگران Oxford ثابت کردند روی هم گذاشتن تعداد زیادی کانولوشن کوچک 3×3 (تا 16 یا 19 لایه) بهتر از استفاده از فیلترهای بزرگ منفرد (مانند 11×11 یا 5×5) عمل میکند. دو لایه 3×3 روی هم، همان ناحیه دید 5×5 را با پارامترهای کمتر و فعالسازیهای غیرخطی ReLU بیشتر پوشش میدهند و نرخ خطا را به 7.3% کاهش دادند.
- 2014 - GoogLeNet / Inception (کارایی چندمقیاسی). Google ماژول Inception را معرفی کرد که کانولوشنهای 1×1، 3×3 و 5×5 را در یک لایه بهصورت موازی اجرا و خروجیها را ادغام میکرد. GoogLeNet با استفاده از کانولوشنهای ارزان 1×1 برای فشرده کردن عمق کانالها پیش از محاسبات پرهزینه، با 12 برابر پارامتر کمتر از AlexNet به 22 لایه و نرخ خطای 6.7% رسید.
- 2015 - ResNet (اتصالهای میانبر و 152 لایه). صرفا روی هم گذاشتن لایههای بیشتر سرانجام دقت آموزش را کاهش داد، زیرا گرادیانها در پسانتشار ناپدید میشدند. Microsoft Research این مسئله را با اتصالهای باقیمانده (اتصالهای میانبر) حل کرد که به داده اجازه میداد از طریق میانبرهای مستقیم همانی از لایهها عبور کند. این روش شبکههای 152 لایهای را ممکن ساخت و به نرخ خطای پنج انتخاب برتر 3.57% رسید که برای نخستین بار از عملکرد انسانی در معیار سنجش (~5%) بهتر بود.