You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

4核CPU配Nvidia Jetson Nano如何部署4个CPU进程+1个GPU进程

问题1:4核CPU平台上原代码的f_5运行状态

你当前代码里Pool()没有指定processes参数,默认会创建和CPU核心数相等的工作进程,也就是4个。你提交了5个永久运行的while True死循环任务,会有4个任务立刻被调度执行,剩下的1个任务(可能是f_5,也可能是其他任务,取决于系统调度)会一直停留在任务队列里,永远拿不到执行资源,不会实际运行。

问题2:让f_5使用GPU运行的方法

首先纠正一个认知误区:不存在“进程完全跑在GPU上”的说法,所有进程的控制逻辑、内存调度、IO操作都是跑在CPU上的,GPU仅负责处理你传入的计算密集型算子任务。你之前的猜测是对的,只需要保证f_5的目标检测逻辑显式绑定GPU设备,同时给f_5分配独立的CPU调度资源即可,具体修改步骤如下:

  1. 调整进程池大小为5,保证5个进程都能拿到CPU调度权限
  2. 在f_5函数开头显式指定GPU设备,同时可以把前4个CPU进程绑定到固定CPU核心,避免和f_5抢占CPU资源
    修改后的参考代码如下:
# 在process1-process4开头加入CPU绑核逻辑
import os
os.sched_setaffinity(0, {0,1,2,3}) # 绑定到前4个CPU核心

# 在process5开头加入绑核和GPU指定逻辑
import os
os.sched_setaffinity(0, {3}) # 单独绑定到第4个核心,减少CPU资源抢占
# 以下根据你使用的推理框架选对应配置,Jetson Nano默认GPU id为0
# PyTorch框架
import torch
torch.cuda.set_device(0)
# TensorRT框架
# 创建推理引擎时指定device_id=0即可

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,...)
    # 进程池指定大小为5
    with Pool(processes=5) as pool:
        res = pool.map(smap, [f_1, f_2, f_3, f_4, f_5])

原来的Manager共享变量机制不需要修改,进程绑核、GPU调用都不会影响共享内存的读写。

问题3:比进程池性能更好的并行方案

Jetson Nano属于嵌入式平台,进程池的动态调度开销相对更高,针对你的固定5个进程的场景,有两个更优的实现方案:

  • 直接创建独立Process实例:不需要进程池的动态调度逻辑,开销更低、调度更可控,参考代码如下:
from multiprocessing import Process

def main():
    p1 = Process(target=process1, args=(variable, variable_2, ...))
    p2 = Process(target=process2, args=(variable, ...))
    p3 = Process(target=process3, args=(variable, variable_2, ...))
    p4 = Process(target=process4, args=(variable, variable_2, variable_3, ...))
    p5 = Process(target=process5, args=(variable, variable_2, ...))
    
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    p5.start()
    
    p1.join()
    p2.join()
    p3.join()
    p4.join()
    p5.join()
  • 替换Manager为原生共享内存:Manager的底层是走IPC通信,开销大,你可以用multiprocessing.Array或者multiprocessing.shared_memory直接创建共享内存,数据交互速度比Manager高30%以上,更适合嵌入式高频数据交互的场景。
  • 优先用Queue做进程通信:如果你的进程是生产者消费者模式,用multiprocessing.Queue传递数据不需要手动加锁,更安全,开销也更低。

内容的提问来源于stack exchange,提问作者YusufUcan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:15:04