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

有趣的是,我发现的所有教程都只是重复使用文档中的示例,并具有相同的解释,从我的角度来看,这是无用的。

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

for my_file in $(cat list_file); do
    python pgm.py my_file &
done

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

似乎解决方案是使用 ipython 中的并行库。

我试过了 :
from IPython.parallel import Client
rc = Client()
rc.block = True
dview = rc[:2] # I take only 2 engines

但后来我被卡住了。我不知道如何同时运行两次(或更多)相同的脚本或 pgm。

谢谢。

最佳答案

一年后,我终于得到了我想要的。

1) 创建一个函数,你想在不同的 CPU 上做什么。这里只是使用 ! magic ipython 命令从 bash 调用脚本。我想它可以与 call() 函数一起使用。

def my_func(my_file):
    !python pgm.py {my_file}

使用 {} 时不要忘记 !
另请注意,my_file 的路径应该是绝对的,因为集群是您启动笔记本的位置(在执行 jupyter notebookipython notebook 时),这不一定是您所在的位置。

2) 用你想要的 CPU 数量启动你的 ipython notebook 集群。
等待 2 秒并执行以下单元格:
from IPython import parallel
rc = parallel.Client()
view = rc.load_balanced_view()

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

4) 将您的函数和所有文件异步映射到您刚刚创建的引擎的 view。 (不确定措辞)。
r = view.map_async(my_func, files)

当它运行时,您可以在笔记本上做其他事情(它在“ 背景 ”中运行!)。您还可以调用 r.wait_interactive() 以交互方式枚举已处理的文件数和到目前为止花费的时间数以及剩余的文件数。这将阻止您运行其他单元格(但您可以中断它)。

如果您的文件多于引擎,不用担心,只要引擎完成 1 个文件,它们就会被处理。

希望这会帮助其他人!

本教程可能会有所帮助:

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

另请注意,我仍然有 IPython 2.3.1 ,我不知道它是否自 Jupyter 以来发生了变化。

编辑:仍然适用于 Jupyter,请参阅 here for difference and potential issues you may encounter

请注意,如果您在函数中使用外部库,则需要将它们导入到不同的引擎中:
%px import numpy as np

或者
%%px
import numpy as np
import pandas as pd

与变量和其他函数一样,您需要将它们推送到引擎命名空间:
rc[:].push(dict(
                foo=foo,
                bar=bar))

关于parallel-processing - ipython 笔记本 : how to parallelize external script,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24312284/

10-12 03:51
查看更多