python - 我的函数本身可以正常工作,但当我作为工作人员运行它时却不行
问题描述
我正在尝试在 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))
你可以在这里找到暗网文件。
先不说我把数组转换成ctype数组的方式。它已经在这里讨论过了。
如果我将这个函数作为一个普通函数运行,它就像一个魅力。但是,如果我像这样以工人的身份运行它:
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.
我无法弄清楚为什么会发生此错误。谁能帮忙?导致此问题的这两种使用此功能的方式有什么区别?
解决方案
多亏了这一点,我发现问题是您无法在具有不同 PID 的进程之间共享 CUDA 中的上下文,这是有道理的。所以我发现如果我net
在同一个过程中运行相关的事情(在我的情况下,)那么它就可以了。在此之前,我在开始工作之前正在装载重量。
推荐阅读
- visual-studio-code - 有没有办法仅对 VS Code 中的注释禁用自动缩进?
- reactjs - 关于在页面加载时在 mobx 中重新加载可观察数据的问题
- python - 了解代数效应
- jquery - Ajax 只在表单提交时工作一次
- javascript - e.clientX - rect.left 返回 false 值 // vanilla JS
- javascript - 在异步等待中使用循环提供 eslint 错误
- javascript - 如何创建一个列表
- python - 是否可以使用 python 时间序列工作日来生成月末时间序列?
- javascript - FormBuilder.js:如何从单选组控件继承?
- javascript - 如何从另一个数组中找到的一个数组中递增每个字符串元素?