cuda-convnet-এর ভেতরে: AlexNet-এর দ্বৈত-GPU স্তর ও ImageNet যুগ

2012 সালের AlexNet মাইলফলক নিম্নস্তরের GPU প্রকৌশল (cuda-convnet) ও বিভক্ত দ্বৈত-GPU স্থাপত্যের ওপর নির্ভর করেছিল এবং সরাসরি আরও গভীর ও দক্ষ কম্পিউটার ভিশন মডেল তৈরির দ্রুত প্রতিযোগিতা শুরু করেছিল।
1. cuda-convnet ভেতরে কীভাবে কাজ করত
NVIDIA cuDNN তৈরির আগে Alex Krizhevsky প্রাথমিক Fermi-স্থাপত্যের GPU (GTX 580) থেকে সর্বোচ্চ গতি পেতে সরাসরি CUDA C++-এ cuda-convnet লিখেছিলেন। আধুনিক লাইব্রেরি সাধারণত কনভোলিউশনকে বিশাল ম্যাট্রিক্স গুণে (im2col) বিস্তৃত করে, যাতে বিপুল মেমরি লাগে। প্রতিটি GTX 580-তে মাত্র 3 GB VRAM থাকায় Krizhevsky সরাসরি কাজ করা, মেমরি-সাশ্রয়ী GPU রুটিন তৈরি করেছিলেন।
- ব্যাচ-প্রথম মেমরি বিন্যাস (CHWN)। আধুনিক ফ্রেমওয়ার্কে ডিফল্ট হলো NCHW (ব্যাচ, চ্যানেল, উচ্চতা, প্রস্থ), যা একটি ছবির সব পিক্সেল মেমরিতে পাশাপাশি রাখে। Krizhevsky টেনসরগুলো CHWN ক্রমে রেখেছিলেন, যেখানে ব্যাচের মাত্রা (N) সবার শেষে। একটি warp-এর 32টি GPU থ্রেড যখন ঠিক একই পিক্সেল অবস্থানে 32টি আলাদা ছবি প্রক্রিয়া করত, তখন তাদের মেমরি পাঠ সম্পূর্ণ সংলগ্ন (coalesced) হতো, ফলে VRAM ব্যান্ডউইডথের সর্বোচ্চ ব্যবহার হতো।
- শেয়ার্ড মেমরি টাইলিং। গ্লোবাল VRAM থেকে পড়তে শত শত ক্লক সাইকেল লাগে, কিন্তু চিপের ভেতরের Shared Memory (GTX 580-এর প্রতিটি Streaming Multiprocessor-এ মাত্র 48 KB) থেকে পড়তে মাত্র কয়েকটি সাইকেল লাগে। থ্রেড ব্লকগুলো ছবির পিক্সেলের ছোট 2D প্যাচ ও ফিল্টারের ওয়েট Shared Memory-তে লোড করত এবং চূড়ান্ত ফল VRAM-এ ফেরত লেখার আগে কয়েক ডজন ডট প্রোডাক্ট গণনা করত।
- Warp-স্তরে রেজিস্টারের পুনর্ব্যবহার। Krizhevsky প্রতিটি থ্রেড ব্লককে একসঙ্গে একাধিক ফিল্টার জুড়ে আউটপুট পিক্সেলের একটি টাইল গণনার দায়িত্ব দিয়েছিলেন। দ্রুত GPU রেজিস্টারে ফিল্টারের ওয়েট রাখার মাধ্যমে Shared Memory থেকে লোড করা একটি ইমেজ প্যাচ একসঙ্গে অনেক ফিল্টারে পুনর্ব্যবহার করা হতো, যা মেমরি ট্র্যাফিক ব্যাপকভাবে কমাত।
2. AlexNet-এর নির্দিষ্ট স্তর ও দ্বৈত-GPU বিভাজন
AlexNet-এ 8টি শেখা স্তর (5টি কনভোলিউশনাল ও 3টি সম্পূর্ণ সংযুক্ত) ছিল, যেগুলোয় মোট প্রায় 6 কোটি প্যারামিটার ছিল। অ্যাক্টিভেশন, ওয়েট ও গ্রেডিয়েন্টের জন্য প্রয়োজনীয় 3 GB+ VRAM একটি GTX 580-তে না থাকায় Krizhevsky নেটওয়ার্ককে উল্লম্বভাবে দুটি সমান্তরাল ধারায় ভাগ করেছিলেন।
| স্তর | ধরন | মোট ফিল্টার / নিউরন | প্রতি-GPU বিভাজন | GPU-গুলোর মধ্যে যোগাযোগ |
|---|---|---|---|---|
| ইনপুট | RGB ছবি | 224 × 224 × 3 | দুই GPU-তেই কপি করা | নেই |
| Conv 1 | 11×11 Conv (স্ট্রাইড 4) + MaxPool | 96টি ফিল্টার | প্রতি GPU-তে 48টি ফিল্টার | বিচ্ছিন্ন (সিঙ্ক নেই) |
| Conv 2 | 5×5 Conv + MaxPool | 256টি ফিল্টার | প্রতি GPU-তে 128টি ফিল্টার | বিচ্ছিন্ন (শুধু নিজের GPU-এর Conv 1 পড়ে) |
| Conv 3 | 3×3 Conv | 384টি ফিল্টার | প্রতি GPU-তে 192টি ফিল্টার | পূর্ণ সিঙ্ক (দুই GPU থেকে সব 256টি ম্যাপ পড়ে) |
| Conv 4 | 3×3 Conv | 384টি ফিল্টার | প্রতি GPU-তে 192টি ফিল্টার | বিচ্ছিন্ন (শুধু নিজের GPU-এর Conv 3 পড়ে) |
| Conv 5 | 3×3 Conv + MaxPool | 256টি ফিল্টার | প্রতি GPU-তে 128টি ফিল্টার | বিচ্ছিন্ন (শুধু নিজের GPU-এর Conv 4 পড়ে) |
| FC 6 | সম্পূর্ণ সংযুক্ত + Dropout | 4,096টি নিউরন | প্রতি GPU-তে 2,048টি নিউরন | পূর্ণ সিঙ্ক (সব Conv 5 আউটপুটের সঙ্গে যুক্ত) |
| FC 7 | সম্পূর্ণ সংযুক্ত + Dropout | 4,096টি নিউরন | প্রতি GPU-তে 2,048টি নিউরন | পূর্ণ সিঙ্ক (সব FC 6 নিউরনের সঙ্গে যুক্ত) |
| FC 8 | সম্পূর্ণ সংযুক্ত (Softmax) | 1,000টি শ্রেণি | 1,000টি শ্রেণি (সম্মিলিত) | পূর্ণ সিঙ্ক (চূড়ান্ত ImageNet পূর্বানুমান দেয়) |
- স্বাভাবিক বৈশিষ্ট্য-বিশেষায়ন। মজার বিষয়, স্তর 1 ও 2 কখনো GPU-গুলোর মধ্যে যোগাযোগ না করায় কার্ড দুটি ধারাবাহিকভাবে বিশেষায়িত ভূমিকা গড়ে তুলেছিল। একটি GPU রং-নিরপেক্ষ প্রান্ত ও টেক্সচার শনাক্তকারী (গ্রেস্কেল Gabor-এর মতো ফিল্টার) শিখেছিল, অন্যটি রং-নির্দিষ্ট ছোপ ও বর্ণচ্ছটায় বিশেষায়িত হয়েছিল।
- PCIe বাধা সর্বনিম্ন রাখা। মাদারবোর্ডের PCIe বাস দিয়ে ডেটা পাঠানো ধীর ছিল। GPU-গুলোর মধ্যে যোগাযোগ কঠোরভাবে Conv 3 ও সম্পূর্ণ সংযুক্ত স্তরগুলোতেই সীমিত রেখে Krizhevsky ডেটা স্থানান্তরের জন্য থেমে না থেকে GPU-গুলোকে পূর্ণ গতিতে গণনা চালাতে দিয়েছিলেন।
3. ImageNet যুগে এরপর কী ঘটেছিল
AlexNet-এর জয় ImageNet প্রতিযোগিতায় বার্ষিক প্রতিদ্বন্দ্বিতা শুরু করেছিল, যাতে মাত্র তিন বছরে নেটওয়ার্ক 8টি স্তর থেকে 150টিরও বেশি স্তরে পৌঁছায়।
- 2013 - ZFNet (দৃশ্যায়ন ও সমন্বয়)। Matthew Zeiler ও Rob Fergus লুকানো স্তরগুলোর ভেতরে AlexNet আসলে কী দেখছে তা দৃশ্যায়নের জন্য ডিকনভোলিউশন কৌশল চালু করেন। AlexNet-এর প্রথম স্তরের ফিল্টার 11×11 থেকে 7×7 করে এবং স্ট্রাইড কমিয়ে ZFNet ImageNet-এর top-5 ত্রুটির হার 15.3% থেকে 14.8%-এ নামিয়েছিল।
- 2014 - VGGNet (একই ধরনের 3×3 ফিল্টারের মাধ্যমে গভীরতা)। Oxford-এর গবেষকেরা প্রমাণ করেন, অনেক ছোট 3×3 কনভোলিউশন স্তরে স্তরে সাজানো (16 বা 19টি স্তর পর্যন্ত), একক বড় ফিল্টার (যেমন 11×11 বা 5×5) ব্যবহারের চেয়ে ভালো কাজ করে। একটির ওপর আরেকটি রাখা দুটি 3×3 স্তর কম প্যারামিটার ও বাড়তি অরৈখিক ReLU অ্যাক্টিভেশন দিয়ে একই 5×5 দর্শনক্ষেত্র জুড়ে কাজ করে, ফলে ত্রুটির হার 7.3%-এ নেমে আসে।
- 2014 - GoogLeNet / Inception (বহু-স্কেল দক্ষতা)। Google Inception মডিউল চালু করে, যা একই স্তরের ভেতর 1×1, 3×3 ও 5×5 কনভোলিউশন সমান্তরালে চালিয়ে আউটপুটগুলো একত্র করে। ব্যয়বহুল গণনার আগে কম খরচের 1×1 কনভোলিউশন দিয়ে চ্যানেলের গভীরতা সংকুচিত করে GoogLeNet, AlexNet-এর চেয়ে 12 গুণ কম প্যারামিটার ব্যবহার করে 22টি স্তর ও 6.7% ত্রুটির হার অর্জন করে।
- 2015 - ResNet (স্কিপ সংযোগ ও 152টি স্তর)। শুধু আরও স্তর যোগ করতে থাকলে একসময় প্রশিক্ষণের নির্ভুলতা কমতে শুরু করত, কারণ ব্যাকপ্রপাগেশনের সময় গ্রেডিয়েন্ট বিলীন হয়ে যেত। Microsoft Research Residual Connections (স্কিপ সংযোগ) দিয়ে এর সমাধান করে, যাতে ডেটা সরাসরি আইডেন্টিটি শর্টকাট দিয়ে স্তর এড়িয়ে যেতে পারে। এতে 152-স্তরের নেটওয়ার্ক সম্ভব হয়, যা 3.57% top-5 ত্রুটির হার অর্জন করে প্রথমবারের মতো মানুষের স্তরের বেঞ্চমার্ক পারফরম্যান্সকে (~5%) ছাড়িয়ে যায়।