Paddle OCR End-to-end Training

jdzmm42g  于 2021-11-29  发布在  Java
关注(0)|答案(13)|浏览(272)
  • 版本、环境信息:

   1)PaddlePaddle版本:Fluid 1.2
   3)GPU:CUDA8.0 CUDNNv5
   4)系统环境:Python2.7

  • 训练信息

   1)单机,单卡

  • 复现信息:end-to-end training, 迭代若干次报错
  • 问题描述:

1547704800 casted_label Tensor[cast_10.tmp_0]
shape: [14,1,]
dtype: l
LoD: 0,4,8,14,
data: 66,68,85,1,88,66,84,1,77,70,
Traceback (most recent call last):
File "./train_end2end.py", line 184, in
main()
File "./train_end2end.py", line 180, in main
train(args)
File "./train_end2end.py", line 150, in train
recog_loss])
File "/home/users/sunyipeng/paddle-fluid/venv/lib/python2.7/site-packages/paddle/fluid/executor.py", line 470, in run
self.executor.run(program.desc, scope, 0, True, True)
paddle.fluid.core.EnforceNotMet: an illegal memory access was encountered at [/home/users/sunyipeng/paddle-fluid/Paddle-ocr-end2end/Paddle/paddle/fluid/platform/device_context.cc:230]
PaddlePaddle Call Stacks:
0 0x7fee8803cb76p paddle::platform::EnforceNotMet::EnforceNotMet(std::__exception_ptr::exception_ptr, char const*, int) + 486
1 0x7fee89565532p paddle::platform::CUDADeviceContext::Wait() const + 258

dwbf0jvd

dwbf0jvd1#

每个iteration 到最后,未print出结束信息,next(data)未执行到

khbbv19g

khbbv19g2#

@Yipeng-Sun 这个应该是训练过程中使用了非法的显存地址,目前贴出来的log暂时还无法定位到问题。请问一下,每个iteration没有print信息这个怎么说?你是在每个iteration结束时有加print语句,但并没有执行?而且也没有读取到下一个iter的数据?

vhmi4jdf

vhmi4jdf3#

当前debug结论:
应该是某个数据触发了某个backward op的错误,因为当前print op被修改后不再支持输出反向,调试起来比较麻烦。可以用以下办法输出反向梯度和定位错误位置:

fluid.layers.Print(fluid.defaut_main_program().global_block().find_var('conv1_w@Grad'))

问题持续排查中。。。

brccelvz

brccelvz4#

有的,有很多Print OP进行debug输出,若干次iteration后,在seq2seq attention 输出后,读入next batch之前挂掉了

mwg9r5ms

mwg9r5ms5#

定位到ROIPerspectiveTransform op的GPU的反向在某种情况下会出现显存越界现象,需要进一步确认。

lbsnaicq

lbsnaicq6#

【最近进展】
ROIPerspectiveTransform op反向越界的原因是:roi proposal的lod信息是错的。batch size为2, 第二张图roi proposal为空,roi proposals的lod应该是0, 3, 3, 实际给的是0, 3
临时修复data reader构造lod逻辑,可以稳定训练500+ iter.
解决办法:
修改data reader, 处理下特殊情况。

p1tboqfb

p1tboqfb7#

【补充之前的问题】

  1. 显存优化功能会导致某些tensor出现非预期的lod信息,错误的lod信息会干扰dynamic rnn中的shrink memory操作。
  2. evaluator使用前要在合适的位置调用 evaluator.reset()
  3. 某些batch的roi proposals的lod信息没有feed正确,lod与batch size不匹配。
  4. fluid.layers.Print op无法在backward过程中输出梯度信息, 无其他可用替代方案,严重影响模型对齐排查工作。最终,在本地revert到了之前的版本,临时用于debug. @dzhwinter 如果有时间,可以帮忙看下。
brqmpdu1

brqmpdu18#

训练任务已经可以跑通。

wswtfjt7

wswtfjt79#

当前,打开mem_opt, 加载pretrain模型后,会产生参数load冲突问题,是模型快速收敛的瓶颈

1zmg4dgp

1zmg4dgp10#

补充:关闭mem_opt,加载pretrain模型也会冲突。

pretrain model比训练脚本中的backbone多了一个fc layer,多这个fc layer的weight与encoder部分的fc layer冲突。
解决办法:
把pretrain model文件最后一层fc layer的weight和bias去掉,最后一层是predict class layer, 不属于backbone。

y0u0uwnf

y0u0uwnf11#

增强dynamic rnn : #15972
增强sequence erase: #15982

3b6akqbq

3b6akqbq12#

按layer参数分别存储,非一个统一文件,加载参数名称冲突,参考TF增加name_scope优化设计,避免参数加载bug

wj8zmpe1

wj8zmpe113#

lod_level=2时,训练会挂,原因未RNN step_input输入参数不支持,bug fix分支PR

相关问题