۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

بهترین کتابخانه های پایتون برای پردازش موازی

آیا نیاز دارید که حجم کار سنگین پایتون را بین چندین CPU یا یک خوشه محاسباتی توزیع کنید؟ در اینجا هفت چارچوب برای کار وجود دارد.

آیا نیاز دارید که حجم کار سنگین پایتون را بین چندین CPU یا یک خوشه محاسباتی توزیع کنید؟ در اینجا هفت چارچوب برای کار وجود دارد.

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

و در حالی که می توانید از ماژول داخلی threading پایتون برای سرعت بخشیدن به کارها استفاده کنید، threading فقط به شما concurrency می دهد، نه موازی سازی. برای اجرای چندین کار که به CPU وابسته نیستند خوب است، اما برای سرعت بخشیدن به چندین کار که هر کدام به یک CPU کامل نیاز دارند، کاری انجام نمی دهد. این ممکن است در آینده تغییر کند، اما در حال حاضر، بهتر است فرض کنیم که رشته در پایتون به شما موازی‌سازی نمی‌دهد.

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

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

بهترین کتابخانه های پایتون برای پردازش موازی

  • Ray – موازی‌سازی و توزیع بارهای کاری هوش مصنوعی و یادگیری ماشین در بین CPU، ماشین‌ها و GPUها
  • Dask – کتابخانه‌های علوم داده پایتون مانند NumPy، Pandas و Scikit-learn را موازی می‌کند.
  • Dispy – محاسبات را به صورت موازی در چندین پردازنده یا ماشین اجرا می کند
  • Pandaral•lel – پانداها را در چندین CPU موازی می‌کند
  • Ipyparallel – محاسبات موازی تعاملی را با IPython، Jupyter Notebook و Jupyter Lab فعال می‌کند
  • Joblib – محاسبات را به صورت موازی، با بهینه سازی برای NumPy و ذخیره دیسک شفاف توابع و مقادیر خروجی اجرا می کند.
  • Parsl – از اجرای موازی در هسته‌ها و ماشین‌های متعدد، همراه با زنجیره‌کردن توابع با هم در گردش‌های کاری چند مرحله‌ای پشتیبانی می‌کند.

پرتو

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

سینتکس Ray بسیار کم است، بنابراین برای موازی کردن برنامه‌های موجود نیازی به بازنگری گسترده ندارید. دکوراتور @ray.remote این عملکرد را در بین گره‌های موجود در یک خوشه پرتو توزیع می‌کند، با پارامترهایی که به صورت اختیاری برای تعداد CPU یا GPU استفاده می‌شود. نتایج هر تابع توزیع شده به‌عنوان اشیاء پایتون برگردانده می‌شوند، بنابراین مدیریت و ذخیره‌سازی آن‌ها آسان است و میزان کپی در داخل یا درون گره‌ها حداقل است. به عنوان مثال، این آخرین ویژگی هنگام برخورد با آرایه‌های NumPy مفید است.

Ray حتی دارای مدیر کلاستر داخلی خود است که می‌تواند به صورت خودکار گره‌ها را در صورت نیاز در سخت‌افزار محلی یا پلت‌فرم‌های رایانش ابری محبوب بچرخاند. سایر کتابخانه‌های Ray به شما امکان می‌دهند یادگیری ماشینی رایج و حجم‌های کاری علم داده را مقیاس‌بندی کنید، بنابراین لازم نیست به صورت دستی آنها را داربست کنید. برای مثال، Ray Tune به شما این امکان را می‌دهد که چرخش هایپرپارامتر را در مقیاس معمولی انجام دهید. سیستم‌های یادگیری ماشین (PyTorch و TensorFlow، از جمله).

ویدئوی مرتبط: استفاده از ماژول چند پردازشی برای افزایش سرعت پایتون

Dask

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

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

Dask به دو روش اساسی کار می کند. اولین مورد از طریق ساختارهای داده موازی شده است – اساساً نسخه های خود Dask از آرایه ها، لیست ها یا Pandas DataFrames. نسخه‌های Dask آن ساختارها را با پیش‌فرض‌هایشان عوض کنید، و Dask به‌طور خودکار اجرای آن‌ها را در کلستر شما پخش می‌کند. این معمولاً چیزی بیشتر از تغییر نام یک واردات را شامل می‌شود، اما ممکن است گاهی اوقات برای کار کردن کامل نیاز به بازنویسی داشته باشد.

راه دوم از طریق مکانیسم‌های موازی‌سازی سطح پایین Dask است، از جمله تزئینات عملکرد، که کارها را در گره‌ها تقسیم می‌کنند و نتایج را به صورت همزمان (در حالت “فوری”) یا ناهمزمان (حالت “تنبل”) برمی‌گردانند. هر دو حالت را می توان در صورت نیاز مخلوط کرد.

Dask همچنین قابلیتی به نام بازیگران را ارائه می دهد. actor یک شی است که به یک کار در گره Dask دیگر اشاره می کند. به این ترتیب، کاری که به حالت محلی زیادی نیاز دارد، می‌تواند در محل اجرا شود و توسط گره‌های دیگر از راه دور فراخوانی شود، بنابراین وضعیت کار نیازی به تکرار ندارد. ری هیچ چیزی شبیه مدل بازیگری Dask برای پشتیبانی از توزیع شغلی پیچیده تر ندارد. با این حال، برنامه‌ریز Desk از کارهایی که بازیگران انجام می‌دهند آگاه نیست، بنابراین اگر بازیگری بداخلاق شود یا هنگ کند، برنامه‌ریز نمی‌تواند شفاعت کند. «با عملکرد بالا اما انعطاف‌پذیر نیست» به این صورت است که مستندات آن را بیان می‌کنند، بنابراین بازیگران باید با احتیاط استفاده شوند.

Dispy

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

نحو Dispy تا حدودی شبیه multiprocessing است که به‌صراحت یک خوشه ایجاد می‌کنید (که در آن multiprocessing می‌خواهد یک مجموعه پردازش ایجاد کنید)، کار را به خوشه ارسال می‌کنید، سپس آن را بازیابی می‌کنید. نتایج. ممکن است کمی کار بیشتری برای تغییر مشاغل برای کار با Dispy لازم باشد، اما شما همچنین کنترل دقیقی بر نحوه ارسال و بازگرداندن آن مشاغل به دست خواهید آورد. برای مثال، می‌توانید نتایج موقت یا نیمه تکمیل‌شده را برگردانید، < a href="https://pgiri.github.io/dispy/dispy.html#transferring-files" rel="nofollow">انتقال فایل‌ها به عنوان بخشی از فرآیند توزیع شغل، و استفاده از رمزگذاری SSL هنگام انتقال داده.

Pandaral·lel

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

توجه داشته باشید که در حالی که Pandaral·lel در ویندوز اجرا می شود، فقط از جلسات پایتون اجرا می شود که در زیر سیستم ویندوز برای لینوکس راه اندازی شده اند. کاربران لینوکس و macOS می توانند Pandaral·lel را همانطور که هست اجرا کنند.

پیوند موازی

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

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

نوت‌بوک‌های Jupyter از “فرمان‌های جادویی” برای اقداماتی که فقط در محیط نوت‌بوک امکان‌پذیر هستند، پشتیبانی می‌کنند. Ipyparallel چند دستور جادویی خود را اضافه می کند. برای مثال، می‌توانید هر عبارت پایتون را با %px پیشوند کنید تا به طور خودکار آن را موازی کنید.

Joblib

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

نحو Joblib برای موازی کردن کار به اندازه کافی ساده است – به منزله یک دکوراتور است که می تواند برای تقسیم کارها در پردازنده ها یا برای ذخیره نتایج استفاده شود. کارهای موازی می توانند از رشته ها یا فرآیندها استفاده کنند.

Joblib شامل یک حافظه پنهان دیسک شفاف برای اشیاء پایتون است که توسط کارهای محاسباتی ایجاد می شوند. این کش نه تنها به Joblib کمک می کند تا از تکرار کار، همانطور که در بالا اشاره شد جلوگیری کند، بلکه می تواند برای تعلیق و از سرگیری مشاغل طولانی مدت یا ادامه دادن کار پس از یک تصادف استفاده شود. حافظه پنهان همچنین به طور هوشمند برای اشیاء بزرگ مانند آرایه های NumPy بهینه شده است. با استفاده از numpy.memmap می‌توان مناطقی از داده‌ها را در حافظه بین فرآیندهای یک سیستم به اشتراک گذاشت. همه اینها باعث می شود Joblib برای کارهایی که ممکن است زمان زیادی طول بکشد بسیار مفید باشد، زیرا می توانید از انجام مجدد کارهای موجود خودداری کنید و در صورت نیاز مکث/رزومه کنید.

یک چیزی که Joblib ارائه نمی دهد راهی برای توزیع مشاغل در چندین رایانه جداگانه است. در تئوری، استفاده از خط لوله Joblib برای انجام این کار امکان پذیر است، اما احتمالاً استفاده از چارچوب دیگری که به صورت بومی از آن پشتیبانی می کند آسان تر است.

پارسل

مخفف «کتابخانه اسکریپت موازی»، Parsl به شما امکان می‌دهد کارهای محاسباتی را انجام دهید و آنها را در چندین سیستم با استفاده از تقسیم کنید. تقریباً همان نحو با اشیاء Pool موجود پایتون. همچنین به شما امکان می‌دهد وظایف محاسباتی مختلف را در جریان‌های کاری چند مرحله‌ای که می‌توانند به صورت موازی، به ترتیب یا از طریق نقشه/کاهش عملیات اجرا شوند، به هم متصل کنید.

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

یکی از ویژگی‌های عالی که پارسل ارائه می‌دهد، مجموعه‌ای از الگوهای از پیش ساخته شده برای ارسال کار به انواع منابع محاسباتی پیشرفته است. این نه تنها شامل موارد اصلی مانند خوشه‌های AWS یا Kubernetes می‌شود، بلکه شامل منابع ابر رایانه‌ای (با فرض دسترسی شما) مانند Blue Waters، ASPIRE 1، Frontera و غیره می‌شود. (پارسل با کمک بسیاری از مؤسساتی که چنین سخت افزاری را ساخته اند، توسعه یافته است.)

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