我如何 运行 一个带有 CPU 的进程和另一个带有 GPU 的进程?
How can I run a process with CPU and another process with GPU?
在我的脚本中有 5 个不同的进程应该并行工作。现在我正在使用多处理池方法来 运行 并行进程。实际上它工作得很好。但问题是我想在只有 4 CPU 的平台上使用这个脚本。但是这个平台也有 GPU (Nvidia Jetson Nano)。所以我想 运行 4 个进程与 CPUs 和另一个进程应该与 GPU 一起工作。让我用一些代码来解释一下:
imports...
manager_1 = Manager()
variable = manager_1.Value(ctypes.Array, [])
counter_lock_1= manager_1.Lock()
manager_2 = Manager()
variable_2 = manager_2.Value(ctypes.Array, [])
counter_lock_2 = manager_2.Lock()
manager_3 = Manager()
variable_3 = manager_3.Value(ctypes.Array, [])
counter_lock_3 = manager_3.Lock()
def process1(variable,variable_2,..):
while True:
---Do something---
variable.value = something
def process2(variable,..):
while True:
---Do something---
def process3(variable,variable_2,..):
while True:
---Do something---
def process4(variable,variable_2,variable_3,..):
while True:
---Do something---
def process5(variable,variable_2,..):
while True:
---Do something---
def main():
f_1 = functools.partial(process1,variable,variable_2,...)
f_2 = functools.partial(process2,variable,...)
f_3 = functools.partial(process3,variable,variable_2,...)
f_4 = functools.partial(process4,variable,variable_2,variable_3)
f_5 = functools.partial(process5,variable,variable_2,...)
with Pool() as pool:
res = pool.map(smap, [f_1, f_2, f_3, f_4, f_5])
main()
我的脚本模板是这样的。例如,如果我使用 4 CPU 平台,f_5 会发生什么?我如何使用 GPU 运行 它。
注意:实际上f_5已经在使用GPU,因为它是关于对象检测功能的。我可以选择使用 GPU 设备进行对象检测。但是我必须在池中定义这个函数,因为要获取变量。我想我 运行 它在开始时带有 CPU 但之后它使用 GPU 来检测对象。如何直接使用 GPU 执行此操作?您还有关于使用 pool 或其他会影响性能的建议吗?谢谢。
GPU 不能 运行 Python。实际的对象检测将在非 Python 函数中完成;可能是 CUDA 函数(NVidia CPU 的母语)。
由于您有 4 个 CPU 核心,因此 5 个线程不会同时 运行。 “锁定”代码也很可疑。一般来说,锁应该由使用变量的函数获取,锁将防止使用同一个变量的多个函数之间发生冲突。这就要求每个函数都有一个单独的锁。 counter_lock_1
在 5 个 process
函数之外的任何一个都可能在错误的地方。
在我的脚本中有 5 个不同的进程应该并行工作。现在我正在使用多处理池方法来 运行 并行进程。实际上它工作得很好。但问题是我想在只有 4 CPU 的平台上使用这个脚本。但是这个平台也有 GPU (Nvidia Jetson Nano)。所以我想 运行 4 个进程与 CPUs 和另一个进程应该与 GPU 一起工作。让我用一些代码来解释一下:
imports...
manager_1 = Manager()
variable = manager_1.Value(ctypes.Array, [])
counter_lock_1= manager_1.Lock()
manager_2 = Manager()
variable_2 = manager_2.Value(ctypes.Array, [])
counter_lock_2 = manager_2.Lock()
manager_3 = Manager()
variable_3 = manager_3.Value(ctypes.Array, [])
counter_lock_3 = manager_3.Lock()
def process1(variable,variable_2,..):
while True:
---Do something---
variable.value = something
def process2(variable,..):
while True:
---Do something---
def process3(variable,variable_2,..):
while True:
---Do something---
def process4(variable,variable_2,variable_3,..):
while True:
---Do something---
def process5(variable,variable_2,..):
while True:
---Do something---
def main():
f_1 = functools.partial(process1,variable,variable_2,...)
f_2 = functools.partial(process2,variable,...)
f_3 = functools.partial(process3,variable,variable_2,...)
f_4 = functools.partial(process4,variable,variable_2,variable_3)
f_5 = functools.partial(process5,variable,variable_2,...)
with Pool() as pool:
res = pool.map(smap, [f_1, f_2, f_3, f_4, f_5])
main()
我的脚本模板是这样的。例如,如果我使用 4 CPU 平台,f_5 会发生什么?我如何使用 GPU 运行 它。
注意:实际上f_5已经在使用GPU,因为它是关于对象检测功能的。我可以选择使用 GPU 设备进行对象检测。但是我必须在池中定义这个函数,因为要获取变量。我想我 运行 它在开始时带有 CPU 但之后它使用 GPU 来检测对象。如何直接使用 GPU 执行此操作?您还有关于使用 pool 或其他会影响性能的建议吗?谢谢。
GPU 不能 运行 Python。实际的对象检测将在非 Python 函数中完成;可能是 CUDA 函数(NVidia CPU 的母语)。
由于您有 4 个 CPU 核心,因此 5 个线程不会同时 运行。 “锁定”代码也很可疑。一般来说,锁应该由使用变量的函数获取,锁将防止使用同一个变量的多个函数之间发生冲突。这就要求每个函数都有一个单独的锁。 counter_lock_1
在 5 个 process
函数之外的任何一个都可能在错误的地方。