4

我正在尝试使用 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。

谢谢。

4

2 回答 2

6

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

1)用你想在不同的cpu上做的事情创建一个函数。在这里,它只是使用!神奇的 ipython 命令从 bash 调用脚本。我想它可以与该call()功能一起使用。

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

{}使用时不要忘记!

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

2)使用您想要的 CPU 数量启动您的 ipython notebook 集群。等待 2s 并执行以下单元格:

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,请参阅此处了解您可能遇到的差异和潜在问题


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

%px import numpy as np

或者

%%px
import numpy as np
import pandas as pd

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

rc[:].push(dict(
                foo=foo,
                bar=bar))

于 2015-07-30T14:10:08.037 回答
1

如果您尝试并行执行一些外部脚本,则不需要使用 IPython 的并行功能。使用 subprocess 模块可以实现复制 bash 的并行执行,如下所示:

import subprocess

procs = []
for i in range(10):
    procs.append(subprocess.Popen(['ls', '/Users/shad/tmp/'], stdout=subprocess.PIPE))

results = []
for proc in procs:
    stdout, _ = proc.communicate()
    results.append(stdout)

请注意,如果您的子进程生成大量输出,则该进程将阻塞。如果您打印输出(结果),您会得到:

print results

['file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n', 'file1\nfile2\n']
于 2014-06-19T19:07:39.950 回答