我正在使用ResNet50架构运行FastRCNN。我通过以下方式加载模型检查点并进行推理:
saver = tf.train.Saver()
saver.restore(sess, 'model/model.ckpt')
with tf.Session() as sess:
sess.run(y_pred, feed_dict={x: input_data})
一切看起来都运行得很顺利。该模型需要0.08秒才能真正执行推论。
但是,我注意到当我这样做时,我的GPU内存使用量会爆炸到15637MiB / 16280MiB
,这是根据nvidia-smi
显示的。
我发现可以使用选项config.gpu_options.allow_growth
来阻止Tensorflow分配整个GPU,并改为按需使用GPU内存:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
saver = tf.train.Saver()
saver.restore(sess, 'model/model.ckpt')
with tf.Session(config=config) as sess:
sess.run(y_pred, feed_dict={x: input_data})
这样做可以将内存使用减少到4875MiB / 16280MiB
。模型仍然需要0.08秒运行。
最后,我采用了下面的方法,使用per_process_gpu_memory_fraction
为模型分配固定数量的内存。
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.05
saver = tf.train.Saver()
saver.restore(sess, 'model/model.ckpt')
with tf.Session(config=config) as sess:
sess.run(y_pred, feed_dict={x: input_data})
将此操作执行后,使用量降至1331MiB / 16280MiB
,模型仍需要0.08s才能运行。
这引出一个问题 - TF在推理时如何为模型分配内存?如果我想在同一GPU上加载此模型10次以并行执行推理,是否会有问题?
per_process_gpu_memory_fraction
将 GPU 内存降至1331MiB / 16280MiB
时,为什么一切仍然能够正常运行,并且与使用allow_growth
时完全相同?当使用allow_growth
时,内存为4875MiB / 16280MiB
。 - farza