PaddleX
PaddleX copied to clipboard
C++部署错误,更改mode_infer.cpp生成的dll和lib文件,MFC调用.
问题类型:模型部署
问题描述
设备硬件环境:英伟达2080ti,CUDA10.2,CUNN7.6,TensorRT 7.0
PaddleX分支PaddleX-release-2.0.0rc3
参考model_infer.cpp 更改为分割模型,生成dll和lib,编写MFC程序,初始化模型时选择GPU方式,调用生成的dll和lib。读取文件夹下的图片可以实现图像的分割,接入工业相机采集后,将采集的图像(一段内存地址)内部已经生成为opnecv的Mat图像传给深度学习预测推理程序就报错,报错的地方为ppinference_engine.cpp的Infer函数,中的 in_tensor->CopyFromCpu(im_tensor_data);这句话,我一开始觉得是相机没有数据或者数据的格式不对,特地在传入推理程序前,将相机采集的图像保存,图像没有问题,后来我将初始化时改为CPU方式,也可以实现图像的语义分割。想问下这个是什么问题?读取文件夹下的图片进行语义分割没有问题,改为CPU方式下读取工业相机也没有问题,在GPU下就出现上述错误?
请在这里描述您在使用过程中的问题,说明您的部署环境,部署需求,模型类型和应用场景等,便于开发人员快速响应。
关于gpu下能否正常预测,之前有试过直接用给出的demo和模型做预测能正常运行么?
另外自己修改哪些地方?
是不是使用了多线程? 我看报错提示是因为同时访问了inputs导致的报错
@heliqi 您好,没有使用多线程,看文档多线程 使用PredictorPool,打开PaddleX-release-2.0.0rc3\dygraph\deploy\cpp ,没有PredictorPool类。看文档CopyFromCpu(data) 是从cpu获取数据,设置到tensor内部。我是使用同一个模型对多个相机的输入图像进行预测,请问这样有问题吗?
@FlyingQianMM 您好,直接给的demo和模型可以正常运行,我修改的部分主要是将demo里的model_infer,目标检测任务改为语义分割,输出的是对应的label。
我是使用同一个模型对多个相机的输入图像进行预测
这个具体是指 把多个相机的输入图像放到同一个batch里面做预测还是怎么的?
@FlyingQianMM 不是将多个相机的输入图像放进一个batch里面进行预测,而是相机有触发信号,采集图像传入预测程序,因为是流水线上不同相机拍摄工件的不同位置,但是调用的是同一个预测程序,请问这样有问题吗?
那是每个相机一个线程,然后调用同一个模型?
@FlyingQianMM 真是应用场景是这样的,但是我现在测试的时候只是链接一个相机,加载完模型选择GPU模式,然后触发相机拍照,对采集的图像推理时就报错,改为cpu模式就没问题,改为GPU模式处理文件夹下的图片也没问题。
@heliqi @muare如果需要, 你们可以远程整台电脑复现一下这个错误。
- 如果只有一个模型实例, 确保线程中的推理已经完成,再传入新的图片调用推理。 比如下面这个PR中的multi_thread_infer2.cpp例子中的 future1.get(); 就是保证线程计算完毕: https://github.com/PaddlePaddle/PaddleX/pull/1179
- 请使用线程池,初始化线程数量后,重复复用这些线程。避免线程频繁的销毁创建,导致底层cuda问题
缺 cuda的库 cusolver64_10.dll
, 拷贝到运行目录中