[PaddlePaddle/PaddleOCR]使用predict_rec.py遇到速度慢问题

2024-05-14 648 views
3
  • 系统环境/System Environment:CentOS7,GPU服务器GN7-T4
  • 版本号/Version:Paddle:2.4.0 PaddleOCR:2.4.0.4
  • 问题相关组件/Related components:predict_rec.py

因为检测模型用的是第三方的,所以只使用paddldocr来进行识别的训练和推理。

一张图片能检测出29个区域,然后用predict_rec.py对这些区域做识别推理。我看里面有个rec_batch_num参数,默认是6,表示每次批量识别几张图片。

几个问题: 1)我怀疑gpu是否打开了。 无论我设置--use_gpu参数是True还是False,识别时间都是一样的,总共16m。日志我发到下一个回复中。 我检查了predict_rec.py中的TextRecognizer类,并没有用到use_gpu参数。有一个例外,就是当benchmark参数为True的时候,才会用到use_gpu参数,但benchmark参数默认是False。

所以我感觉predict_rec.py的--use_gpu参数是无效的,这个文件推理是在cpu环境下进行的。

2)使用默认的rec_batch_num参数6,每次识别都要好几秒的时间,加在一起是16秒。我尝试把这个参数改为1,总时间也是16秒。改为10,也是16m,那么是否有什么办法,能让识别28张图片的推理的时间降低到1-2秒?

回答

7

rec_batch_num=1

每一批predictor的识别时间 耗时:0.27125601 s 每一批postprocess_op的识别时间 耗时:0.00224447 s 每一批循环的时间 耗时:0.27536067 s 每一批predictor的识别时间 耗时:0.26569348 s 每一批postprocess_op的识别时间 耗时:0.00219932 s 每一批循环的时间 耗时:0.26938818 s 每一批predictor的识别时间 耗时:0.26496154 s 每一批postprocess_op的识别时间 耗时:0.00223955 s 每一批循环的时间 耗时:0.26881224 s 每一批predictor的识别时间 耗时:0.36784274 s 每一批postprocess_op的识别时间 耗时:0.00301039 s 每一批循环的时间 耗时:0.37296712 s 每一批predictor的识别时间 耗时:0.38604368 s 每一批postprocess_op的识别时间 耗时:0.00313669 s 每一批循环的时间 耗时:0.39126764 s 每一批predictor的识别时间 耗时:0.38717916 s 每一批postprocess_op的识别时间 耗时:0.00330644 s 每一批循环的时间 耗时:0.39285170 s 每一批predictor的识别时间 耗时:0.39509384 s 每一批postprocess_op的识别时间 耗时:0.00333993 s 每一批循环的时间 耗时:0.40065249 s 每一批predictor的识别时间 耗时:0.40817117 s 每一批postprocess_op的识别时间 耗时:0.00331430 s 每一批循环的时间 耗时:0.41381158 s 每一批predictor的识别时间 耗时:0.40484644 s 每一批postprocess_op的识别时间 耗时:0.00330130 s 每一批循环的时间 耗时:0.41057528 s 每一批predictor的识别时间 耗时:0.40939655 s 每一批postprocess_op的识别时间 耗时:0.00343506 s 每一批循环的时间 耗时:0.41527313 s 每一批predictor的识别时间 耗时:0.44159689 s 每一批postprocess_op的识别时间 耗时:0.00341174 s 每一批循环的时间 耗时:0.44743477 s 每一批predictor的识别时间 耗时:0.43377350 s 每一批postprocess_op的识别时间 耗时:0.00348256 s 每一批循环的时间 耗时:0.43974837 s 每一批predictor的识别时间 耗时:0.42909604 s 每一批postprocess_op的识别时间 耗时:0.00356078 s 每一批循环的时间 耗时:0.43517951 s 每一批predictor的识别时间 耗时:0.44178850 s 每一批postprocess_op的识别时间 耗时:0.00352513 s 每一批循环的时间 耗时:0.44784246 s 每一批predictor的识别时间 耗时:0.43627927 s 每一批postprocess_op的识别时间 耗时:0.00355155 s 每一批循环的时间 耗时:0.44240241 s 每一批predictor的识别时间 耗时:0.43668652 s 每一批postprocess_op的识别时间 耗时:0.00366734 s 每一批循环的时间 耗时:0.44297391 s 每一批predictor的识别时间 耗时:0.43432358 s 每一批postprocess_op的识别时间 耗时:0.00366783 s 每一批循环的时间 耗时:0.44040532 s 每一批predictor的识别时间 耗时:0.45905152 s 每一批postprocess_op的识别时间 耗时:0.00368479 s 每一批循环的时间 耗时:0.46539706 s 每一批predictor的识别时间 耗时:0.47211223 s 每一批postprocess_op的识别时间 耗时:0.00389683 s 每一批循环的时间 耗时:0.47866760 s 每一批predictor的识别时间 耗时:0.48952209 s 每一批postprocess_op的识别时间 耗时:0.00396825 s 每一批循环的时间 耗时:0.49597699 s 每一批predictor的识别时间 耗时:0.49827885 s 每一批postprocess_op的识别时间 耗时:0.00401640 s 每一批循环的时间 耗时:0.50508034 s 每一批predictor的识别时间 耗时:0.49056435 s 每一批postprocess_op的识别时间 耗时:0.00401281 s 每一批循环的时间 耗时:0.49732023 s 每一批predictor的识别时间 耗时:0.57514099 s 每一批postprocess_op的识别时间 耗时:0.00464823 s 每一批循环的时间 耗时:0.58297767 s 每一批predictor的识别时间 耗时:0.59393599 s 每一批postprocess_op的识别时间 耗时:0.00487291 s 每一批循环的时间 耗时:0.60342379 s 每一批predictor的识别时间 耗时:0.59832102 s 每一批postprocess_op的识别时间 耗时:0.00515790 s 每一批循环的时间 耗时:0.60691574 s 每一批predictor的识别时间 耗时:0.61563993 s 每一批postprocess_op的识别时间 耗时:0.00512148 s 每一批循环的时间 耗时:0.62421524 s 每一批predictor的识别时间 耗时:0.63546384 s 每一批postprocess_op的识别时间 耗时:0.00524997 s 每一批循环的时间 耗时:0.64560756 s 每一批predictor的识别时间 耗时:0.77465369 s 每一批postprocess_op的识别时间 耗时:0.00640418 s 每一批循环的时间 耗时:0.78538226 s 识别 耗时:12.99827826 s

3

rec_batch_num=10

每一批predictor的识别时间 耗时:3.84541568 s 每一批postprocess_op的识别时间 耗时:0.03189570 s 每一批循环的时间 耗时:3.91464996 s 每一批predictor的识别时间 耗时:4.72045312 s 每一批postprocess_op的识别时间 耗时:0.03785979 s 每一批循环的时间 耗时:4.80300085 s 每一批predictor的识别时间 耗时:5.81495668 s 每一批postprocess_op的识别时间 耗时:0.04983543 s 每一批循环的时间 耗时:5.92140644 s 识别 耗时:14.63960617 s

3

rec_batch_num=10

每一批predictor的识别时间 耗时:3.84541568 s 每一批postprocess_op的识别时间 耗时:0.03189570 s 每一批循环的时间 耗时:3.91464996 s 每一批predictor的识别时间 耗时:4.72045312 s 每一批postprocess_op的识别时间 耗时:0.03785979 s 每一批循环的时间 耗时:4.80300085 s 每一批predictor的识别时间 耗时:5.81495668 s 每一批postprocess_op的识别时间 耗时:0.04983543 s 每一批循环的时间 耗时:5.92140644 s 识别 耗时:14.63960617 s

0

rec_batch_num默认6 use_gpu=False

每一批predictor的识别时间 耗时:2.15408882 s 每一批postprocess_op的识别时间 耗时:0.01894168 s 每一批循环的时间 耗时:2.19503771 s 每一批predictor的识别时间 耗时:2.44446804 s 每一批postprocess_op的识别时间 耗时:0.02017206 s 每一批循环的时间 耗时:2.48831457 s 每一批predictor的识别时间 耗时:2.57104550 s 每一批postprocess_op的识别时间 耗时:0.02160775 s 每一批循环的时间 耗时:2.61845594 s 每一批predictor的识别时间 耗时:3.36988483 s 每一批postprocess_op的识别时间 耗时:0.02826493 s 每一批循环的时间 耗时:3.43074583 s 每一批predictor的识别时间 耗时:2.91296277 s 每一批postprocess_op的识别时间 耗时:0.02534084 s 每一批循环的时间 耗时:2.96785540 s

识别 耗时:13.70088768 s

5

关于耗时需要以开启benchmark统计的为准,print统计的时间会存在GPU异步的延迟

6
  1. use_gpu是在创建predictor的时候用到的 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/tools/infer/utility.py#L217-L223
  2. 可以开启warmup预热一下推理引擎

关于您说的use_gpu开关,我看了,在utility的create_predictor方法,作为config返回。但是在predict_rec.py中的TextRecognizer,通过self.config接收这个返回结果,然后就再也没用过self.config。所以use_gpu开关并没有在后续被使用到。

2

关于耗时需要以开启benchmark统计的为准,print统计的时间会存在GPU异步的延迟

我是先发现的速度慢,才print一下,看慢在哪里。所以慢的问题是存在的。 所以您这边是希望我不要print,而是打开benchmark,发给您benchmark的日志吗?

0
  1. use_gpu是在创建predictor的时候用到的 https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/tools/infer/utility.py#L217-L223
  2. 可以开启warmup预热一下推理引擎

关于您说的use_gpu开关,我看了,在utility的create_predictor方法,作为config返回。但是在predict_rec.py中的TextRecognizer,通过self.config接收这个返回结果,然后就再也没用过self.config。所以use_gpu开关并没有在后续被使用到。

create_predictor里面已经初始化好了推理引擎,指定gpu就会用到的,有兴趣可以看下paddleinference的机制

关于模型耗时,以benchmark中report的数据为准

1

是有效的,我们这边测试耗时都是正确的,需要开启benchmark,同时设置warmup

9

我已经查到源码predictor = inference.create_predictor(config),说明use_gpu是有效的,之前理解有误

5

关于rec_batch_num还请看一下,我有28个要识别的单列小图片,每个识别时间都是0.5秒左右,合计14秒才全部识别,有什么办法能加速这个识别过程。

3

已经解决,要安装paddlepaddle-gpu版本,而不是paddlepaddle版本