Open onlyhantenghao opened 3 years ago
可能是gpu模型加载比较慢
可能是gpu模型加载比较慢
不太可能吧,模型的初始化和推理是分开的,测试是仅仅针对于推理
auto outputTensor = session.Run(Ort::RunOptions{nullptr}, NetInputNames.data(), &inputTensor, NetInputNames.size(), NetOutputNames.data(), NetOutputNames.size());
,也就是只对比这一行的耗时。
考虑到可能是不是输入的影响,我对多张输入推理进行平均,结果大约慢4倍左右。
我也对比了一下cpu和gpu,发现几个点:
感觉这里面有不少内存和显存之间数据搬运的问题。可能作者写的时候就没有给gpu优化?
对比了下 onnxruntime==1.4.0 & onnxruntime-gpu==1.4.0 检测毫无疑问是gpu快, cpu大约1.1s, gpu大约0.1s 识别模型,我对图片中每一个文字区域进行了时间分析, 发现gpu普遍比cpu慢,以及gpu每run几次就会出现单行识别时间>0.4s的情况,尝试将图片宽度fix住(crop/padding)问题仍存在 用可视化工具看了下onnx的结构没发现什么问题,尝试把onnx转成pb或者其他模型测试,但失败了。不知作者能否提供下原始的模型,我这边看看问题。
给一个降级解决方案吧 如果要用gpu去infer的话可以这样做:
class CRNNHandle: def init(self, model_path): self.sess = rt.InferenceSession(model_path) self.sess.set_providers([self.sess.get_providers()[1]]) # 强制指定用CPU识别
检测部分不变
这样会快不少
+1 mark
解决了吗?我在C++版本的ONNXRuntime也遇到了同样的问题
- 第一次慢,从第二次开始快:应该是硬件从休眠状态warmup,比如cpu从低功耗低频状态提升到正常状态。
- db适合用gpu,而angle和crnn正好相反、用CPU更快。
针对第一点,怎么做啊,让cpu到正常状态
其实应该是这样的,第一次推理会有缓存,把缓存记录下来,再推理的时候,速度就快了,如果换个shape推理,又会慢。所以也不是前面的人说的硬件启动之类的
解决了吗?我在C++版本的ONNXRuntime也遇到了同样的问题
我今天测试也遇到了这个问题,识别屏幕第一次花了31秒,第二次花了300毫秒,调试下来发现原因det模型会根据传入图片大小调整输入层,rec的shape会根据单条文本长度而变化,每个不同长度的文本和不同大小的图片都需要重复初始化gpu,如果不考虑极致性能可以把图片处理为同一大小,rec也处理为同一大小(图片宽度不足则末尾补充黑色)再进行识别
如题,在部署并验证之后发现,基于Ort_GPU的版本端到端的推理要比基于Cpu版本的慢10倍左右,我不确定问题出在哪里,请问各位有没有什么想法?