【问题标题】:parallelization issue using python view library使用 python 视图库的并行化问题
【发布时间】:2014-06-25 15:55:09
【问题描述】:

所以我写了一些基本结构如下的代码:

from numpy import *
from dataloader import loadfile
from IPython.parallel import Client
from clustering import * 

data = loadfile(0)

N_CLASSES = 10
rowmax = nanmax(data.values, 0)
rowmin = nanmin(data.values, 0)

# Defines the size of block processed at a time
BLOCK_SIZE = 50000
classmean, classcov, classcovinv, classlogdet, classlogprob = init_stats(data, N_CLASSES, rowmax, rowmin)

client = Client()
ids    = client.ids
nodes  = len(ids)
view   = client.load_balanced_view()
dview  = client[:]

def get_ml_class(data, args): do sth
dview.scatter('datablock', data)
dview.execute('res1, res2 = get_ml_class(datablock, args)', block=False)

dview.execute 部分的输出是

<AsyncResult: execute>

这意味着它被执行了,但是,当我试图拉结果时

dview.pull(['res1','res2'], block=True)

它显示:

NameError: name 'res1' is not defined

谁能告诉我我的代码有什么问题?非常感谢!

【问题讨论】:

    标签: python parallel-processing ipython ipython-parallel


    【解决方案1】:

    让我们做一个更简单的例子:

    from IPython.parallel import Client
    
    rc = Client()
    dview = rc[:]
    dview.scatter('a', Range(16))
    dview.execute('res1,res2 = a[0], a[1]', block=False)
    dview.pull(['res1'], block=True)
    

    这按预期工作并给出了结果:

    [[0], [4], [8], [12]]
    

    所以,我们至少做到了这一点。但是让我稍微修改一下代码:

    from IPython.parallel import Client
    
    rc = Client()
    dview = rc[:]
    dview.scatter('a', Range(16))
    dview.execute('res1,res2 = a[0], b[1]', block=False)
    dview.pull(['res1'], block=True)
    

    现在我们有了NameError。为什么?

    因为execute 行有错误(它引用了不存在的变量b)。非阻塞execute 并没有太多抱怨。在第一个(工作)案例中,状态为:

    <AsyncResult: finished>
    

    在第二种(非工作)情况下:

    <AsyncResult: execute>
    

    除此之外它非常安静,第二条消息并不一定意味着发生了错误。为了查看真正的错误消息,请将blocking 更改为True。然后你会看到出了什么问题。

    如果你想知道你的非阻塞执行是否有效,你必须捕获execute返回的AsyncResult对象。它有几个有趣的方法,但您最感兴趣的是readysuccessful 方法:

    ar = dview.execute(...)
    ar.ready()                # True if the process has finished
    ar.successful()           # True if there were no exceptions raised
    

    此外,可以使用AsyncResult 对象的get 方法获取执行期间可能引发的异常。例如,我在交互式 shell 中给出的不好的例子:

    >>> ar.get()
    
    [0:execute]: 
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)<ipython-input-1-608f57d70b2f> in <module>()
    ----> 1 res1,res2=a[0]**2,b[1]**2
    NameError: name 'b' is not defined
    
    [1:execute]: 
    ---------------------------------------------------------------------------
    NameError                                 Traceback (most recent call last)<ipython-input-1-608f57d70b2f> in <module>()
    ----> 1 res1,res2=a[0]**2,b[1]**2
    NameError: name 'b' is not defined
    
    ...
    

    因此,总结一下:尝试找出您尝试远程运行的功能出了什么问题。现在它似乎提出了一些例外。该错误可能与args 有关,它似乎不适用于远程脚本。也许缺少scatter

    【讨论】:

    • 感谢您的回复,但是您的第一个和第二个代码有什么区别??
    • 啊,第二个包含错误(对未知变量的引用)。请参阅我编辑的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多