Tensorflow对象检测API被杀死-OOM。如何减少随机缓冲区的大小?

时间:2018-06-19 13:06:34

标签: python tensorflow object-detection-api tfrecord

系统信息

  • OS平台和发行版:CentOS 7.5.1804
  • TensorFlow的安装方式:pip install tensorflow-gpu
  • TensorFlow版本:tensorflow-gpu 1.8.0
  • CUDA / cuDNN版本:9.0 / 7.1.2
  • GPU模型和内存:GeForce GTX 1080 Ti,11264MB
  • 精确的再现命令

    python train.py --logtostderr --train_dir =。/ models / train --pipeline_config_path = mask_rcnn_inception_v2_coco.config

描述问题

我正在尝试在我自己的数据集上训练Mask-RCNN模型(从在COCO上训练的模型中进行微调),但是一旦填充了洗牌缓冲区,该过程就会被终止。

在此之前,nvidia-smi的内存使用量约为10669MB / 11175MB,但GPU利用率仅为1%。

我尝试调整以下train_config设置:

batch_size: 1    
batch_queue_capacity: 10    
num_batch_queue_threads: 4    
prefetch_queue_capacity: 5

对于train_input_reader:

num_readers: 1
queue_capacity: 10
min_after_dequeue: 5

我相信我的问题类似于TensorFlow Object Detection API - Out of Memory,但我使用的是GPU,而不是仅使用CPU。

我正在训练的图像相对较大(2048 * 2048),但是我要避免缩小尺寸,因为要检测的对象很小。我的训练集包括400张图像(在.tfrecord文件中)。

有没有一种方法可以减小随机缓冲区的大小,以查看是否减少了内存需求?

追踪

INFO:tensorflow:Restoring parameters from ./models/train/model.ckpt-0
INFO:tensorflow:Restoring parameters from ./models/train/model.ckpt-0
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Starting Session.
INFO:tensorflow:Starting Session.
INFO:tensorflow:Saving checkpoint to path ./models/train/model.ckpt
INFO:tensorflow:Saving checkpoint to path ./models/train/model.ckpt
INFO:tensorflow:Starting Queues.
INFO:tensorflow:Starting Queues.
INFO:tensorflow:global_step/sec: 0
INFO:tensorflow:global_step/sec: 0
2018-06-19 12:21:33.487840: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:94] Filling up shuffle buffer (this may take a while): 97 of 2048
2018-06-19 12:21:43.547326: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:94] Filling up shuffle buffer (this may take a while): 231 of 2048
2018-06-19 12:21:53.470634: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:94] Filling up shuffle buffer (this may take a while): 381 of 2048
2018-06-19 12:21:57.030494: I tensorflow/core/kernels/data/shuffle_dataset_op.cc:129] Shuffle buffer filled.
Killed

3 个答案:

答案 0 :(得分:1)

在您的 pipeline.config 中,添加

<块引用>

shuffle_buffer_size: 200

或根据您的系统。

train_input_reader {
  shuffle_buffer_size: 200
  label_map_path: "tfrecords/label_map.pbtxt"
  tf_record_input_reader {
    input_path: "tfrecords/train.record"
  }
}

它对我有用,也在 tf1 和 tf2 上进行了测试。

答案 1 :(得分:0)

您可以尝试以下步骤:

1。设置batch_size=1(或尝试自己设置)

2。更改"default value": optional uint32 shuffle_buffer_size = 11 [default = 256](或尝试自己动手)     代码在这里

models/research/object_detection/protos/input_reader.proto

Line 40 in ce03903

 optional uint32 shuffle_buffer_size = 11 [default = 2048];

原始设置为:

optional uint32 shuffle_buffer_size = 11 [default = 2048]

默认值为2048,对于batch_size=1而言太大,应进行相应的修改,我认为它会占用大量RAM。

3。重新编译Protobuf库

来自tensorflow / models / research /

protoc object_detection/protos/*.proto --python_out=.

答案 2 :(得分:0)

我将 flow_from_directory 更改为 flow_from_dataframe 功能。因为它不会将所有图像的矩阵值上传到内存。