web-dev-qa-db-fra.com

Utilisation du module de multitraitement pour l'informatique en cluster

Je suis intéressé par l'exécution d'un programme Python utilisant un cluster informatique. Auparavant, j’utilisais les interfaces Python MPI, mais en raison de difficultés de compilation/installation, je préférerais les solutions qui utilisent des modules intégrés, tels que le module multiprocessing de Python.

Ce que j'aimerais vraiment faire, c'est simplement configurer une instance multiprocessing.Pool qui s'étend sur tout le cluster d'ordinateurs et exécuter une Pool.map(...). Est-ce quelque chose qui est possible/facile à faire?

Si cela est impossible, j'aimerais au moins pouvoir démarrer des instances Process sur l'un des nœuds à partir d'un script central avec des paramètres différents pour chaque nœud.

48
astrofrog

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

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

Voir la page sur Traitement parallèle sur le wiki Python pour une liste des frameworks qui aideront à l'informatique en cluster. 

Dans la liste, pp , pichet , pyro et céleri me semble être une option raisonnable, bien que je ne puisse personnellement en témoigner, car je n’ai aucune expérience en J'utilise principalement MPI).

Si la facilité d'installation/d'utilisation est importante, je commencerai par explorer jug. Il est facile à installer , prend en charge les systèmes de grappes par lots courants , et semble bien documenté .

43
Shawn Chin

Dans le passé, j'ai utilisé Pyro pour le faire avec succès. Si vous activez le code mobile, il enverra automatiquement par le fil les modules requis que les nœuds n’ont pas encore. Assez chouette.

13
chmullig

J'ai de la chance en utilisant SCOOP comme une alternative au multitraitement pour un ou plusieurs ordinateurs, et je profite de la soumission de travaux pour des clusters ainsi que de nombreuses autres fonctionnalités telles que des cartes imbriquées et des modifications de code minimales pour travailler avec la carte. ().

Le source est disponible sur Github. Un exemple quick montre à quel point une implémentation simple peut être! 

1
DMTishler

Si vous êtes prêt à installer un paquet open source par pépin, vous devriez considérer Ray , qui, en dehors des infrastructures de cluster Python, est probablement l'option qui se rapproche le plus de l'expérience Python à thread unique. Il vous permet de paralléliser les deux fonctions (en tant que tâches) ainsi que les classes avec état (en tant qu'acteurs) et d'effectuer automatiquement la totalité de la transmission et de la sérialisation des données, ainsi que la propagation du message d'exception. Cela offre également une flexibilité similaire à celle du Python normal (les acteurs peuvent être échangés, 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 documentation .

Par exemple, voici comment vous feriez votre exemple de mappe de 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 légèrement différente de l'API de multitraitement de Python, mais devrait être plus facile à utiliser. Il existe un guide tutoriel qui décrit comment gérer les dépendances de données et les acteurs, etc.

Vous pouvez installer Ray avec "pip install ray" puis exécuter le code ci-dessus sur un seul nœud. Vous pouvez également configurer facilement un cluster, voir Prise en charge du cloud et Prise en charge du cluster

Disclaimer: Je suis l'un des développeurs de Ray.

0
Philipp Moritz