【发布时间】:2019-08-29 22:25:27
【问题描述】:
我正在运行带有 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.08s 来实际执行推理。
但是,我注意到当我这样做时,根据nvidia-smi,我的 GPU 内存使用量激增至15637MiB / 16280MiB。
我found,您可以使用选项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.08s 才能运行。
最后,我在下面这样做了,我使用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。
标签: tensorflow neural-network computer-vision