تغییرات اخیر

در اینجا اطلاعیه‌ها، نسخه‌ها و تغییرات جدید لیارا فهرست می‌شوند.

آموزش موازی‌ سازی داده‌ها (Data Parallelism) در یادگیری عمیق


۱ شهریور ۱۴۰۴

موازی‌سازی داده‌ها (Data Parallelism) به فرآیندی گفته می‌شود که در آن یک مجموعه داده بزرگ به بخش‌های کوچکتر تقسیم شده و هر بخش به طور همزمان توسط یک پردازنده یا واحد پردازشی دیگر پردازش می‌شود. این روش برای بهبود عملکرد و کارایی در پردازش داده‌های حجیم و پیچیده کاربرد دارد.

اندازه‌ی داده‌ها و شبکه‌های عصبی با سرعت بسیار بالایی در حال افزایش است. در چنین شرایطی، استفاده از یک پردازنده تنها برای انجام یک وظیفه مشخص به‌صرفه و کارآمد نخواهد بود. ممکن است در حال آموزش یک شبکه کانولوشنی روی میلیون‌ها تصویر باشید یا بخواهید یک مدل زبانی بزرگ با میلیاردها پارامتر را توسعه دهید. موازی‌سازی داده‌ها یکی از تکنیک‌های اساسی برای افزایش سرعت پردازش در یادگیری ماشین است که پایه و اساس آموزش توزیع‌شده و مقیاس‌پذیر را در محیط‌هایی با چندین GPU یا حتی کل دیتاسنترها فراهم می‌کند و امکان پردازش بهینه مدل‌های بزرگ را مهیا می‌کند. در این مقاله از بلاگ لیارا، به تشریح عملکرد موازی‌سازی داده‌ها و تفاوت آن با موازی‌سازی وظیفه و مدل خواهیم پرداخت. همچنین، نحوه پیاده‌سازی این روش با استفاده از فریم‌ورک‌های محبوب مانند PyTorch، TensorFlow، DeepSpeed و FSDP و کاربردهای آن در آموزش مدل‌های بزرگ زبان را بررسی خواهیم کرد، تا پایان این مطلب همراه ما باشید:)

آموزش موازی‌ سازی داده‌ها (Data Parallelism) در یادگیری عمیق

آنچه در این مقاله خواهید خواند:

  • نکات کلیدی
  • موازی سازی داده چیست؟
  • موازی سازی داده چگونه کار می کند؟
  • موازی سازی داده: همگام (Synchronous) یا ناهمگام (Asynchronous)
  • مقایسه موازی سازی داده ها و موازی سازی وظایف
  • تفاوت موازی سازی داده با موازی سازی مدل
  • مزایا و معایب موازی سازی داده ‌ها
  • پیاده سازی موازی سازی داده ها
  • Ray فریم‌ورکی قدرتمند برای پردازش موازی داده‌ها
  • موازی سازی پیشرفته برای مدل های بزرگ
  • جمع بندی
  • سوالات متداول

نکات کلیدی

در این قسمت قبل از شروع مقاله به چند تعریف و نکته مهم اشاره می‌کنیم که دانستن آن‌ها برای درک بهتر مقاله، خالی از لطف نیست:)

  • در موازی‌سازی داده، هر واحد پردازشی (CPU یا GPU) همان عملیات مدل را روی بخش متفاوتی از داده‌ها اجرا می‌کند. سپس نتایج بدست آمده، همگام‌سازی و جمع می‌شوند تا بروزرسانی مدل در تمام واحدها یکسان باقی بماند.
  • کتابخانه‌های معروف یادگیری ماشین مانند Pytorch (شامل DataParallel و DistributedDataParallel)، TensorFlow با tf.distribute.Strategy، Horovod و Ray، APIهای جامعی برای مقیاس‌بندی موازی‌سازی داده ارائه می‌دهند. علاوه بر این، سیستم‌های پیشرفته‌ای مانند FSDP و DeepSpeed به طور خاص برای مدیریت مدل‌های بزرگ طراحی شده‌اند و گزینه‌های منعطفی برای آموزش در محیط‌های مختلف فراهم می‌کنند.
  • موازی‌سازی داده زمانی کارآمد است که مدل شما بتواند روی یک دستگاه جای بگیرد و مجموعه داده‌ها بزرگ باشند. اما برای مدل‌های بسیار بزرگ، استفاده از موازی‌سازی مدل یا روش‌های ترکیبی (مانند FSDP و ZeRO) برای رفع محدودیت‌های حافظه و پهنای باند ضروری است.
  • به عنوان نکته آخر، موازی‌سازی تسک به اجرای موازی عملیات مختلف روی یک داده اشاره دارد، در حالی که موازی‌سازی مدل به تقسیم خود مدل بین دستگاه‌های مختلف می‌پردازد.
کسب و کار خود را با دسترسی به API هوش مصنوعی ارتقاء دهید. 
✅ ارائه توکن رایگان ✅سازگاری با OpenAI SDK ✅ دسترسی به ۲۰ مدل زبانی بزرگ
خرید سرویس هوش مصنوعی

موازی سازی داده چیست؟

موازی‌سازی داده تکنیکی است که در آن داده‌ها به بخش‌های کوچکتر تقسیم شده و هم‌زمان روی چند دستگاه مختلف مانند GPU پردازش می‌شوند. هر دستگاه، فرایند یادگیری را روی بخش متفاوتی از داده‌ها به‌طور همزمان انجام می‌دهد. این روش باعث می‌شود بتوانیم حجم زیادی از داده‌ها را سریع‌تر و بهینه‌تر پردازش کنیم. به عبارت دیگر، با افزایش تعداد دستگاه‌ها، می‌توان در زمان کمتر، مدل‌های یادگیری عمیق را آموزش داد، مخصوصا زمانی که با مجموعه داده‌های بسیار بزرگ یا مدل‌های پیچیده کار می‌کنیم. بنابراین، موازی‌سازی داده‌ها یکی از اصول کلیدی آموزش، در یادگیری عمیق است که به افزایش سرعت پردازش کمک می‌کند.

موازی سازی داده

در شکل بالا، فلش‌ها نشان می‌دهند که چگونه داده‌ها و مدل‌ها به صورت موازی و هم‌زمان بین دستگاه‌ها تقسیم و هماهنگ می‌شوند:

  • فلش‌های رو به پایین نشان‌دهنده‌ی مرحله‌ی توزیع مدل و داده‌ها به دستگاه‌های مختلف برای پردازش هم‌زمان است.
  • فلش‌های رو به بالا نمایانگر جمع‌آوری و هماهنگ‌سازی نتایج (مثل گرادیان‌ها) از همه دستگاه‌ها برای به‌روزرسانی همزمان مدل‌ها است.

این فرایند باعث می‌شود مدل روی بخش‌های مختلف داده به طور هم‌زمان و یکپارچه آموزش ببیند.

موازی سازی داده چگونه کار می کند؟

در این بخش بیایید نگاهی به روند کار با موازی‌سازی داده‌ها بیندازیم، اینجا تمرکز ما روی آموزش یک مدل یادگیری ماشین با استفاده از چند GPU است.

  1. کپی‌برداری از مدل: ابتدا یک نسخه دقیق و کامل از مدل (با همان وزن‌های اولیه) روی هر GPU بارگذاری می‌شود. هر دستگاه حالا یک مدل مستقل دارد که به صورت همزمان روی بخش خاص خودش از داده‌ها کار می‌کند. برای مثال، با ۴ GPU، چهار نسخه جداگانه از مدل داریم که هرکدام روی داده متفاوت اجرا می‌شود.
  2. تقسیم داده‌ها: داده‌های ورودی یا batch آموزش به تعداد GPUها تقسیم می‌شود. هر GPU یک بخش مساوی از داده‌ها را دریافت و پردازش می‌کند. این کار معمولاً با Data Loader یا Samplerهایی انجام می‌شود که به صورت خودکار بخش‌های داده را به دستگاه‌ها اختصاص می‌دهند. مثلاً یک batch ۱۲۸ تایی به ۴ زیرمجموعه ۳۲ تایی تبدیل می‌شود تا هر GPU داده خودش را داشته باشد.
  3. پردازش موازی: هر GPU، همراه با نسخه مستقل مدل، داده‌های اختصاصی‌اش را به طور همزمان پردازش می‌کند. در این مرحله، همه GPUها به طور همزمان عملیات پیش‌رو (محاسبه پیش‌بینی) و پس‌رو (محاسبه گرادیان) را بدون نیاز به ارتباط با یکدیگر انجام می‌دهند. هر مدل روی داده متفاوتی کار می‌کند، پس گرادیان‌ها هم متفاوت خواهند بود.
  4. همگام‌سازی گرادیان‌ها: بعد از پایان هر گام آموزش، همه GPUها گرادیان‌های خود را با هم به اشتراک می‌گذارند و با استفاده از الگوریتم بهینه‌ای مثل All-reduce، این گرادیان‌ها جمع‌آوری و میان دستگاه‌ها توزیع می‌شوند. این کار تضمین می‌کند که همه مدل‌ها پس از این مرحله، یک مجموعه گرادیان مشترک دارند، انگار کل داده‌ها روی یک دستگاه پردازش شده‌اند.
  5. به‌روزرسانی مدل: حالا هر GPU از گرادیان‌های مشترک استفاده کرده و وزن‌های مدل خود را به‌روزرسانی می‌کند (مثلاً با یک قدم الگوریتم Adam یا گرادیان نزولی). به دلیل یکسان بودن گرادیان‌ها، مدل‌ها در همه دستگاه‌ها همگام باقی می‌مانند..
  6. تکرار چرخه: با بارگذاری batch بعدی، این مراحل دوباره تکرار می‌شود: تقسیم داده، پردازش موازی، همگام‌سازی و به‌روزرسانی مدل. این فرآیند تا پایان آموزش ادامه می‌یابد و دستگاه‌ها در هر تکرار یا در فواصل مشخص، برای حفظ هماهنگی، با هم همگام می‌شوند.

این فرآیند باعث می‌شود بتوانیم از داده‌های بزرگ‌تر بهتر استفاده کنیم و زمان آموزش مدل را به شکل قابل توجهی کاهش دهیم. وقتی آموزش روی چند دستگاه مختلف به‌صورت هم‌زمان انجام می‌شود، تبادل اطلاعات مثل همگام‌سازی گرادیان‌ها از طریق شبکه بین دستگاه‌ها انجام می‌شود.با این روش می‌توانیم مدل‌های بسیار بزرگ را روی چند سیستم آموزش دهیم، البته باید دقت کنیم که سرعت و کیفیت ارتباط شبکه حفظ شود تا آموزش بهینه انجام شود.

هاست پایتون چیست؟ + راهنمای کامل خرید هاست Python
خرید هاست پایتون

موازی سازی داده: همگام (Synchronous) یا ناهمگام (Asynchronous)

در بخش قبل درباره آموزش موازی همزمان صحبت کردیم. حالا وقتی قصد طراحی سیستم‌های یادگیری ماشین توزیع شده را داریم، باید تصمیم بگیریم که آیا می‌خواهیم همه واحدهای پردازشی به‌صورت همزمان مدل را به‌روزرسانی کنند یا هر واحد به‌صورت مستقل و با سرعت خودش به‌روزرسانی‌ها را انجام دهد. هر کدام از این رویکردها مزایا و معایب خود را دارند، مثلا از نظر پایداری، سرعت اجرای کار و پیچیدگی سیستم تفاوت دارند. جدول زیر مقایسه‌ای از این دو روش را ارائه می‌کند.

جنبهموازی‌سازی داده همزمان (Synchronous Data Parallelism)موازی‌سازی داده ناهمزمان (Asynchronous Data Parallelism)
نحوه عملکردهمه واحدهای پردازشی هر مرحله را با هم انجام می‌دهند، سپس همگام‌سازی می‌شوندهر واحد پردازشی با سرعت خودش کار می‌کند، بدون همگام‌سازی
به‌روزرسانی‌هامدل فقط پس از اتمام کار همه واحدها به‌روزرسانی می‌شودمدل به محض اتمام کار هر واحد به‌روزرسانی می‌شود
گلوگاه سرعتبه کندترین واحد پردازشی وابسته است (واحدی که دیرتر تمام می‌کند)به هیچ واحد خاصی وابسته نیست، کندی یک واحد تأثیری ندارد
یکسان بودن مدل‌هاهمه نسخه‌های مدل کاملاً یکسان باقی می‌مانندنسخه‌های مدل ممکن است کمی متفاوت باشند
پایداریپایداری بیشتر، تنظیم و عیب‌یابی آسان‌ترممکن است کمتر پایدار باشد و نیاز به تنظیم دقیق‌تر دارد
ارتباطاتاز الگوریتم “all-reduce” استفاده می‌کند (ارتباط مستقیم بین واحدها)از “parameter server” استفاده می‌کند (یک هماهنگ‌کننده مرکزی)
موارد استفاده رایجاکثر فریمورک‌های یادگیری عمیق مثل DDP و Horovodدستگاه‌های لبه (Edge devices)، خوشه‌های با سرعت نامطمئن یا متفاوت
زمان استفادهوقتی دقت و ثبات اهمیت داردوقتی سرعت و بهره‌وری سخت‌افزاری حیاتی است

به‌طور خلاصه، موازی‌سازی داده همزمان مانند یک ارکستر منظم است، همه GPUها دقیقا در یک ضرب می‌زنند، به‌روزرسانی‌ها کاملا هماهنگ انجام می‌شود و نتیجه‌اش ثبات بالا و خروجی قابل اعتماد است. به‌همین خاطر، تقریبا فریم‌ورک‌های محبوب یادگیری عمیق، مخصوصا برای آموزش مدل‌های سنگین روی GPU، از همین روش استفاده می‌کنند.

از طرف دیگر، موازی‌سازی داده ناهمزمان بیشتر شبیه یک گروه جَز است که هر نوازنده ریتم خودش را دارد؛ این یعنی استفاده حداکثری از منابع، مخصوصا وقتی سخت‌افزارها سرعت و پایداری یکسانی ندارند. البته این آزادی عمل بهایی دارد: باید با دقت تنظیم شود تا مدل، مسیر همگرایی را گم نکند.

نحوه ساخت محیط توسعه پایتون در سرور مجازی
محیط توسعه پایتون در سرور مجازی

مقایسه موازی سازی داده ها و موازی سازی وظایف

محاسبات موازی عمدتاً در دو دسته اصلی قرار می‌گیرد: موازی‌سازی داده (Data Parallelism) و موازی‌سازی وظیفه (Task Parallelism). هر دو این رویکردها با هدف افزایش سرعت پردازش در سیستم‌های چند هسته‌ای یا توزیع شده طراحی شده‌اند، اما در نحوه تقسیم کار و ساختار کاملاً متفاوت عمل می‌کنند.

در موازی‌سازی داده، یک عملیات مشخص به صورت همزمان روی بخش‌های مختلفی از داده اجرا می‌شود. به بیان ساده، چندین واحد پردازشی همان الگوریتم را روی تکه‌های مختلف داده اجرا می‌کنند. مثلاً فرض کنید آرایه بزرگی از اعداد دارید که باید مجموع آن‌ها محاسبه شود. در این حالت، آرایه به بخش‌های کوچک‌تر تقسیم شده و هر هسته یا Thread بخشی از آن را پردازش می‌کند. پس از اتمام پردازش موازی، نتایج جزئی با هم ترکیب می‌شوند تا حاصل نهایی به دست آید. نکته کلیدی این است که تمام واحدهای پردازشی عملیات یکسانی را روی داده‌های مختلف انجام می‌دهند.

برخلاف آن، موازی‌سازی وظیفه به اجرای همزمان چند وظیفه متفاوت می‌پردازد. در این مدل، هر واحد پردازشی یک وظیفه مجزا را انجام می‌دهد. برای مثال، ممکن است یک Thread مسئول فیلتر کردن داده‌ها باشد، در حالی که Thread دیگر به صورت همزمان داده‌ها را مرتب می‌کند. این رویکرد زمانی کاربرد دارد که مدل پردازشی شامل چند مرحله با الگوریتم‌های متفاوت باشد که بتوان آنها را به صورت موازی پیش برد.

مقایسه موازی سازی داده و موازی سازی وظایف

به‌طور خلاصه:

  • موازی‌سازی داده = انجام یک کار یکسان روی بخش‌های مختلف داده.
  • موازی‌سازی وظیفه = انجام چند کار متفاوت روی بخش‌های یکسان یا متفاوت داده.

این دو روش می‌توانند در یک سیستم پیچیده ترکیب شوند، اما درک تفاوت آن‌ها هنگام طراحی الگوریتم‌های موازی یا روش‌های آموزش توزیع‌شده در یادگیری ماشین بسیار مفید است.

مدل هوش مصنوعی چیست؟ کاربرد و انواع AI به زبان ساده
مدل هوش مصنوعی چیست؟

تفاوت موازی سازی داده با موازی سازی مدل

همان‌طور که پیش‌تر گفتیم، موازی‌سازی داده به این صورت است که مدل به صورت کامل روی چند دستگاه یا هسته مختلف کپی می‌شود و داده‌ها بین این نسخه‌ها تقسیم می‌شوند، به‌طوری که هر نسخه بخش مشخصی از داده‌ها را به صورت همزمان پردازش می‌کند. اما در موازی‌سازی مدل، تمرکز بر تقسیم‌بندی ساختار مدل بین چند دستگاه مختلف است. این رویکرد زمانی کاربرد دارد که حجم مدل از ظرفیت حافظه یک دستگاه فراتر رود یا بخواهیم با موازی‌سازی بخش‌های مختلف مدل، سرعت پردازش را افزایش دهیم.

تفاوت موازی سازی داده و موازی سازی مدل

به بیان ساده‌تر:

  • موازی‌سازی داده یعنی مدل را کپی می‌کنیم و داده‌ها را به بخش‌های کوچکتر تقسیم می‌کنیم.
  • موازی‌سازی مدل یعنی مدل را تقسیم‌بندی می‌کنیم و داده‌ها معمولاً به صورت کامل یا دسته‌ای، روی هر دستگاه کپی می‌شوند.

مزایا و معایب موازی سازی داده ‌ها

موازی‌سازی داده یکی از پایه‌های افزایش سرعت در یادگیری ماشین و یادگیری عمیق محسوب می‌شود. زیرا به راحتی امکان توزیع داده‌ها روی چند واحد پردازشی را فراهم می‌کند. اما این روش بدون چالش نیست و در عمل باید با محدودیت‌هایی مانند هماهنگی بین هسته‌ها و بارگذاری مجدد داده‌ها دست‌پنجه نرم کنیم. در ادامه، نکات کلیدی مثبت و منفی این رویکرد را مرور می‌کنیم.

مزایا (Pros)معایب (Cons)
افزایش کارایی: با توزیع کار بین چند پردازنده، سرعت اجرای تسک‌ها به طور چشمگیری بهبود پیدا می‌کند. مصرف بالای حافظه: هر پردازنده یک نسخه کامل از مدل یا داده‌ها را ذخیره می‌کند که باعث افزایش چشمگیر مصرف حافظه و محدودیت در مقیاس‌پذیری مدل‌های بزرگ می‌شود.
سادگی پیاده‌سازی: مدل به صورت کامل روی همه پردازنده‌ها کپی می‌شود و چارچوب‌ها مسئول مدیریت تقسیم و ادغام داده‌ها هستند، در نتیجه تغییرات کد معمولاً حداقلی است.بار ارتباطی بالا: همگام‌سازی نتایج (مثلاً گرادیان‌ها) نیازمند تبادل داده‌های زیاد بین پردازنده‌ها است که با افزایش اندازه مدل یا تعداد پردازنده‌ها می‌تواند باعث گلوگاه شود.
قابلیت مقیاس‌پذیری بالا: افزودن پردازنده‌های بیشتر امکان مدیریت داده‌ها یا مدل‌های حجیم‌تر را فراهم می‌کند و به همین دلیل در سیستم‌های توزیع‌شده بسیار محبوب است.جریمه همگام‌سازی: در مدل‌های همزمان، پردازنده‌های سریع‌تر باید منتظر پردازنده‌های کندتر بمانند که این موضوع عملکرد کل سیستم را تحت تاثیر قرار می‌دهد.
قابلیت بازیابی خطا: در صورت خرابی یک پردازنده، تنها بخشی از داده‌ها تحت تاثیر قرار می‌گیرند و با استفاده از تکنیک‌های نقطه‌بازگشت، فرآیند ادامه پیدا می‌کند.کاهش بازده با افزایش تعداد پردازنده‌ها: پس از رسیدن به یک حد، اضافه کردن پردازنده‌های بیشتر به دلیل هزینه‌های ارتباطی و همگام‌سازی، افزایش سرعت چشمگیری ایجاد نمی‌کند و ممکن است کیفیت مدل را تحت تاثیر قرار دهد.
توزیع بار متوازن: تقسیم‌بندی بر مبنای داده معمولا بار کاری را به صورت مساوی بین پردازنده‌ها تقسیم می‌کند و از بیکار ماندن منابع جلوگیری می‌کند.محدودیت کاربرد: این روش برای مسائلی که وابستگی‌های پیچیده یا نیاز به اطلاعات کلان دارند مناسب نیست و در این موارد باید از روش‌های دیگر استفاده کرد.

در آخر باید گفت، موازی‌سازی داده یکی از موثرترین روش‌ها برای افزایش سرعت و مقیاس‌پذیری در پروژه‌های یادگیری ماشین است. با تقسیم داده‌ها بین چند پردازنده، می‌توان به شکل قابل توجهی زمان پردازش را کاهش داد و حجم کاری بزرگ‌تر را مدیریت کرد. اما در کنار این مزایا، باید در نظر داشت که موازی‌سازی داده چالش‌هایی مثل افزایش مصرف منابع، پیچیدگی بیشتر در هماهنگی پردازنده‌ها و نیاز به تنظیم دقیق پارامترها به همراه دارد. قبل از پیاده‌سازی، حتماً این موارد را بسنجید تا بهترین تعادل بین سرعت و منابع سیستم به‌دست بیاید.

پیاده سازی موازی سازی داده ها

چندین فریم‌ورک و ابزار برای موازی‌سازی داده در دسترس

که PyTorch دو روش اصلی برای موازی‌سازی آموزش مدل ارائه می‌دهد:

  • DataParallel: این روش ساده‌ترین روش برای آموزش مدل روی چند GPU در یک ماشین است. ورودی به بخش‌های کوچکتر تقسیم شده و به صورت همزمان روی GPUهای مختلف اجرا می‌شود، سپس نتایج جمع‌آوری و بازگردانده می‌شوند. با این وجود، این روش وقتی چند نود (چند ماشین) درگیر هستند، کارایی مطلوبی ندارد و می‌تواند باعث ایجاد گلوگاه روی فرایند اصلی شود.
  • DistributedDataParallel: برای آموزش در مقیاس بالا روی چند GPU و چند ماشین، این ماژول بهترین گزینه است. در این حالت، هر پردازش یک نسخه کامل از مدل را روی یک GPU اجرا می‌کند و پس از هر مرحله Backward، عملیات All-Reduce برای همگام‌سازی گرادیان‌ها بین همه پردازش‌ها انجام می‌شود. این روش به مراتب کاراتر و مقیاس‌پذیرتر است و استفاده از آن برای توسعه سیستم‌های آموزش توزیع‌شده توصیه می‌شود.

نمونه شبه کد این روش به شکل زیر است:

import torch
import torch.nn as nn

# DataParallel usage (single machine, multiple GPUs)
model = nn.DataParallel(MyModel())
output = model(input)

# DistributedDataParallel usage (scalable, multi-GPU)
import torch.distributed as dist
dist.init_process_group(backend="nccl")
model = nn.parallel.DistributedDataParallel(
    MyModel().to(local_rank), device_ids=[local_rank]
)

کد بالا، مدل را برای اجرای موازی آماده می‌کند. در روش DataParallel، ورودی‌ها به بخش‌هایی تقسیم می‌شوند و هر بخش روی یک دستگاه (GPU) به صورت جداگانه پردازش می‌شود. اما در DistributedDataParallel، علاوه بر اجرای مدل روی چند فرایند مجزا، گرادیان‌ها پس از هر مرحله محاسبه، بین تمام فرایندها همگام‌سازی می‌شوند تا هماهنگی کامل حفظ شود.

کتابخانه TensorFlow: استراتژی توزیع tf

TensorFlow یک API یکپارچه برای آموزش توزیع شده از طریق ماژول tf.distribute.Strategy ارائه می‌دهد. این فریم‌ورک، انتزاعی از فرایند توزیع بار کاری آموزش روی سخت‌افزارهای مختلف را فراهم می‌کند.

به گونه‌ای که با حداقل تغییرات کد بتوان مدل را در محیط‌های متنوع مقیاس‌پذیر کرد.
استراتژی‌های موجود در این ماژول شامل موارد زیر است:

  • MirroredStrategy: برای آموزش همزمان (سینکرون) روی چند GPU در یک ماشین واحد استفاده می‌شود.
  • MultiWorkerMirroredStrategy: آموزش همزمان روی چندین ماشین، هر کدام با یک یا چند GPU.
  • TPUStrategy: پشتیبانی از آموزش توزیع‌شده روی کلاسترهای TPU.
  • ParameterServerStrategy: مناسب برای آموزش ناهمزمان (آسینکرون) با استفاده از سرورهای پارامتر.
  • CentralStorageStrategy: (در حالت آزمایشی) متغیرها را روی یک دستگاه مرکزی ذخیره می‌کند و برای موارد خاص کاربرد دارد.

نمونه شبه کد برای آموزش همزمان چند GPU با TensorFlow:

import tensorflow as tf
# Example: Synchronous multi-GPU training
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    model = build_model(...)
model.fit(dataset, epochs=..., ...)

کد بالا، به‌صورت خودکار داده‌ها را به بخش‌های جداگانه تقسیم کرده و پس از هر مرحله، گردایان‌ها را تجمیع می‌کند.

کتابخانه Horovod: آموزش توزیع شده در کلاسترهای بزرگ

Horovod یک کتابخانه مستقل از فریم‌ورک است که برای آموزش توزیع شده در مقیاس بزرگ در یادگیری عمیق طراحی شده است. این ابزار با PyTorch، TensorFlow و MXNet سازگار است و فرایند آموزش مدل‌های یادگیری عمیق روی چند GP‌U، نود و حتی کلاسترهای چندگانه را ساده می‌کند.

Horovod برای همگام‌سازی گرادیان‌ها از کتابخانه‌های واسط با عملکرد بالا مانند MPI و NCCL استفاده می‌کند.

ویژگی‌های مهم Horovod عبارتنداز:

  • تغییرات کد بسیار محدود برای انتقال از یک GPU به کلاسترهای چند نودی.
  • رسیدن به مقیاس‌پذیری نزدیک به خطی با افزایش منابع.
  • پشتیبانی از فشرده‌سازی گرادیان و مکانیزم‌های تحمل خطا برای بهینه‌سازی عملکرد.
  • پشتیبانی همزمان از موازی‌سازی داده و مدل.

نمونه کد شبه‌برنامه آموزش توزیع‌شده با Horovod در PyTorch:

import horovod.torch as hvd
hvd.init()

model = MyModel().to(hvd.local_rank())
optimizer = optim.Adam(model.parameters(), lr=0.001 * hvd.size())

# Wrap the optimizer with Horovod DistributedOptimizer
optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())

# Synchronize model parameters across workers
hvd.broadcast_parameters(model.state_dict(), root_rank=0)

این قطعه کد، راه‌اندازی اولیه Horovod برای آموزش توزیع‌شده را انجام می‌دهد و نرخ یادگیری به‌طور خودکار بر اساس تعداد پردازشگرها (workers) تنظیم می‌شود. همچنین پارامترهای مدل بین تمام پردازش‌ها همگام‌سازی می‌شوند تا هماهنگی کامل برقرار باشد. بخش DistributedOptimizer در Horovod به‌صورت بهینه، میانگین‌گیری گرادیان‌ها و هماهنگی به‌روزرسانی‌ها را در چند GPU یا نود به عهده دارد و باعث افزایش کارایی آموزش موازی می‌شود.

Ray فریم‌ورکی قدرتمند برای پردازش موازی داده‌ها

Ray فراتر از حوزه یادگیری عمیق است و به‌عنوان یک چارچوب چندمنظوره شناخته می‌شود. با این فریم‌ورک می‌توانید، پردازش داده‌ها و آموزش مدل‌های یادگیری ماشین را به شکل موازی و توزیع شده مدیریت کنید، بدون اینکه محدود به فریم‌ورک خاصی باشید.

شاید لازم باشد چند نکته کلیدی درباره قابلیت‌های Ray بدانید:

  • مدیریت و هماهنگی بارهای کاری آموزش توزیع‌شده برای فریمورک‌هایی مثل PyTorch و TensorFlow و دیگران.
  • پشتیبانی از عملیات پردازش داده به صورت موازی، تنظیم خودکار ابرپارامترها (Hyperparameter tuning) و الگوریتم‌های یادگیری تقویتی.
  • ارائه APIهای بومی و ساده برای مدیریت بارهای کاری یادگیری عمیق در محیط‌های توزیع‌شده.
  • انعطاف‌پذیری بالا و سهولت در استفاده، که Ray را به گزینه‌ای محبوب برای ساخت خطوط پردازش پیچیده و مقیاس‌پذیر تبدیل کرده است.

در ادامه، یک مثال ساده با پایتون خواهیم دید که چطور می‌توان یک حلقه آموزش را به صورت موازی روی چند واحد پردازشی با Ray اجرا کرد و کار توزیع‌شده را به شکل کاربردی به جریان انداخت.

pip install ray

import ray
import numpy as np

# Initialize Ray
ray.init()

# Dummy training function to simulate model training on a data shard
@ray.remote
def train_worker(data_shard):
    # Initialize model weights randomly
    weights = np.random.rand(10)
    # Dummy "training": update weights with mean of the data shard
    for batch in data_shard:
        weights += batch.mean(axis=0) * 0.01
    return weights

# Generate dummy data and split into shards
num_workers = 4
data = [np.random.rand(100, 10) for _ in range(num_workers)]  # 4 shards of data

# Launch training jobs in parallel
results = [train_worker.remote(shard) for shard in data]

# Collect the results (trained weights) from all workers
trained_weights = ray.get(results)

# Aggregate weights (simple average)
final_weights = np.mean(trained_weights, axis=0)

print("Aggregated model weights:", final_weights)

نحوه عملکرد:

  • هر واحد اجرایی (worker) در Ray یک بخش (شارد) از داده را دریافت کرده و یک به‌روزرسانی ساده آموزش را انجام می‌دهد.
  • تمام واحدها به صورت همزمان و موازی اجرا می‌شوند.
  • در پایان، نتایج به‌دست‌آمده جمع‌آوری و میانگین‌گیری می‌شوند که این فرآیند شبیه‌سازی همگام‌سازی وزن‌های مدل است.

شما می‌توانید محتوای تابع train_worker را با کد واقعی آموزش خود (با استفاده از PyTorch، TensorFlow و غیره) جایگزین کنید.

موازی سازی پیشرفته برای مدل های بزرگ

وقتی پارامترهای مدل‌ها به میلیاردها پارامتر افزایش پیدا می‌کنند، روش‌های قدیمی و سنتی موازی‌سازی داده به محدودیت‌های جدی برخورد می‌کنند، نگهداری چند نسخه کامل از مدل‌های بزرگ در حافظه دیگر شدنی نیست. به‌همین دلیل، رویکردهای پیشرفته‌تری شکل گرفته که ترکیبی از موازی‌سازی داده، موازی‌سازی مدل و تقسیم‌بندی را برای مدیریت مدل‌های زبانی بزرگ (LLM) و شبکه‌های بزرگ به‌کار می‌گیرند.

روش Fully Sharded Data Parallel (FSDP)

FSDP، که توسط Facebook AI Research توسعه یافته، مدل را به بخش‌های کوچکتر تقسیم می‌کند؛ به جای اینکه هر دستگاه نسخه کاملی از مدل و وضعیت بهینه‌ساز را نگه دارد، هر GPU فقط بخشی از پارامترها، گرادیان‌ها و وضعیت بهینه‌ساز را ذخیره می‌کند.

مراحل کلیدی در FSDP:

  • هر GPU فقط بخشی از پارامترها، گرادیان‌ها و وضعیت بهینه‌ساز را در حافظه دارد.
  • قبل از عملیات‌های forward و backward، بخش‌های مورد نیاز پارامترها به صورت موقتی جمع‌آوری می‌شوند تا مدل کامل برای محاسبات آماده شود.
  • بعد از عملیات‌ها، بخش‌های اضافی حذف می‌شوند تا فضای حافظه آزاد شود و فقط shard محلی باقی بماند.
  • گرادیان‌ها به صورت کاهش‌یافته و توزیع شده مدیریت می‌شوند، به طوری که هر GPU فقط shard مربوط به خودش را نگه می‌دارد.

تکنیک ZeRO و DeepSpeed

DeepSpeed، کتابخانه بهینه‌سازی مایکروسافت، با مجموعه تکنیک ZeRO (Zero Redundancy Optimizer) شناخته می‌شود که هدف اصلی‌اش حذف تکرار داده‌ها در موازی‌سازی است.

مراحل ZeRO:

  • مرحله ۱: تنها وضعیت بهینه‌ساز بین دستگاه‌ها تقسیم می‌شود تا مصرف حافظه کاهش یابد.
  • مرحله ۲: هم وضعیت بهینه‌ساز و هم گرادیان‌ها تقسیم‌بندی می‌شوند برای صرفه‌جویی بیشتر.
  • مرحله ۳: وضعیت بهینه‌ساز، گرادیان‌ها و پارامترها به طور کامل شارد می‌شوند؛ چیزی که معادل استراتژی FULL_SHARD در FSDP است و امکان اجرای مدل‌های بسیار بزرگ روی سخت‌افزار معمولی را فراهم می‌کند.

vLLM برای استقرار مدل‌های بزرگ

در حالی که FSDP و DeepSpeed بیشتر روی آموزش متمرکزند، vLLM نمونه‌ای از موازی‌سازی در سرویس‌دهی به مدل‌های بزرگ است. این موتور متن‌باز، اجرای سریع و بهینه مدل‌های زبانی مبتنی بر ترنسفورمر را با مدیریت هوشمند حافظه GPU و اجرای توزیع‌شده فراهم می‌کند.

ویژگی کلیدی vLLM، فناوری PagedAttention است که امکان تعویض پویا حافظه GPU برای کش توجه را فراهم می‌کند. این قابلیت، پردازش دسته‌ای (batching) و اجرای موازی درخواست‌ها را با تأخیر کم ممکن می‌سازد. همچنین vLLM از موازی‌سازی تنسوری و خط لوله‌ای برای استنتاج مدل‌ها بین چند GPU پشتیبانی می‌کند.

این تکنیک‌های پیشرفته موازی‌سازی، دقیقا همان ابزاری هستند که امروز به ما کمک می‌کنند مدل‌های بزرگ و پیچیده را بدون اینکه به مشکل حافظه یا سرعت بخوریم، روی سخت‌افزارهای معمولی اجرا کنیم. به‌نوعی، این روش‌ها پل ارتباطی بین قدرت محاسباتی و محدودیت‌های دنیای واقعی هستند که اجازه میدهند پروژه‌های بزرگ‌تر را راحت‌تر پیش ببریم.

جمع بندی

در این مقاله به‌طور مفصل بیان کردیم که موازی‌سازی داده یکی از تکنیک‌های پایه‌ای برای مقیاس‌دهی بار کاری در یادگیری ماشین و یادگیری عمیق است. با افزایش حجم داده‌ها و اندازه مدل‌ها، متخصصان از موازی‌سازی داده استفاده می‌کنند تا آموزش مدل‌ها را روی چندین GPU، نود یا خوشه سرعت ببخشند و آزمایش‌های بزرگتری انجام دهند که در حالت عادی ممکن نبود. با وجود مزایای واضح موازی‌سازی داده، باید به هزینه‌های سیستم، ارتباطات و نیازهای حافظه‌ی نسخه‌های مدل هم توجه کرد.

انتخاب روش مناسب، چه موازی‌سازی داده به‌تنهایی، چه موازی‌سازی مدل، یا روش‌های ترکیبی پیشرفته‌تر مانند FSDP و DeepSpeed بستگی به اندازه مدل، سخت‌افزار و نیازهای مقیاس‌دهی شما دارد و نکات متعددی باید در نظر گرفته شود.

۱۴ ترند برتر هوش مصنوعی در سال ۲۰۲۵ که آینده فناوری را دگرگون می‌کنند
 ترندهای برتر هوش مصنوعی

سوالات متداول

موازی‌سازی داده در یادگیری ماشین چیست؟

موازی‌سازی داده به تکنیکی گفته می‌شود که در آن چند نسخه از یک مدل روی سخت‌افزارهای مختلف (مثل چند GPU یا چند نود) اجرا می‌شود، به طوری که هر نسخه روی یک بخش متفاوت از داده‌ها کار می‌کند. در نهایت، گرادیان‌ها بین همه نسخه‌ها هماهنگ می‌شوند تا فرایند یادگیری مشابه آموزش روی یک دستگاه باشد.

تفاوت موازی‌سازی داده با موازی‌سازی مدل چیست؟

در موازی‌سازی داده، کل مدل در چند نسخه کپی شده و داده‌ها بین آن‌ها تقسیم می‌شود، اما در موازی‌سازی مدل، خود مدل بین دستگاه‌های مختلف تقسیم شده و هر دستگاه بخشی از محاسبات مدل را انجام می‌دهد.

مزایای موازی‌سازی داده چیست؟

سادگی پیاده‌سازی، مقیاس‌پذیری بالا برای داده‌های بزرگ، سازگاری آسان با فریمورک‌های مدرن یادگیری ماشین و قابلیت استفاده در حلقه‌های آموزش موجود.

کدام فریمورک‌ها از موازی‌سازی داده پشتیبانی می‌کنند؟

چند فریمورک محبوب که موازی‌سازی داده را پشتیبانی می‌کنند عبارت‌اند از: PyTorch (با DataParallel و DistributedDataParallel)، TensorFlow (با tf.distribute.Strategy) و کتابخانه‌های تخصصی‌تری مانند Horovod و Ray Train.

چه زمانی باید از موازی‌سازی داده استفاده کرد؟

زمانی که داده‌های بزرگی دارید، مدل شما در حافظه یک GPU جا می‌شود و می‌خواهید با استفاده از چند GPU، زمان آموزش را کاهش دهید، بهترین انتخاب استفاده از موازی‌سازی داده است.