关于在飞桨平台使用PaddleDetection中的 yolov3_mobilenet_v1_fruit.yml配置训练模型导致的内存溢出问题

溢出原因


近期一直被溢出问题困扰,明明之前在熟悉paddledetection过程时的训练非常正常,可是换成自己的数据集就总是溢出,在调整过 训练圈数batch-size数(为最小:1),以及大家所说的将schedulers中的milestones数值改小皆无法奏效,如果还没有踩过坑的这些参数可以再试着调整调整,至少在本人的数据集中是不奏效的。
究其根本,溢出是在训练过程中缓存爆满才导致的,由于是在云端,我们也无法更换相关硬件设备,只能曲线救码,在调整参数无果后我开始研究不出问题的训练过程,配置文件几乎相同,唯一不同的就是数据集,那问题肯定就出现在数据集上,在观察自带数据集后,发现图片的像素大小普遍在1000*1000上下,反观自己的数据集,居然出现了诸如5000 * 5000这样大的图片,而PaddleDetection中设置了数据增强功能:在RandomExpand这种数据增强里,首先新建一张(原图大小 * ratio)大小的空白图片,然后在这张空白图片上随机找个位置,把原图贴上去,之后再把这张新图片缩放成原图大小。这就导致了原本比较大的图片变得更大了,最终导致内存溢出。找到了原因,接下来就是解决。

关于在飞桨平台使用PaddleDetection中的 yolov3_mobilenet_v1_fruit.yml配置训练模型导致的内存溢出问题_第1张图片

解决方案


这里提供三个思路:

  1. 修改bufsize
    PaddleDetection YOLOv3系列模型训练时,由于图像增强等预处理方式较多,默认会开启多进程加速,子进程完成图像读取,图像增强等预处理后,会将输出结果放到一个队列里面等待模型训练时获取,bufsize这个参数即为该队列的最大长度,该队列存储在内存中,若机器内存较小并且队列长度bufsize设置得较大,就会有上述报错,报错内容为内存不够,无法给队列继续分配内存。这个时候只要把bufsize调小一些保存内存足够放下队列即可。不过我在查看相关配置文件时(如果我没找错的话),发现buffersize给的是无上限的,也就是开到最大也有可能无法放下队列。所以这个方法只适用于队列较小的情况。

  2. 修改ratio参数
    上面我们说是由于buffersize太大所以溢出,那么我们就可以换个思路,将需要放到buffersize中的数据变得小一点就好了,这样就可以通过修改配置文件中的ratio参数来实现。PaddleDetection中设置了数据增强功能:在RandomExpand这种数据增强里,首先新建一张(原图大小 * ratio)大小的空白图片,然后在这张空白图片上随机找个位置,把原图贴上去,之后再把这张新图片缩放成原图大小。笔者是将4.0改成3.0或者2.0即可正常训练。具体训练效果,仍需要观察。

    - !ExpandImage
        max_ratio: 4.0
        mean: [123.675, 116.28, 103.53]
        prob: 0.5
    
  3. 优化数据集
    思路类似2,通过减小放入buffersize中的缓存数据大小,防止溢出。这就需要我们将数据集中较大的图片剔除掉。从源头解决问题。只保留像素大小在1000 * 1000左右的图片即可

结语


​ 由于参考文献比较难找在训练过程中踩了很多坑,希望这篇文章可以帮助到大家,少绕一些弯路。如有错误,烦请指正。

你可能感兴趣的:(智能,计算机视觉,机器学习)