IPython Jupyter 中的 Julia 并行计算

Posted

技术标签:

【中文标题】IPython Jupyter 中的 Julia 并行计算【英文标题】:Julia parallel computing in IPython Jupyter 【发布时间】:2015-09-09 20:04:31 【问题描述】:

我正在 Ipython 中准备一个小型演示文稿,我想展示在 Julia 中进行并行操作是多么容易。

基本上是蒙特卡洛派计算described here

问题是我不能让它在 IPython (Jupyter) Notebook 中并行工作,它只使用一个。

我开始 Julia 时是:julia -p 4

如果我在 REPL 中定义函数并在那里运行它就可以了。

@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

但是当我这样做时:

 using IJulia
 notebook()

并尝试在仅使用 1 个核心的笔记本中做同样的事情:

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

Out[5]:  3.141679988

那么,为什么 Jupyter 不使用所有内核?我该怎么做才能让它发挥作用?

谢谢。

【问题讨论】:

你有没有试过修改对应的kernel.json文件并在那里添加-p开关? 如果addprocs(4)首先在笔记本中发出会怎样? @rickhg12hs,我认为这应该可行,如果是这样,这是一个比我丑陋的内核文件破解更好的解决方案。 @rickhg12hs 谢谢。效果很好。 我会将我的评论转换为答案,以便其他人更容易找到它。 【参考方案1】:

使用addprocs(4) 作为笔记本中的第一个命令应该提供四个工作人员在笔记本中执行并行操作。

【讨论】:

【参考方案2】:

解决这个问题的一种方法是创建一个始终使用 4 个内核的内核。为此,需要一些手动工作。我假设你在一台 unix 机器上。

在文件夹~/.ipython/kernels/julia-0.x 中,您将找到以下kernel.json 文件:


  "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"

如果复制整个文件夹cp -r julia-0.x julia-0.x-p4,并修改新复制的kernel.json文件:


  "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"

您的路径可能会有所不同。请注意,我只给内核起了一个新名称,并添加了命令行参数`-p 4。

您应该会看到一个名为 Julia 0.3.9 p4 的新内核,它应该始终使用 4 个内核。

另外请注意,当您更新IJulia 时,此内核文件不会得到更新,因此您必须在更新juliaIJulia 时手动更新它。

【讨论】:

感谢您的回答。我没有尝试过,但我认为这可以作为更永久的解决方案。 @rickhg12hs 解决方案目前运行良好。 当我已经在 J​​upyter 上进行 Julia 会话时...是否有任何命令能够告诉我启用了多少进程? @skan 有一个procs() 函数可以返回所有进程的ID。如果你在用-p 4启动julia之后调用它,你会得到一个长度为5的数组:一个是主进程,另外四个是-p请求的worker。【参考方案3】:

您可以使用以下命令添加新内核:

using IJulia
#for 4 cores
installkernel("Julia_4_threads", env=Dict("JULIA_NUM_THREADS"=>"4"))

#or for 8 cores
installkernel("Julia_8_threads", env=Dict("JULIA_NUM_THREADS"=>"8"))

重新启动 VSCode 后,此选项将显示您的 select kernel 选项。

【讨论】:

以上是关于IPython Jupyter 中的 Julia 并行计算的主要内容,如果未能解决你的问题,请参考以下文章

IPython(jupyter)中的完成现在可以工作(意外的关键字参数'column')

jupyter笔记本中的Ipython错误,没有堆栈跟踪

在 Julia 的 Jupyter Notebook 上从 GitHub 下载文件时出现 Failed proccess 错误

Pandas/iPython 笔记本(Jupyter)中 DataFrame/table 中的 GROUP BY 行?

在 jupyter/iPython notebook 脚本和类方法之间同步代码

Jupyter和IPython