2013-10-31 6 views
12

Ho incontrato un problema, in cui Python si chiude improvvisamente, quando si esegue il multiprocessing con numpy. Ho isolato il problema, in modo che ora posso confermare che il multiprocessing funziona perfettamente quando si esegue il codice di seguito riportato:La multiprocessing con numpy fa in modo imprevisto Python su OSX

import numpy as np 
from multiprocessing import Pool, Process 
import time 
import cPickle as p 

def test(args): 
    x,i = args 
    if i == 2: 
     time.sleep(4) 
    arr = np.dot(x.T,x) 
    print i 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) 
    evaluations = [(x,i) for i in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) 
    p.close() 
    p.join() 

Il problema si verifica quando si tenta di valutare il codice qui sotto. Questo rende Python chiusura imprevista:

import numpy as np 
from multiprocessing import Pool, Process 
import time 
import cPickle as p 

def test(args): 
    x,i = args 
    if i == 2: 
     time.sleep(4) 
    arr = np.dot(x.T,x) 
    print i 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) 
    test((x,4)) # Added code 
    evaluations = [(x,i) for i in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) 
    p.close() 
    p.join() 

Si prega di aiutare qualcuno. Sono aperto a tutti i suggerimenti. Grazie. Nota: ho provato due macchine diverse e si verifica lo stesso problema.

+0

mi sono imbattuto il codice su Windows7/64bit utilizzando WinPython. Entrambi i casi sono eseguiti e sono usciti senza errori. – alandarev

+0

Ci scusiamo per questo. Interessante che funzioni su Windows. Qualsiasi utente Apple che può spiegarmi perché questo si verifica? – Maal

+0

Potrei averti ingannato, quando ho fatto il mio commento di rabbia su Apple usando termine "inaspettato" ovunque. Sto seriamente dubitando che il tuo problema sia specifico del sistema operativo. Potresti provare a eseguire lo script che hai postato su clean Python con installazione numpy per vedere se il problema persiste? – alandarev

risposta

5

Ho trovato una soluzione al problema Il problema si verifica quando Numpy viene utilizzato insieme a BLAS prima dell'inizializzazione un'istanza di multiprocessing. La mia soluzione alternativa è semplicemente quella di inserire il codice Numpy (eseguendo BLAS) in un singolo processo e successivamente eseguire le istanze di multiprocessing. Questo non è un buon stile di codifica, ma funziona. Vedere il seguente esempio:

seguito mancherà - Python si chiuderà:

import numpy as np 
from multiprocessing import Pool, Process 

def test(x): 
    arr = np.dot(x.T,x) # On large matrices, this calc will use BLAS. 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) # Random matrix 
    test(x) 
    evaluations = [x for _ in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) # This is where Python will quit, because of the prior use of BLAS. 
    p.close() 
    p.join() 

seguito avrà successo:

import numpy as np 
from multiprocessing import Pool, Process 

def test(x): 
    arr = np.dot(x.T,x) # On large matrices, this calc will use BLAS. 

if __name__ == '__main__': 
    x = np.random.random(size=((2000,500))) # Random matrix 
    p = Process(target = test,args = (x,)) 
    p.start() 
    p.join() 
    evaluations = [x for _ in range(5)] 
    p = Pool() 
    p.map_async(test,evaluations) 
    p.close() 
    p.join() 
6

Questo è un problema noto con multiprocessing e NumPy su MacOS X, e un po 'di un duplicato di:

segfault using numpy's lapack_lite with multiprocessing on osx, not linux

http://mail.scipy.org/pipermail/numpy-discussion/2012-August/063589.html

La risposta sembra essere quello di utilizzare un diverso BLAS altri di Apple accelera il framework quando si collega Numpy ... sfortunato :(

+2

Come notato da @ogrisel in un commento sul primo link, c'è anche una modalità 'forkserver' nelle nuove versioni di multiprocessing che può aggirare il problema. – Dougal

Problemi correlati