ipython Notebook:如何并行化外部脚本

jrj*_*rjc 4 parallel-processing ipython ipython-notebook ipython-parallel jupyter

我正在尝试使用ipython并行库中的并行计算。但是我对此几乎一无所知,而且我发现很难从对并行计算一无所知的人那里阅读该文档。

有趣的是,我发现的所有教程都只是重复使用该文档中的示例,并且具有相同的解释,按照我的观点,这是没有用的。

基本上我想做的是在后台运行几个脚本,以便它们可以同时执行。在bash中,它将类似于:

for my_file in $(cat list_file); do
    python pgm.py my_file &
done
Run Code Online (Sandbox Code Playgroud)

但是Ipython notebook的bash解释器无法处理后台模式。

看来解决方案是使用ipython的并行库。

我试过了 :

from IPython.parallel import Client
rc = Client()
rc.block = True
dview = rc[:2] # I take only 2 engines
Run Code Online (Sandbox Code Playgroud)

但是后来我被困住了。我不知道如何同时运行同一脚本或pgm两次(或多次)。

谢谢。

jrj*_*rjc 5

一年后,我终于设法得到了想要的东西。

1)创建一个函数,该函数具有您要在其他cpu上执行的操作。在这里,它只是使用!魔术ipython命令从bash调用脚本。我想它将与该call()功能一起使用。

def my_func(my_file):
    !python pgm.py {my_file}
Run Code Online (Sandbox Code Playgroud)

{}使用时不要忘记!

另请注意,to的路径my_file应为绝对路径,因为群集是您启动笔记本电脑的位置(执行jupyter notebook或时ipython notebook),而不一定位于您所在的位置。

2)使用所需的CPU数量启动ipython Notebook群集。等待2s并执行以下单元格:

from IPython import parallel
rc = parallel.Client()
view = rc.load_balanced_view()
Run Code Online (Sandbox Code Playgroud)

3)获取要处理的文件列表:

files = list_of_files
Run Code Online (Sandbox Code Playgroud)

4)将所有文件的函数异步映射到view刚创建的引擎。(不确定措词)。

r = view.map_async(my_func, files)
Run Code Online (Sandbox Code Playgroud)

在运行时,您可以在笔记本上执行其他操作(它在“ 后台 ”中运行!)。您还可以调用r.wait_interactive(),该方法以交互方式枚举处理的文件数,到目前为止所花费的时间以及剩余的文件数。这将阻止您运行其他单元(但是您可以中断它)。

而且,如果您的文件多于引擎,则无需担心,引擎完成1个文件后,它们将立即得到处理。

希望这对别人有帮助!

本教程可能会有所帮助:

http://nbviewer.ipython.org/github/minrk/IPython-parallel-tutorial/blob/master/Index.ipynb

还要注意我仍然有IPython 2.3.1,我不知道从那之后它是否改变了Jupyter

编辑:仍可与Jupyter一起使用,请参见此处了解您可能遇到的差异和潜在问题


请注意,如果在函数中使用外部库,则需要使用以下命令将它们导入不同的引擎:

%px import numpy as np
Run Code Online (Sandbox Code Playgroud)

要么

%%px
import numpy as np
import pandas as pd
Run Code Online (Sandbox Code Playgroud)

与变量和其他函数相同,您需要将它们推送到引擎名称空间:

rc[:].push(dict(
                foo=foo,
                bar=bar))
Run Code Online (Sandbox Code Playgroud)