6 librerie Python per l'elaborazione parallela

Python è a lungo in termini di praticità e facilità di programmazione, ma non è il linguaggio di programmazione più veloce in circolazione. Alcuni dei suoi limiti di velocità sono dovuti alla sua implementazione predefinita, cPython, a thread singolo. Cioè, cPython non usa più di un thread hardware alla volta.

E anche se puoi usare il threadingmodulo integrato in Python per velocizzare le cose, threadingti dà solo concorrenza , non parallelismo . È utile per eseguire più attività che non dipendono dalla CPU, ma non fa nulla per accelerare più attività che richiedono ciascuna una CPU completa. 

Python include un modo nativo per eseguire un carico di lavoro Python su più CPU. Il multiprocessingmodulo fa girare più copie dell'interprete Python, ciascuna su un core separato, e fornisce primitive per la suddivisione delle attività tra i core. Ma a volte  multiprocessing non è nemmeno abbastanza.

A volte il lavoro richiede la distribuzione del lavoro non solo su più core , ma anche su più macchine . È qui che entrano in gioco queste sei librerie e framework Python. Tutti e sei i toolkit Python di seguito consentono di prendere un'applicazione Python esistente e distribuire il lavoro su più core, più macchine o entrambi.

Ray

Sviluppato da un team di ricercatori dell'Università della California, Berkeley, Ray è alla base di una serie di librerie di machine learning distribuite. Ma Ray non si limita alle sole attività di apprendimento automatico, anche se quello era il suo caso d'uso originale. Qualsiasi attività Python può essere suddivisa e distribuita tra i sistemi con Ray.

La sintassi di Ray è minima, quindi non è necessario rielaborare ampiamente le app esistenti per parallelizzarle. Il @ray.remotedecoratore distribuisce quella funzione su tutti i nodi disponibili in un cluster Ray, con parametri opzionalmente specificati per quante CPU o GPU utilizzare. I risultati di ciascuna funzione distribuita vengono restituiti come oggetti Python, quindi sono facili da gestire e archiviare e la quantità di copie attraverso o all'interno dei nodi è ridotta al minimo. Quest'ultima caratteristica è utile quando si ha a che fare con gli array NumPy, ad esempio.

Ray include anche il proprio cluster manager integrato, che può avviare automaticamente i nodi secondo necessità su hardware locale o piattaforme di cloud computing popolari.

Video correlato: Utilizzo multiprocessingper accelerare Python

Dask

Dall'esterno, Dask assomiglia molto a Ray. Anch'essa è una libreria per il calcolo parallelo distribuito in Python, con un proprio sistema di pianificazione delle attività, consapevolezza dei framework di dati Python come NumPy e la possibilità di scalare da una macchina a molte.

Dask funziona in due modi fondamentali. Il primo è tramite strutture di dati parallelizzate, essenzialmente, le versioni di Dask di array, elenchi o DataFrame di NumPy di ​​NumPy. Scambia le versioni Dask di quelle costruzioni per i loro valori predefiniti e Dask distribuirà automaticamente la loro esecuzione sul tuo cluster. Questo in genere implica poco più che cambiare il nome di un'importazione, ma a volte può richiedere una riscrittura per funzionare completamente.

Il secondo modo è attraverso i meccanismi di parallelizzazione di basso livello di Dask, inclusi i decoratori di funzioni, che suddividono i lavori tra i nodi e restituiscono i risultati in modo sincrono (modalità "immediata") o asincrona ("pigro"). Entrambe le modalità possono anche essere combinate secondo necessità.

Una differenza fondamentale tra Dask e Ray è il meccanismo di pianificazione. Dask utilizza uno scheduler centralizzato che gestisce tutte le attività per un cluster. Ray è decentralizzato, il che significa che ogni macchina esegue il proprio scheduler, quindi eventuali problemi con un'attività pianificata vengono gestiti a livello della singola macchina, non dell'intero cluster.

Dask offre anche una funzionalità avanzata e ancora sperimentale chiamata "attori". Un attore è un oggetto che punta a un lavoro su un altro nodo Dask. In questo modo, un lavoro che richiede molto stato locale può essere eseguito sul posto ed essere chiamato in remoto da altri nodi, quindi lo stato del lavoro non deve essere replicato. A Ray manca qualcosa come il modello dell'attore di Dask per supportare una distribuzione del lavoro più sofisticata.

Dispy

Dispy ti consente di distribuire interi programmi Python o solo singole funzioni su un cluster di macchine per l'esecuzione parallela. Utilizza meccanismi nativi della piattaforma per la comunicazione di rete per mantenere le cose veloci ed efficienti, quindi le macchine Linux, MacOS e Windows funzionano altrettanto bene.

La sintassi di Dispy somiglia multiprocessing in qualche modo in quanto si crea esplicitamente un cluster (dove si multiprocessingvorrebbe creare un pool di processi), si invia il lavoro al cluster, quindi si recuperano i risultati. Potrebbe essere necessario un po 'più di lavoro per modificare i lavori in modo che funzionino con Dispy, ma si ottiene anche un controllo preciso su come questi lavori vengono inviati e restituiti. Ad esempio, è possibile restituire risultati provvisori o parzialmente completati, trasferire file come parte del processo di distribuzione del lavoro e utilizzare la crittografia SSL durante il trasferimento dei dati.

Pandaral·lel

Pandaral·lel, come suggerisce il nome, è un modo per parallelizzare i lavori Panda su più nodi. Lo svantaggio è che Pandaral·lel funziona solo  con Pandas. Ma se Pandas è ciò che stai utilizzando e tutto ciò di cui hai bisogno è un modo per accelerare i lavori Panda su più core su un singolo computer, Pandaral·lel è focalizzato sul laser.

Si noti che sebbene Pandaral·lel funzioni su Windows, verrà eseguito solo dalle sessioni Python avviate nel sottosistema Windows per Linux. Gli utenti MacOS e Linux possono eseguire Pandaral·lel così com'è. 

Ipyparallel

Ipyparallel è un altro sistema di multiprocessing e distribuzione delle attività strettamente focalizzato, specifico per parallelizzare l'esecuzione del codice del notebook Jupyter su un cluster. I progetti e i team che già lavorano in Jupyter possono iniziare a utilizzare Ipyparallel immediatamente.

Ipyparallel supporta molti approcci alla parallelizzazione del codice. Alla fine, c'è map, che applica qualsiasi funzione a una sequenza e divide il lavoro in modo uniforme tra i nodi disponibili. Per lavori più complessi, puoi decorare funzioni specifiche da eseguire sempre in remoto o in parallelo.

I notebook Jupyter supportano "comandi magici" per azioni possibili solo in un ambiente notebook. Ipyparallel aggiunge alcuni comandi magici propri. Ad esempio, puoi anteporre a qualsiasi istruzione Python %pxper parallelizzarla automaticamente.

Joblib

Joblib ha due obiettivi principali: eseguire lavori in parallelo e non ricalcolare i risultati se non è cambiato nulla. Queste efficienze rendono Joblib adatto per il calcolo scientifico, dove i risultati riproducibili sono sacrosanti. La documentazione di Joblib fornisce molti esempi su come utilizzare tutte le sue funzionalità.

La sintassi di Joblib per parallelizzare il lavoro è abbastanza semplice: equivale a un decoratore che può essere utilizzato per suddividere i lavori tra i processori o per memorizzare nella cache i risultati. I lavori paralleli possono utilizzare thread o processi.

Joblib include una cache del disco trasparente per gli oggetti Python creati dai lavori di calcolo. Questa cache non solo aiuta Joblib a evitare di ripetere il lavoro, come notato sopra, ma può anche essere utilizzata per sospendere e riprendere i lavori a lunga esecuzione o riprendere da dove un lavoro si era interrotto dopo un arresto anomalo. La cache è anche ottimizzata in modo intelligente per oggetti di grandi dimensioni come gli array NumPy. Regioni di dati possono essere condivise in memoria tra processi sullo stesso sistema utilizzando numpy.memmap.

Una cosa che Joblib non offre è un modo per distribuire i lavori su più computer separati. In teoria è possibile utilizzare la pipeline di Joblib per farlo, ma probabilmente è più facile utilizzare un altro framework che lo supporti in modo nativo. 

Ulteriori informazioni su Python

  • Cos'è Python? Programmazione potente e intuitiva
  • Cos'è PyPy? Python più veloce senza dolore
  • Cos'è Cython? Python alla velocità di C
  • Tutorial Cython: come velocizzare Python
  • Come installare Python in modo intelligente
  • Le migliori nuove funzionalità di Python 3.8
  • Migliore gestione dei progetti Python con Poetry
  • Virtualenv e venv: spiegazione degli ambienti virtuali Python
  • Python virtualenv e venv cosa fare e cosa non fare
  • Spiegazione del threading e dei sottoprocessi di Python
  • Come utilizzare il debugger Python
  • Come usare timeit per profilare il codice Python
  • Come usare cProfile per profilare il codice Python
  • Inizia con async in Python
  • Come usare asyncio in Python
  • Come convertire Python in JavaScript (e viceversa)
  • Python 2 EOL: come sopravvivere alla fine di Python 2
  • 12 Pythons per ogni esigenza di programmazione
  • 24 librerie Python per ogni sviluppatore Python
  • 7 dolci IDE Python che potresti aver perso
  • 3 principali carenze di Python e le loro soluzioni
  • 13 framework web Python a confronto
  • 4 framework di test Python per schiacciare i tuoi bug
  • 6 fantastiche nuove funzionalità di Python da non perdere
  • 5 distribuzioni Python per padroneggiare l'apprendimento automatico
  • 8 fantastiche librerie Python per l'elaborazione del linguaggio naturale