2015-06-23 17 views
7

sto preparando una piccola presentazione in ipython dove voglio mostrare come sia facile fare il funzionamento in parallelo di Julia.Julia calcolo parallelo in IPython Jupyter

E 'fondamentalmente un calcolo Monte Carlo Pi described here

Il problema è che non riesco a farlo funzionare in parallelo all'interno di un notebook IPython (Jupyter), utilizza una sola.

ho iniziato Julia: julia -p 4

Se io definisco le funzioni all'interno del REPL e corro lì funziona bene.

@everywhere function compute_pi(N::Int) 
    """ 
    Compute pi with a Monte Carlo simulation of N darts thrown in [-1,1]^2 
    Returns estimate of pi 
    """ 
    n_landed_in_circle = 0 
    for i = 1:N 
     x = rand() * 2 - 1 # uniformly distributed number on x-axis 
     y = rand() * 2 - 1 # uniformly distributed number on y-axis 

     r2 = x*x + y*y # radius squared, in radial coordinates 
     if r2 < 1.0 
      n_landed_in_circle += 1 
     end 
    end 
    return n_landed_in_circle/N * 4.0  
end 

function parallel_pi_computation(N::Int; ncores::Int=4) 
    """ 
    Compute pi in parallel, over ncores cores, with a Monte Carlo simulation throwing N total darts 
    """ 
    # compute sum of pi's estimated among all cores in parallel 
    sum_of_pis = @parallel (+) for i=1:ncores 
     compute_pi(int(N/ncores)) 
    end 

    return sum_of_pis/ncores # average value 
end 

julia> @time parallel_pi_computation(int(1e9)) 
elapsed time: 2.702617652 seconds (93400 bytes allocated) 
3.1416044160000003 

Ma quando lo faccio:

using IJulia 
notebook() 

e cercare di fare la stessa cosa dentro il Notebook utilizza solo 1 nucleo:

In [5]: @time parallel_pi_computation(int(10e8)) 
elapsed time: 10.277870808 seconds (219188 bytes allocated) 

Out[5]: 3.141679988 

Quindi, perché Jupyter non utilizza tutti i core? Cosa posso fare per farlo funzionare?

Grazie.

+0

Avete provato a modificare il file 'kernel.json' corrispondente e aggiungere l'opzione' -p' lì? – cel

+1

Cosa succede se 'addprocs (4)' viene rilasciato per primo all'interno del notebook? – rickhg12hs

+0

@ rickhg12hs, penso che questo dovrebbe funzionare e, in tal caso, questa è una soluzione molto più bella rispetto al mio brutto file di hacking del kernel. – cel

risposta

10

Utilizzando addprocs(4) come il primo comando nel vostro notebook dovrebbe fornire quattro lavoratori per fare operazioni parallele all'interno del tuo notebook.

3

Un modo per risolvere questo è quello di creare un kernel che utilizza sempre 4 core. Per questo è richiesto un lavoro manuale. Presumo che tu sia su una macchina Unix.

Nella cartella ~/.ipython/kernels/julia-0.x, troverete seguente kernel.json di file:

{ 
    "display_name": "Julia 0.3.9", 
    "argv": [ 
    "/usr/local/Cellar/julia/0.3.9_1/bin/julia", 
    "-i", 
    "-F", 
    "/Users/ch/.julia/v0.3/IJulia/src/kernel.jl", 
    "{connection_file}" 
    ], 
    "language": "julia" 
} 

Se si copia l'intera cartella cp -r julia-0.x julia-0.x-p4, e modificare l'appena copiato kernel.json di file:

{ 
    "display_name": "Julia 0.3.9 p4", 
    "argv": [ 
    "/usr/local/Cellar/julia/0.3.9_1/bin/julia", 
    "-p", 
    "4", 
    "-i", 
    "-F", 
    "/Users/ch/.julia/v0.3/IJulia/src/kernel.jl", 
    "{connection_file}" 
    ], 
    "language": "julia" 
} 

I percorsi probabilmente lo farà sii diverso per te. Nota che ho dato solo un nuovo nome al kernel e ho aggiunto l'argomento della riga di comando `-p 4.

Dovresti vedere un nuovo kernel chiamato Julia 0.3.9 p4 che dovrebbe usare sempre 4 core.

Si noti inoltre che questo file del kernel non verrà aggiornato quando si aggiorna IJulia, quindi è necessario aggiornarlo manualmente ogni volta che si aggiorna julia o IJulia.

+0

Grazie per la risposta. Non ho provato questo, ma penso che questo potrebbe funzionare per una soluzione più permanente. La soluzione @ rickhg12hs ha funzionato bene per ora. – Esteban

+0

Quando sono già in una sessione di Julia su Jupyter ... Esiste un comando in grado di dirmi quanti processi sono stati abilitati? – skan

+1

@skan c'è una funzione 'procs()' che restituisce gli ID di tutti i processi. Se lo chiami dopo aver avviato julia con '-p 4', otterrai una serie di lunghezza 5: Uno è il processo principale e gli altri quattro sono gli operatori richiesti da' -p'. – cel