62 votes

Utilisation du module de multitraitement pour le calcul en grappe (cluster computing)

Je suis intéressé par l'exécution d'un programme Python à l'aide d'un cluster d'ordinateurs. Dans le passé, j'ai utilisé les interfaces MPI de Python, mais en raison des difficultés de compilation/installation de celles-ci, je préférerais des solutions qui utilisent des modules intégrés, tels que le module Python multitraitement module.

Ce que j'aimerais vraiment faire, c'est mettre en place un multiprocessing.Pool qui s'étendrait sur l'ensemble du cluster d'ordinateurs, et exécuter une Pool.map(...) . Est-ce que c'est possible/facile à faire ?

Si c'est impossible, j'aimerais au moins être capable de démarrer Process sur n'importe lequel des nœuds à partir d'un script central avec des paramètres différents pour chaque nœud.

2 votes

Essayez peut-être JUG : paquets.python.org/Jug

52voto

Shawn Chin Points 29756

Si vous entendez par cluster computing des systèmes à mémoire distribuée (plusieurs nœuds plutôt que SMP), le multitraitement de Python n'est peut-être pas un choix approprié. Il peut lancer plusieurs processus, mais ils seront toujours liés à un seul nœud.

Ce dont vous aurez besoin, c'est d'un cadre qui gère la répartition des processus sur plusieurs nœuds et fournit un mécanisme de communication entre les processeurs. (à peu près ce que fait MPI).

Voir la page sur Traitement parallèle sur le wiki Python pour obtenir une liste de cadres de travail qui faciliteront le calcul en grappe.

Dans la liste, pp , cruche , pyro y céleri semblent être des options judicieuses, même si je ne peux personnellement me porter garant d'aucune d'entre elles puisque je n'ai aucune expérience avec elles (j'utilise principalement MPI).

Si la facilité d'installation et d'utilisation est importante, je commencerais par explorer les possibilités suivantes jug . C'est facile à installer , prend en charge les systèmes courants de regroupement par lots et regarde bien documenté .

19 votes

J'ai écrit pichet (merci pour vos bons mots). J'ajouterai que le module est également bien supporté. Si vous trouvez des bugs, ils seront corrigés très rapidement (<24h, généralement).

4 votes

Les gestionnaires de multiprocessing Python peuvent dialoguer entre plusieurs systèmes, et pas seulement à l'intérieur d'un système. Voir : eli.thegreenplace.net/2012/01/24/

14voto

chmullig Points 6181

Dans le passé, j'ai utilisé Pyro de le faire avec succès. Si vous activez le code mobile, il enverra automatiquement par câble les modules requis que les nœuds n'ont pas déjà. C'est très pratique.

2voto

DMTishler Points 402

J'ai eu de la chance en utilisant SCOOP comme une alternative au multitraitement pour une utilisation sur un ou plusieurs ordinateurs et bénéficier de la soumission des tâches pour les clusters ainsi que de nombreuses autres fonctionnalités telles que les cartes imbriquées et des modifications minimales du code pour travailler avec map().

El source est disponible sur Github. A Petit exemple montre à quel point la mise en œuvre peut être simple !

2voto

Philipp Moritz Points 171

Si vous êtes prêt à installer par pip un paquetage open source, vous devriez considérer les points suivants Ray qui, parmi les frameworks de cluster Python, est probablement l'option qui se rapproche le plus de l'expérience Python monofilaire. Il vous permet de paralléliser à la fois des fonctions (en tant que tâches) et des classes à état (en tant qu'acteurs) et effectue automatiquement le transport et la sérialisation des données ainsi que la propagation des messages d'exception. Il permet également une flexibilité similaire à celle de Python normal (les acteurs peuvent être transmis, les tâches peuvent appeler d'autres tâches, il peut y avoir des dépendances de données arbitraires, etc.) Plus d'informations à ce sujet dans le documentation .

À titre d'exemple, voici comment vous feriez votre exemple de carte multitraitement dans Ray :

import ray
ray.init()

@ray.remote
def mapping_function(input):
    return input + 1

results = ray.get([mapping_function.remote(i) for i in range(100)])

L'API est un peu différente de l'API de multiprocessing de Python, mais devrait être plus facile à utiliser. Il existe un guide tutoriel qui décrit comment gérer les dépendances des données et les acteurs, etc.

Vous pouvez installer Ray avec "pip install ray" et ensuite exécuter le code ci-dessus sur un seul nœud, ou il est également facile de mettre en place un cluster, voir Support du cloud y Soutien aux clusters

Clause de non-responsabilité : je suis l'un des développeurs de Ray.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X