6 bibliothèques Python pour le traitement parallèle

Python est long sur la commodité et la convivialité pour les programmeurs, mais ce n'est pas le langage de programmation le plus rapide. Certaines de ses limitations de vitesse sont dues à son implémentation par défaut, cPython, étant monothread. Autrement dit, cPython n'utilise pas plus d'un thread matériel à la fois.

Et bien que vous puissiez utiliser le threadingmodule intégré à Python pour accélérer les choses, cela threadingne vous donne que la concurrence , pas le parallélisme . C'est bon pour exécuter plusieurs tâches qui ne dépendent pas du processeur, mais ne fait rien pour accélérer plusieurs tâches qui nécessitent chacune un processeur complet. 

Python inclut un moyen natif d'exécuter une charge de travail Python sur plusieurs processeurs. Le multiprocessingmodule fait tourner plusieurs copies de l'interpréteur Python, chacune sur un cœur distinct, et fournit des primitives pour la répartition des tâches entre les cœurs. Mais parfois même  multiprocessing ne suffit pas.

Parfois, le travail nécessite de répartir le travail non seulement sur plusieurs cœurs , mais également sur plusieurs machines . C'est là que ces six bibliothèques et frameworks Python entrent en jeu. Les six kits d'outils Python ci-dessous vous permettent de prendre une application Python existante et de répartir le travail sur plusieurs cœurs, plusieurs machines, ou les deux.

Rayon

Développé par une équipe de chercheurs de l'Université de Californie à Berkeley, Ray soutient un certain nombre de bibliothèques d'apprentissage automatique distribuées. Mais Ray ne se limite pas aux seules tâches d'apprentissage automatique, même si c'était son cas d'utilisation d'origine. Toutes les tâches Python peuvent être fractionnées et réparties sur les systèmes avec Ray.

La syntaxe de Ray est minimale, vous n'avez donc pas besoin de retravailler en profondeur les applications existantes pour les paralléliser. Le @ray.remotedécorateur distribue cette fonction sur tous les nœuds disponibles dans un cluster Ray, avec des paramètres éventuellement spécifiés pour le nombre de processeurs ou de GPU à utiliser. Les résultats de chaque fonction distribuée sont renvoyés sous forme d'objets Python, ils sont donc faciles à gérer et à stocker, et la quantité de copie entre ou dans les nœuds est réduite au minimum. Cette dernière fonctionnalité est utile pour les tableaux NumPy, par exemple.

Ray inclut même son propre gestionnaire de cluster intégré, qui peut automatiquement faire tourner les nœuds selon les besoins sur du matériel local ou des plates-formes de cloud computing populaires.

Vidéo connexe: Utilisation multiprocessingpour accélérer Python

Dask

De l'extérieur, Dask ressemble beaucoup à Ray. Il s'agit également d'une bibliothèque pour le calcul parallèle distribué en Python, avec son propre système de planification de tâches, une connaissance des infrastructures de données Python comme NumPy et la possibilité de passer d'une machine à plusieurs.

Dask fonctionne de deux manières fondamentales. Le premier est au moyen de structures de données parallélisées - essentiellement, les propres versions de Dask des tableaux NumPy, des listes ou des Pandas DataFrames. Échangez les versions Dask de ces constructions pour leurs valeurs par défaut, et Dask répartira automatiquement leur exécution sur votre cluster. Cela implique généralement un peu plus que de changer le nom d'une importation, mais peut parfois nécessiter une réécriture pour fonctionner complètement.

La deuxième méthode consiste à utiliser les mécanismes de parallélisation de bas niveau de Dask, y compris les décorateurs de fonctions, qui répartissent les tâches entre les nœuds et renvoient les résultats de manière synchrone (mode «immédiat») ou asynchrone («paresseux»). Les deux modes peuvent également être mélangés selon les besoins.

Une différence clé entre Dask et Ray est le mécanisme de planification. Dask utilise un planificateur centralisé qui gère toutes les tâches d'un cluster. Ray est décentralisé, ce qui signifie que chaque machine exécute son propre planificateur, de sorte que tous les problèmes liés à une tâche planifiée sont traités au niveau de la machine individuelle, et non de l'ensemble du cluster.

Dask propose également une fonctionnalité avancée et encore expérimentale appelée «acteurs». Un acteur est un objet qui pointe vers un travail sur un autre nœud Dask. De cette façon, un travail qui nécessite beaucoup d'état local peut s'exécuter sur place et être appelé à distance par d'autres nœuds, de sorte que l'état du travail n'a pas à être répliqué. Ray manque de quelque chose comme le modèle d'acteur de Dask pour prendre en charge une répartition des tâches plus sophistiquée.

Dispy

Dispy vous permet de distribuer des programmes Python entiers ou simplement des fonctions individuelles sur un cluster de machines pour une exécution parallèle. Il utilise des mécanismes natifs de plate-forme pour la communication réseau afin de garder les choses rapides et efficaces, de sorte que les machines Linux, MacOS et Windows fonctionnent aussi bien.

La syntaxe Dispy ressemble quelque peu multiprocessing en ce sens que vous créez explicitement un cluster (où multiprocessingvous auriez créé un pool de processus), soumettez le travail au cluster, puis récupérez les résultats. Un peu plus de travail peut être nécessaire pour modifier les travaux pour qu'ils fonctionnent avec Dispy, mais vous obtenez également un contrôle précis sur la façon dont ces travaux sont envoyés et renvoyés. Par exemple, vous pouvez renvoyer des résultats provisoires ou partiellement terminés, transférer des fichiers dans le cadre du processus de distribution des travaux et utiliser le cryptage SSL lors du transfert de données.

Pandaral·lel

Pandaral·lel, comme son nom l'indique, est un moyen de paralléliser les travaux Pandas sur plusieurs nœuds. L'inconvénient est que Pandaral·lel ne fonctionne  qu'avec les Pandas. Mais si Pandas est ce que vous utilisez et que tout ce dont vous avez besoin est un moyen d'accélérer les travaux Pandas sur plusieurs cœurs sur un seul ordinateur, Pandaral·lel se concentre sur la tâche au laser.

Notez que bien que Pandaral·lel fonctionne sous Windows, il ne fonctionnera qu'à partir des sessions Python lancées dans le sous-système Windows pour Linux. Les utilisateurs de MacOS et Linux peuvent exécuter Pandaral·lel tel quel. 

Ipyparallel

Ipyparallel est un autre système de multitraitement et de distribution de tâches étroitement ciblé, spécifiquement pour la parallélisation de l'exécution du code du notebook Jupyter sur un cluster. Les projets et les équipes travaillant déjà dans Jupyter peuvent commencer à utiliser Ipyparallel immédiatement.

Ipyparallel prend en charge de nombreuses approches de parallélisation du code. À la fin, il y a map, qui applique n'importe quelle fonction à une séquence et répartit le travail uniformément entre les nœuds disponibles. Pour un travail plus complexe, vous pouvez décorer des fonctions spécifiques pour qu'elles s'exécutent toujours à distance ou en parallèle.

Les notebooks Jupyter prennent en charge les «commandes magiques» pour les actions possibles uniquement dans un environnement notebook. Ipyparallel ajoute quelques commandes magiques qui lui sont propres. Par exemple, vous pouvez préfixer n'importe quelle instruction Python avec %pxpour la paralléliser automatiquement.

Joblib

Joblib a deux objectifs majeurs: exécuter des jobs en parallèle et ne pas recalculer les résultats si rien n'a changé. Ces efficacités rendent Joblib bien adapté pour le calcul scientifique, où les résultats reproductibles sont sacro-saints. La documentation de Joblib fournit de nombreux exemples sur la façon d'utiliser toutes ses fonctionnalités.

La syntaxe Joblib pour la parallélisation du travail est assez simple: elle équivaut à un décorateur qui peut être utilisé pour diviser les travaux entre les processeurs ou pour mettre en cache les résultats. Les travaux parallèles peuvent utiliser des threads ou des processus.

Joblib inclut un cache disque transparent pour les objets Python créés par des tâches de calcul. Ce cache aide non seulement Joblib à éviter de répéter le travail, comme indiqué ci-dessus, mais peut également être utilisé pour suspendre et reprendre des travaux de longue durée, ou reprendre là où un travail s'est arrêté après un crash. Le cache est également optimisé de manière intelligente pour les objets volumineux tels que les tableaux NumPy. Les régions de données peuvent être partagées en mémoire entre les processus du même système à l'aide de numpy.memmap.

Une chose que Joblib n'offre pas est un moyen de distribuer les travaux sur plusieurs ordinateurs distincts. En théorie, il est possible d'utiliser le pipeline de Joblib pour ce faire, mais il est probablement plus facile d'utiliser un autre framework qui le prend en charge de manière native. 

En savoir plus sur Python

  • Qu'est-ce que Python? Programmation puissante et intuitive
  • Qu'est-ce que PyPy? Python plus rapide sans douleur
  • Qu'est-ce que Cython? Python à la vitesse de C
  • Tutoriel Cython: Comment accélérer Python
  • Comment installer Python de manière intelligente
  • Les meilleures nouvelles fonctionnalités de Python 3.8
  • Meilleure gestion de projet Python avec Poetry
  • Virtualenv et venv: les environnements virtuels Python expliqués
  • Python Virtualenv et Venv à faire et à ne pas faire
  • Explication des threads et sous-processus Python
  • Comment utiliser le débogueur Python
  • Comment utiliser timeit pour profiler le code Python
  • Comment utiliser cProfile pour profiler le code Python
  • Démarrez avec async en Python
  • Comment utiliser asyncio en Python
  • Comment convertir Python en JavaScript (et inversement)
  • Python 2 EOL: Comment survivre à la fin de Python 2
  • 12 pythons pour chaque besoin de programmation
  • 24 bibliothèques Python pour chaque développeur Python
  • 7 IDE Python que vous avez peut-être manqués
  • 3 lacunes majeures de Python et leurs solutions
  • 13 frameworks Web Python comparés
  • 4 frameworks de test Python pour écraser vos bugs
  • 6 nouvelles fonctionnalités Python à ne pas manquer
  • 5 distributions Python pour maîtriser l'apprentissage automatique
  • 8 grandes bibliothèques Python pour le traitement du langage naturel