Tensorflow对象检测掩码rcnn使用太多内存
我试图用mask rcnn运行TF对象检测,但在一个有500GB内存的节点上,它总是死机 我将models/research/object\u detection/trainer.py ConfigProto更新为Tensorflow对象检测掩码rcnn使用太多内存,tensorflow,Tensorflow,我试图用mask rcnn运行TF对象检测,但在一个有500GB内存的节点上,它总是死机 我将models/research/object\u detection/trainer.py ConfigProto更新为 session_config = tf.ConfigProto(allow_soft_placement=True, intra_op_parallelism_threads=1,
session_config = tf.ConfigProto(allow_soft_placement=True,
intra_op_parallelism_threads=1,
inter_op_parallelism_threads=1,
device_count = {'CPU': 1},
log_device_placement=False)
我将mask\u rcnn\u inception\u resnet\u v2\u atrus\u coco.config更新为
train_config: {
batch_queue_capacity: 500
num_batch_queue_threads: 8
prefetch_queue_capacity: 10
到目前为止,更新ConfigProto的效果最好。我一路走到30步,它就死了,而不是1步。对于这次运行,我将把train_配置中的值减少一半。我还大大减少了图像和对象的数量
还有其他想法吗?我也有类似的问题。通过设置以下值,我成功地将内存消耗减少了2.5倍:
prefetch_size: 4
num_readers: 4
min_after_dequeue: 1
我不确定它们中的哪一个(可能全部?)是减少内存的原因,(我没有进行测试),或者它们的确切值对内存消耗的影响有多大,但您可以很容易地尝试一下。以前用于减少内存使用的一些选项已被弃用。发件人:
截至今天,
num\u parallel\u批处理似乎是最大的内存消耗
*\u输入\u读取器
消息我的配置文件现在如下所示:
train_input_reader: {
tf_record_input_reader {
input_path: "<DATASET_DIR>/tfrecords/train*.tfrecord"
}
label_map_path: "<DATASET_DIR>/label_map.pbtxt"
load_instance_masks: true
mask_type: PNG_MASKS
num_parallel_batches: 1
}
列车输入读取器:{
tf_记录_输入_读取器{
输入路径:“/tfrecords/train*.tfrecord”
}
label\u map\u路径:“/label\u map.pbtxt”
加载\u实例\u掩码:true
遮罩类型:PNG_遮罩
并行批数:1
}
掩码RCNN训练现在使用的CPU内存比以前减少了约50%(在775 x 522图像上训练)。500GB是一个很好的内存量。我遇到了GPU内存不足的问题,这是一个单独的限制
对于TensorFlow v2,我发现以下内容非常有用:
1.将批处理大小减小到一个较小的值
在配置文件中,设置:
train_config: {
batch_size: 4
...
}
批量大小可以低至1
2.缩小大小调整后图像的尺寸
在配置文件中,将大小调整器高度
和宽度
设置为低于默认值1024x1024的值
model {
faster_rcnn {
number_of_stages: 3
num_classes: 1
image_resizer {
fixed_shape_resizer {
height: 256
width: 256
}
}
3.不要训练特征检测器
这只适用于掩码R-CNN,是最难实现的更改。在文件research/object\u detection/model\u lib\u v2.py
中,更改以下代码:
当前:
def eager_train_step(detection_model,
...
trainable_variables = detection_model.trainable_variables
gradients = tape.gradient(total_loss, trainable_variables)
if clip_gradients_value:
gradients, _ = tf.clip_by_global_norm(gradients, clip_gradients_value)
optimizer.apply_gradients(zip(gradients, trainable_variables))
新的:
这些变化中的每一个都有影响。然而,他们可能会利用稀缺资源获得“足够好”的结果。你解决了吗?我想在我的客户数据集中使用它,但我没有找到解决方案。是的。您是否设法使口罩显示在eval上?我无法做到请人们帮助我们,而不是只是在没有任何帮助的情况下评论回答。非常感谢。
def eager_train_step(detection_model,
...
trainable_variables = detection_model.trainable_variables
gradients = tape.gradient(total_loss, trainable_variables)
if clip_gradients_value:
gradients, _ = tf.clip_by_global_norm(gradients, clip_gradients_value)
optimizer.apply_gradients(zip(gradients, trainable_variables))
def eager_train_step(detection_model,
...
# Mask R-CNN variables to train -- not feature detector
trainable_variables = detection_model.trainable_variables
to_fine_tune = []
prefixes_to_train = ['FirstStageBoxPredictor',
'mask_rcnn_keras_box_predictor',
'RPNConv'
]
for var in trainable_variables:
if any([var.name.startswith(prefix) for prefix in prefixes_to_train]):
to_fine_tune.append(var)
gradients = tape.gradient(total_loss, to_fine_tune)
if clip_gradients_value:
gradients, _ = tf.clip_by_global_norm(gradients, clip_gradients_value)
optimizer.apply_gradients(zip(gradients, to_fine_tune))