به بخش پرسش و پاسخ یادگیری عمیق خوش آمدید,
این نسخه آزمایشی سایت است.
لطفا به نکات زیر توجه کنید:
  • برای ارتباط با مدیران میتوانید از صفحه مدیران اقدام کنید.
  • سوال و جواب ها باید به زبان فارسی باشند. استفاده از زبان انگلیسی یا فینگلیش برای پاسخ دادن مجاز نیست.
  • لطفا بعد از پرسش سوال لینک سوال خود را در گرو تلگرام (Iran Deep Learning Group) معرفی کنید تا سریعتر به جواب برسید. برای دسترسی به آخرین لینک از منابع یادگیری استفاده کنید
  • لطفا بجای عکس از متن استفاده کنید. اگر متون طولانی هستند از سایت pastebin.com برای اپلود استفاده کرده و لینک حاصل را در سوال خود قرار دهید. برای قرار دادن تصویر ، از بخش ارسال تصویر ادیتور سایت استفاده کنید.
  • بعد از دریافت پاسخ، بهترین پاسخ را از طریق کلیک بر روی علامت تیک انتخاب کنید
  • اگر با خطا و یا مشکلی مواجه شدید از بخش تماس با ما در انتهای صفحه و یا ایمیل Coderx7@gmail.com موضوع را اطلاع دهید.

با تشکر

دسته بندی ها

+1 امتیاز

سلام دوستان،
فرض کنید یک شبکه کانولوشنی + کلاسیفیکیشنی داریم بصورت زیر
input-conv1-relu-pooling-conv2-relu-pooling-fc-relu-softmax
میخوایم برنامه این شبکه رو با تنسورفلو روی دو تا gpu بنویسیم- چطور تقسیم کار کنیم که بیشترین بهره رو از دوتا gpu ببریم؟
نکته: اگه لایه های شبکه مثل بخشهایی از alexnet موازی بود اونوقت محاسبات بصورت موازی روی هر دو gpu انجام میشد و بعد با هم ادغام می شد تا به لایه بعد بریم. ولی تو این شبکه اینجوری نیست. مثلا اول باید محاسبات conv1 انجام بشه و نتایج آماده بشه و بعد محاسبات relu انجام بشه.

آیا باید لایه کانولوشن رو دوتیکش کنم و هر تیکه رو به یه gpu بدم؟
اگر برای لایه ای که مثلا 64 تا فیلتر داره gpu خاصی رو نسبت ندم خود تنسورفلو میفهمه که باید تقسیم کار کنه؟

توسط (830 امتیاز)

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

سلام
توی تنسورفلو خیلی دست بازه برای اینکه کارهای مختلف انجام بده، مثلا اینکه شما لایه ها رو تقسیم کنید بین gpu های مختلف یا اینکه نه، کل گراف بین همه مشترک باشه و هر کدوم batch های مختلفی دریافت کنه و در نهایت وزنها رو از تجمیع گرادیان همه شبکه ها آپدیت کنید
که اگه اشتباه نکنم به اولی میگن in graph replication و به حالت دوم که وزنها بین گرافها مشترک میگن between graph replication، اگه اشتباه می کنم لطفا بگید تا جواب رو درست کنم
خوده این حالات هم کلی بحث داره که توی مقالات مربوط به distributed tensorflow خیلی روش بحث شده و میشه و اتفاقا موضوع داغی هم هست به نسبت، به خصوص برای کارهای بزرگ

اما حالا اینکه چطوری و از چه روشی استفاده کنیم، خیلی بستگی به شرایط مساله ما داره. مثلا توی همون الکس نت که مثال زدید، اگه اشتباه نکنم محدودیت سخت افزارهای اون سال باعث شده بود که شبکه رو دو قسمت کنن (یعنی in graph replication)
اما چیزی که هم راحت تره، هم مثل اینکه پرفورمنس بهتری توی خیلی از مسائل داده، همون استفاده از between graph replication ه
یعنی اگه 2 تا gpu دارید، گراف شبکتون رو روی هر دو قرار می دید و هر کدوم با batch های جداگانه گرادیان ها رو حساب می کنن و در نهایت به صورت سنکرون یا آسنکرون وزنها رو آپدیت می کنید. برای هر دونه gpu هم تقسیم کار اتوماتیک و خوب اتفاق می افته که خودش کمک خیلی بزرگیه
برای این مورد، خوده سایت تنسورفلو یه مثال خیلی خوب روی دیتاست cifar پیاده کرده

https://www.tensorflow.org/tutorials/deep_cnn

نظر و تجربه شخصی و چیزهایی که شنیدم از تجربه بقیه، حداقل فعلا اینطوری بوده که استفاده از training موازی چندتا شبکه همزمان، به جای تقسیم خوده شبکه روی چندتا gpu، تا وقتی که واقعا مساله ما رو مجبور نکرده، کارایی بیشتری داره و صد البته خیلی هم راحت تره D:
اگه خواستید راجع بهش سرچ هم بکنید بحث های جالبی حتی در مورد نویز paralle training روی دقت نهایی هست، به خصوص توی ساختارهایی مثل A3C که میگن شاید همین آپدیت های آسنکرون به خاطر نویزی که به آموزش تزریق میکنه، می تونه دقت رو بهتر کنه

توسط (1.6k امتیاز)
انتخاب شده توسط
ممنون آقای نوروزی از وقتی که گذاشتید. باید این موضوعاتی را که گفتید رو مطالعه کنم. اگه سوالی بود دوباره مزاحمتون میشم. ممنون از جوابتون
...