Il y a un vieux paquet de mine qui est construit sur mpi4py
qui permet une carte parallèle fonctionnelle pour les travaux MPI
. Il n'est pas construit pour la vitesse - il a été construit pour activer une carte parallèle MPI
de l'interpréteur sur un cluster de calcul (c'est-à-dire sans avoir besoin de lancer depuis la ligne de commande mpiexec
). Pour l'essentiel:
>>> from pyina.launchers import MpiPool, MpiScatter
>>> pool = MpiPool()
>>> jobs = MpiScatter()
>>> def squared(x):
... return x**2
...
>>> pool.map(squared, range(4))
[0, 1, 4, 9]
>>> jobs.map(sqaured, range(4))
[0, 1, 4, 9]
Exhibant la stratégie « pool des travailleurs » et la stratégie « dispersion-réunion » de la distribution des emplois aux travailleurs. Bien sûr, je ne l'utiliserais pas pour un si petit travail comme squared
parce que le temps de génération du monde MPI
est vraiment très élevé (beaucoup plus élevé que la configuration d'un multiprocessing
Pool
). Cependant, si vous avez un gros travail à exécuter, comme vous le feriez normalement sur un cluster en utilisant MPI
, puis pyina
peut être un gros avantage pour vous.
Cependant, le vrai avantage d'utiliser pyina
est qu'il peut non seulement générer des tâches avec MPI
, mais il peut générer des tâches dans un planificateur. pyina
comprend et résume la syntaxe de lancement pour plusieurs planificateurs.
Un appel typique à une carte pyina
en utilisant un programmateur va comme ceci:
>>> # instantiate and configure a scheduler
>>> from pyina.schedulers import Torque
>>> config = {'nodes'='32:ppn=4', 'queue':'dedicated', 'timelimit':'11:59'}
>>> torque = Torque(**config)
>>>
>>> # instantiate and configure a worker pool
>>> from pyina.launchers import Mpi
>>> pool = Mpi(scheduler=torque)
>>>
>>> # do a blocking map on the chosen function
>>> pool.map(pow, [1,2,3,4], [5,6,7,8])
[1, 64, 2187, 65536]
Plusieurs configurations communes sont disponibles des cartes pré-configurées. Ce qui suit est identique à l'exemple ci-dessus:
>>> # instantiate and configure a pre-configured worker pool
>>> from pyina.launchers import TorqueMpiPool
>>> config = {'nodes'='32:ppn=4', 'queue':'dedicated', 'timelimit':'11:59'}
>>> pool = TorqueMpiPool(**config)
>>>
>>> # do a blocking map on the chosen function
>>> pool.map(pow, [1,2,3,4], [5,6,7,8])
[1, 64, 2187, 65536]
pyina
a besoin d'être retapé, en ce qu'il est encore python2.7
et qu'il n'a pas eu une sortie dans plusieurs années ... mais il a été tenu à jour (sur GitHub) et est capable de "faire le travail" pour moi en cours d'exécution sur les clusters informatiques à grande échelle au cours des 10 dernières années - en particulier lorsqu'il est couplé avec pathos
(qui fournit ssh
tunneling et une interface unifiée pour les cartes multiprocessing
et ParallelPython
). pyina
n'utilise pas encore la mémoire partagée, mais fait assez bien l'informatique parallèle embarrassante fonctionnelle. Les interactions avec le planificateur sont plutôt bonnes en général, mais peuvent être un peu brouillon pour plusieurs cas de défaillance - et les cartes non bloquantes nécessitent beaucoup de travail.Cela étant dit, il fournit une interface assez utile pour exécuter des tâches parallèles embarrassantes sur un cluster avec MPI
.
Get pyina
(et pathos
) ici: https://github.com/uqfoundation
Pouvez-vous inclure un résumé de la façon de l'utiliser, ou d'un court exemple dans votre réponse aussi? À partir du Centre d'aide [Comment rédiger une bonne réponse] (http://stackoverflow.com/help/how-to-answer): «Les liens vers des ressources externes sont encouragés, mais veuillez ajouter un contexte autour du lien pour que vos autres utilisateurs Ayez une idée de ce que c'est et de la raison pour laquelle vous y êtes: citez toujours la partie la plus pertinente d'un lien important, au cas où le site cible serait inaccessible ou serait définitivement déconnecté. – skrrgwasme