PaddlePaddle / PaddleDetection

Object Detection toolkit based on PaddlePaddle. It supports object detection, instance segmentation, multiple object tracking and real-time multi-person keypoint detection.
Apache License 2.0
12.85k stars 2.9k forks source link

训练过程中出现_C_ops.one_hot开超大的显存,导致oom。 #9127

Closed ZiQiangXie closed 1 month ago

ZiQiangXie commented 2 months ago

问题确认 Search before asking

请提出你的问题 Please ask your question

yolo模型训练,用的TAl标签分配。已经稳定训练了很多个epoch都正常没有问题。但是在随后的训练中,在标签分配里面,_C_ops.one_hot 会开超过11G的显存,导致OOM。 感觉这种现象很不正常,前期训练了十几个epoch都没问题,为什么后面还能开出这么大的显存呢。 这个地方是调用的库,没法看到里面具体操作了。这个地方能不能不调用库,而是换一个其他等价的代码实现?这样是不是可行。 2024-09-03_092821

zhangyubo0722 commented 2 months ago

在前期训练的时候大概用了多少显存呢

ZiQiangXie commented 2 months ago

一般18G左右吧,总共24G。这个是个概率性问题。如果OOM了,重新继续训练,一般情况下就能训过这个断的epoch。但是下一个epoch还是有概率会断,导致训练没法继续。 训练数据集比较大,有过百的类别。不过batch没太大,单卡也就20或者24左右,开启4卡+amp,单卡占用显存18G左右吧。OOM会出现在某一个卡上。

zhangyubo0722 commented 2 months ago

检测模型在训练时会对数据有随机RandomExpand操作,假如数据集中的图片像素数量比较大的话,经过Expand后会导致数据更大,有可能会超显存,所以还是建议把batchsize调小一点

ZiQiangXie commented 2 months ago

您好,我这个没有开RandomExpand增强,只有随机裁剪、distort和flip,应该不是这个引起的。而且图片原始分辨率没有特别大的异常的情况。 我看报错的是one_hot那里,这个函数会开大量的显存吗?根据报错提示,这个函数要开11G显存。是在标签分配里面,有没有可能是某个batch里面的目标数量过多导致的?但是即使数量很大,一个one_hot向量也不至于开11G的显存呀。实在不理解咋回事。 现在只有4张卡,batch小了怕效果不好呀。

ZiQiangXie commented 2 months ago

如果这一块不调用这个库函数,而是换一种简单的算子op组合实现一下 one_hot 可行吗?

zhangyubo0722 commented 2 months ago

这就需要修改paddle的底层算子代码,然后重新编译了,我们模型层面没有办法对这个进行修改

TingquanGao commented 1 month ago

The issue has no response for a long time and will be closed. You can reopen or new another issue if are still confused.


From Bot