【问题标题】:My function works fine by itself but not when I run it as a worker我的函数本身可以正常工作,但当我作为工作人员运行它时却不行
【发布时间】:2019-01-03 01:05:54
【问题描述】:

我正在尝试在 Python 中并行运行多个 Yolos。

我有一个函数,我正试图将其用作工作人员。像这样:

import darknet as dn
def yolo(input_queue, net, meta):
    while True:
        task = input_queue.get_nowait()
        c = task.shape[0]
        h = task.shape[1]
        w = task.shape[2]
        task = (task/255.0)
        task = task.flatten()
        new_arr = np.copy(task).astype(np.float32) 
        new_arr = np.ctypeslib.as_ctypes(new_arr)
        im = dn.IMAGE(w,h,c,new_arr)
        dn.rgbgr_image(im)

        print(dn.detect(net, meta, im))

你可以找到暗网文件here

先不说我把数组转换成ctype数组的方式了。已经讨论过here

如果我将这个函数作为一个普通函数运行,它就像一个魅力。但如果我像这样以工人的身份运行它:

p = Process(target=yolo, args=(input_queue, net, meta))
p.start()

它一直到最后一行然后它给了我这个错误:

CUDA Error: initialization error
python: ./src/cuda.c:36: check_error: Assertion `0' failed.

我无法弄清楚为什么会发生此错误。 谁能帮忙?导致此问题的这两种使用此功能的方式有什么区别?

【问题讨论】:

  • 您可能需要将主脚本的“入口点”放在if __name__ == '__main__': 条件中,如multiprocessing 的“安全导入主模块”部分所述编程指导方针 documentation.
  • @GeeTransit 它是不同的,但 sagarwal 的回答给了我解决问题的想法

标签: python multiprocessing yolo


【解决方案1】:

感谢this,我发现问题是您不能在具有不同 PID 的进程之间共享 CUDA 中的上下文,这是有道理的。所以我发现如果我在同一个过程中运行相关的东西(在我的例子中,net)那么它就可以了。在此之前,我在开始工作之前正在装载重量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多