问题描述
使用finetune后的图像分类模型对一批图片进行特征提取时,发现:随着时间推移,每张图片处理耗时增多,占用内存不断变大。tensorflow有类似的issue。
问题代码
|
|
解决过程
tensorflow都是预先构建好graph,输入使用placeholder占位替代,然后再运行,即一次构建,多次运行。凭直觉,上面的代码中可能存在一个问题:inception_preprocessing.preprocess_image
构建图操作放在了运行阶段。所以,第一步尝试把inception_preprocessing.preprocess_image
从运行阶段放到构建图阶段,然而问题并未解决。之后查阅相关问题,按照issue上面的做法,详细记录各个步骤的耗时和内存占用。具体地,使用time.time()
和resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024
分别记录每步大耗时和内存占用情况。举个例子:
从记录日志来看,主要是tf.image.decode_image
这一步耗时和内存不断增长。所以需要把这一步也挪到构建图阶段。
解决方案
|
|
总结
tf.image.decode_image
仅仅是对图片进行图片解码(把图片字符转换成tensor),看似人畜无害,其实也暗藏陷阱。个人推测,每次构建图时,会为tensor分配内存。如果在运行时不断构建图,会导致内存急剧上升;时间上涨的原因待探索。所以,使用tensorflow时,尽量把tensor相关操作一次性定义在graph中,避免在运行阶段构建图。