اخبار فارسی
آخرین
هوش مصنوعی و فناوری

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

نمایی توضیحی از جزئیات تراشه یک پردازنده، نه GPU شرکت NVIDIA که در مقاله بررسی می‌شود.
نمایی توضیحی از جزئیات تراشه یک پردازنده، نه GPU شرکت NVIDIA که در مقاله بررسی می‌شود.

دستاورد 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ها
ورودیتصویر RGB224 × 224 × 3در هر دو GPU کپی می‌شودهیچ‌کدام
Conv 1کانولوشن 11×11 (گام 4) + MaxPool96 فیلتر48 فیلتر در هر GPUمجزا (بدون همگام‌سازی)
Conv 2کانولوشن 5×5 + MaxPool256 فیلتر128 فیلتر در هر GPUمجزا (فقط Conv 1 مربوط به GPU خودش را می‌خواند)
Conv 3کانولوشن 3×3384 فیلتر192 فیلتر در هر GPUهمگام‌سازی کامل (هر 256 نقشه را از هر دو GPU می‌خواند)
Conv 4کانولوشن 3×3384 فیلتر192 فیلتر در هر GPUمجزا (فقط Conv 3 مربوط به GPU خودش را می‌خواند)
Conv 5کانولوشن 3×3 + MaxPool256 فیلتر128 فیلتر در هر GPUمجزا (فقط Conv 4 مربوط به GPU خودش را می‌خواند)
FC 6تماما متصل + Dropout4,096 نورون2,048 نورون در هر GPUهمگام‌سازی کامل (به همه خروجی‌های Conv 5 متصل می‌شود)
FC 7تماما متصل + Dropout4,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%) بهتر بود.

اخبار بیشتر: هوش مصنوعی و فناوری