多线程是加载一个复用推理模型还是用多个独立的推理模型

多线程 + 多相机并行推理:必须每个线程独立拥有一个 cv::dnn::Net 对象,不能多个线程共用同一个 Net! 也就是:线程数 = Net 实例数量。

cpp 复制代码
    cv::dnn::Net netCam5,netCam6,netCam7,netCam8,netCam11,netCam12;

    netCam5 = readNetFromONNX(onnx_seg_path);
    netCam5.setPreferableBackend(DNN_BACKEND_OPENCV);
    netCam5.setPreferableTarget(DNN_TARGET_CPU);
    netCam6 = readNetFromONNX(onnx_seg_path);
    netCam6.setPreferableBackend(DNN_BACKEND_OPENCV);
    netCam6.setPreferableTarget(DNN_TARGET_CPU);
    netCam7 = readNetFromONNX(onnx_seg_path);
    netCam7.setPreferableBackend(DNN_BACKEND_OPENCV);
    netCam7.setPreferableTarget(DNN_TARGET_CPU);
    netCam8 = readNetFromONNX(onnx_seg_path);
    netCam8.setPreferableBackend(DNN_BACKEND_OPENCV);
    netCam8.setPreferableTarget(DNN_TARGET_CPU);

原因分析:

  1. 底层原因(OpenCV DNN 不管 CPU/CUDA 后端都适用)

cv::dnn::Net 不是线程安全。

Net 内部包含:计算图、中间张量缓存、推理上下文、GPU 显存上下文。

多线程同时调用同一个 Net 的 setInput() / forward(),会发生:

内存覆盖、张量错乱

随机崩溃、偶发断言报错(就是你之前遇到的各种 Reshape /assign 异常)

推理结果随机错乱、mask / 检测框忽对忽错

简单一句话:同一个 Net 不能被多个线程并发调用 forward。

2.每个线程内部只操作自己专属的 Net,无锁,并发安全。

优点:不需要互斥锁,并发性能最好,逻辑简单稳定,工业视觉首选。

缺点:CPU 推理:每个 Net 会在内存里加载一份模型权重,内存占用成倍增加。

相关推荐
冯一川1 小时前
使用 Python 实现支持多轮对话的 CLI 聊天机器人(基于 Ollama)
人工智能
武子康1 小时前
LingBot-Video 怎么选推理路径?8 步 DMD 不等于小显存
人工智能·后端
Febrie1 小时前
Codex插件推荐:Local Figma Agent MCP,不购买付费套餐,也能让 Agent 读懂并修改Figma设计稿
人工智能
edtoplort1 小时前
OpenAI紧急叫停GPT-6.1 Astra训练,奥尔特曼为何踩刹车
人工智能·gpt·算法
打工仔折腾 AI1 小时前
Docker镜像分层与卷挂载到底怎么工作:一次文件系统层面的实测分析
运维·人工智能·后端·python·docker·容器·性能优化
墨染天姬2 小时前
【人工智能训练师】python语法二
开发语言·人工智能·python
深蓝AI2 小时前
748GB 统一内存装进桌面:英伟达 DGX Station 本地跑万亿参数模型,瓶颈不在算力在插座
人工智能·agent
成旭先生2 小时前
AI 文本审核 API:一段中文文本判风险等级、命中标签与处置建议
java·前端·人工智能·api接口·内容风控·文本审核·ugc审核
草上飞95273 小时前
把前沿能力装进便宜产物,本身是多数模型还不会的能力
人工智能·深度学习·llm