Multiprocessamento Python dentro de mpi

Eu tenho um script python que escrevi usando o módulo de multiprocessamento, para uma execução mais rápida. O cálculo é embaraçosamente paralelo, portanto a eficiência é escalonada com o número de processadores. Agora, eu gostaria de usar isso em um programa MPI, que gerencia um cálculo do MCMC em vários computadores. Este código possui uma chamada para system () que chama o script python. No entanto, estou descobrindo que, quando é chamado dessa maneira, o ganho de eficiência do uso do multiprocessamento python desaparece.

Como posso obter meu script python para reter os ganhos de velocidade do multiprocessamento quando chamado do MPI?

Aqui está um exemplo simples, que é análogo aos códigos muito mais complicados que quero usar, mas exibe o mesmo comportamento geral. Escrevo um script python executável chamado junk.py.

#!/usr/bin/python
import multiprocessing
import numpy as np

nproc = 3
nlen = 100000


def f(x):
    print x
    v = np.arange(nlen)
    result = 0.
    for i, y in enumerate(v):
        result += (x+v[i:]).sum()
    return result


def foo():
    pool = multiprocessing.Pool(processes=nproc)
    xlist = range(2,2+nproc)
    print xlist
    result = pool.map(f, xlist)
    print result

if __name__ == '__main__':
    foo()

Quando eu executo isso a partir do shell por si só, usando "top", vejo três processos python, cada um consumindo 100% da CPU na minha máquina de 16 núcleos.

node094:mpi[ 206 ] /usr/bin/time junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
62.68user 0.04system 0:21.11elapsed 297%CPU (0avgtext+0avgdata 16516maxresident)k
0inputs+0outputs (0major+11092minor)pagefaults 0swaps

No entanto, se eu invocar isso com o mpirun, cada processo python ocupa 33% da CPU e, em geral, leva três vezes mais tempo para ser executado. Chamar com -np 2 ou mais resulta em mais processos, mas não acelera o cálculo.

node094:mpi[ 208 ] /usr/bin/time mpirun -np 1 junk.py
[2, 3, 4]
2
3
4
[333343333400000.0, 333348333450000.0, 333353333500000.0]
61.63user 0.07system 1:01.91elapsed 99%CPU (0avgtext+0avgdata 16520maxresident)k
0inputs+8outputs (0major+13715minor)pagefaults 0swaps

(Notas adicionais: Este é o mpirun 1.8.1, python 2.7.3 na versão Debian do Linux, wheezy. Ouvi dizer que system () nem sempre é permitido nos programas MPI, mas ele está trabalhando para mim nos últimos cinco anos neste computador. Por exemplo, chamei um código paralelo baseado em pthread do system () dentro de um programa MPI, e ele usou 100% da CPU para cada thread, conforme desejado.Além disso, no caso de sugerir a execução do script python em serial e apenas chamando-o em mais nós ... o cálculo do MCMC envolve um número fixo de cadeias que precisam se mover de maneira sincronizada; portanto, infelizmente, o cálculo não pode ser reorganizado dessa maneira.)

questionAnswers(1)

yourAnswerToTheQuestion