Programování

6 knihoven Pythonu pro paralelní zpracování

Python je dlouhý na pohodlí a vstřícnost k programátorům, ale není to nejrychlejší programovací jazyk. Některá z jeho omezení rychlosti jsou způsobena jeho výchozí implementací, cPython, s jedním vláknem. To znamená, že cPython nepoužívá více než jedno hardwarové vlákno najednou.

A zatímco můžete použít závitování modul zabudovaný do Pythonu pro urychlení věcí, závitování jen vám dává konkurence, ne rovnoběžnost. Je to dobré pro spouštění více úkolů, které nejsou závislé na CPU, ale nedělá nic pro zrychlení více úkolů, z nichž každý vyžaduje plný CPU.

Python obsahuje nativní způsob spuštění pracovní zátěže Pythonu napříč více CPU. The multiprocesing modul roztočí více kopií tlumočníka Pythonu, každá na samostatném jádru, a poskytuje primitiva pro rozdělení úkolů mezi jádra. Ale někdy dokoncemultiprocesing nestačí.

Někdy práce vyžaduje distribuci práce nejen napříč více jader, ale také napříč více strojů. To je místo, kde přichází těchto šest knihoven a rámců Pythonu. Všech šest níže uvedených sad nástrojů Pythonu vám umožní převzít existující aplikaci Pythonu a rozdělit práci na více jader, více počítačů nebo obojí.

Paprsek

Ray, vyvinutý týmem vědců z Kalifornské univerzity v Berkeley, je základem řady distribuovaných knihoven strojového učení. Ray se však neomezuje pouze na úkoly strojového učení, i když to byl původní případ použití. Jakékoli úkoly v Pythonu lze rozdělit a distribuovat mezi systémy pomocí Ray.

Rayova syntaxe je minimální, takže nemusíte paralelně přepracovávat existující aplikace. The @ ray.remote dekorátor distribuuje tuto funkci napříč všemi dostupnými uzly v klastru Ray s volitelně zadanými parametry pro počet CPU nebo GPU, které se mají použít. Výsledky každé distribuované funkce se vracejí jako objekty Pythonu, takže se snadno spravují a ukládají a množství kopírování napříč nebo uvnitř uzlů je omezeno na minimum. Tato poslední funkce se hodí například při práci s poli NumPy.

Ray dokonce obsahuje vlastního integrovaného správce klastrů, který může podle potřeby automaticky roztočit uzly na místním hardwaru nebo populárních platformách cloud computingu.

Související video: Používání multiprocesing urychlit Python

Dask

Zvenku vypadá Dask hodně jako Ray. Je to také knihovna pro distribuované paralelní výpočty v Pythonu, s vlastním systémem plánování úkolů, povědomím o datových rámcích Pythonu, jako je NumPy, a schopností škálovat z jednoho stroje na mnoho.

Dask funguje dvěma základními způsoby. První je prostřednictvím paralelních datových struktur - v podstatě Daskových vlastních verzí polí, seznamů nebo Pandas DataFrames NumPy. Zaměňte Dask verze těchto konstrukcí za jejich výchozí hodnoty a Dask automaticky rozšíří jejich provedení napříč vaším clusterem. To obvykle zahrnuje něco víc než změnu názvu importu, ale někdy může být nutné přepsat, aby fungoval úplně.

Druhým způsobem jsou nízkoúrovňové paralelizační mechanismy společnosti Dask, včetně dekorátorů funkcí, které rozdělují úlohy napříč uzly a vracejí výsledky synchronně („okamžitý“ režim) nebo asynchronně („líný“). Oba režimy lze podle potřeby také kombinovat.

Jedním z klíčových rozdílů mezi Daskem a Rayem je mechanismus plánování. Dask používá centralizovaný plánovač, který zpracovává všechny úkoly pro klastr. Ray je decentralizovaný, což znamená, že každý stroj spouští svůj vlastní plánovač, takže jakékoli problémy s naplánovanou úlohou jsou řešeny na úrovni jednotlivého stroje, nikoli celého klastru.

Dask také nabízí pokročilou a stále experimentální funkci zvanou „herci“. Herec je objekt, který ukazuje na úlohu v jiném uzlu Dask. Tímto způsobem může úloha, která vyžaduje hodně místního stavu, běžet na místě a být volána vzdáleně jinými uzly, takže stav úlohy nemusí být replikován. Rayovi chybí něco jako Daskův herecký model, aby podporoval sofistikovanější distribuci úloh.

Dispy

Dispy vám umožňuje distribuovat celé programy Pythonu nebo jen jednotlivé funkce napříč clusterem strojů pro paralelní provádění. Využívá mechanismy nativní pro platformu pro síťovou komunikaci, aby věci byly rychlé a efektivní, takže stroje se systémy Linux, MacOS a Windows fungují stejně dobře.

Dispy syntaxe se poněkud podobá multiprocesing v tom, že výslovně vytvoříte klastr (kde multiprocesing chcete vytvořit fond procesů), odeslat práci do klastru a poté načíst výsledky. K úpravě úloh pro práci s Dispy může být zapotřebí trochu více práce, ale také získáte přesnou kontrolu nad tím, jak jsou tyto úlohy odesílány a vráceny. Můžete například vrátit prozatímní nebo částečně vyplněné výsledky, přenášet soubory jako součást procesu distribuce úloh a při přenosu dat použít šifrování SSL.

Pandaral·lel

Pandaral·lel, jak název napovídá, je způsob, jak paralelizovat úlohy Pandas napříč více uzly. Nevýhodou je, že Pandaral·lel funguje pouze s pandami. Ale pokud Pandas je to, co používáte, a vše, co potřebujete, je způsob, jak urychlit úlohy Pandas napříč více jádry na jednom počítači, Pandaral·lel se zaměřuje na tento úkol laserem.

Všimněte si, že zatímco Pandaral·lel běží v systému Windows, bude spuštěn pouze z relací Pythonu spuštěných v subsystému Windows pro Linux. Uživatelé systémů MacOS a Linux mohou Pandaral·lel spouštět tak, jak jsou.

Ipyparalelní

Ipyparallel je další úzce zaměřený systém pro více procesů a distribuci úkolů, konkrétně pro paralelizaci provádění kódu notebooku Jupyter napříč klastrem. Projekty a týmy, které již v Jupyteru pracují, mohou Ipyparallel začít okamžitě používat.

Ipyparallel podporuje mnoho přístupů k paralelizaci kódu. Na jednoduchém konci je mapa, který aplikuje jakoukoli funkci na sekvenci a rozděluje práci rovnoměrně mezi dostupné uzly. Pro složitější práci můžete vyzdobit konkrétní funkce tak, aby vždy běžely na dálku nebo paralelně.

Notebooky Jupyter podporují „magické příkazy“ pro akce, které jsou možné pouze v prostředí notebooku. Ipyparallel přidává několik vlastních magických příkazů. Můžete například předponu libovolného příkazu Pythonu % px automaticky paralelizovat.

Joblib

Joblib má dva hlavní cíle: spouštět úlohy paralelně a nepřepočítávat výsledky, pokud se nic nezměnilo. Díky této efektivitě je Joblib vhodný pro vědecké výpočty, kde jsou reprodukovatelné výsledky posvátné. Dokumentace Joblibu poskytuje spoustu příkladů, jak využívat všechny jeho funkce.

Syntaxe Joblib pro paralelizaci práce je dostatečně jednoduchá - jedná se o dekorátor, který lze použít k rozdělení úloh mezi procesory nebo k uložení výsledků do mezipaměti. Paralelní úlohy mohou používat vlákna nebo procesy.

Joblib zahrnuje transparentní diskovou mezipaměť pro objekty Pythonu vytvořené výpočetními úlohami. Tato mezipaměť nejenže pomáhá Joblibu vyhnout se opakování práce, jak je uvedeno výše, ale lze ji také použít k pozastavení a obnovení dlouhotrvajících úloh nebo k převzetí místa, kde po chybě skončila práce. Mezipaměť je také inteligentně optimalizována pro velké objekty, jako jsou pole NumPy. Oblasti dat lze sdílet v paměti mezi procesy ve stejném systému pomocí numpy.memmap.

Jedna věc, kterou Joblib nenabízí, je způsob distribuce úloh mezi více samostatných počítačů. Teoreticky je možné k tomu použít potrubí Joblibu, ale pravděpodobně je jednodušší použít jiný rámec, který to nativně podporuje.

Přečtěte si více o Pythonu

  • Co je Python? Výkonné a intuitivní programování
  • Co je PyPy? Rychlejší Python bez bolesti
  • Co je Cython? Python rychlostí C.
  • Výukový program pro Cython: Jak zrychlit Python
  • Jak chytře nainstalovat Python
  • Nejlepší nové funkce v Pythonu 3.8
  • Lepší správa projektů v Pythonu s poezií
  • Virtualenv a venv: Vysvětlení virtuálních prostředí Pythonu
  • Python virtualenv a venv dělá a nedělá
  • Vysvětlení vláken a podprocesů v Pythonu
  • Jak používat debugger Pythonu
  • Jak používat timeit k profilování kódu Pythonu
  • Jak používat cProfile k profilování kódu Pythonu
  • Začněte s asynchronizací v Pythonu
  • Jak používat asyncio v Pythonu
  • Jak převést Python na JavaScript (a zpět)
  • Python 2 EOL: Jak přežít konec Pythonu 2
  • 12 Pythons pro všechny programovací potřeby
  • 24 knihoven Pythonu pro každého vývojáře Pythonu
  • 7 sladkých IDE Pythonu, které vám možná chyběly
  • 3 hlavní nedostatky Pythonu - a jejich řešení
  • Porovnáno 13 webových rámců Pythonu
  • 4 testovací rámce Pythonu k rozdrcení vašich chyb
  • 6 skvělých nových funkcí Pythonu, které si nenechte ujít
  • 5 distribucí Pythonu pro zvládnutí strojového učení
  • 8 skvělých knihoven Pythonu pro zpracování přirozeného jazyka