【问题标题】:How does TensorFlow allocate GPU memory when performing inference?TensorFlow 在执行推理时如何分配 GPU 内存?
【发布时间】: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.org/guide/using_gpu

标签: tensorflow neural-network computer-vision


【解决方案1】:

让我们首先确保tf.Session(config=config) 中发生了什么。

表示使用将默认图def提交给tensorflow运行时,运行时相应地分配GPU内存。

然后 Tensorflow 将分配所有 GPU 内存,除非您通过设置 per_process_gpu_memory_fraction 来限制它。如果无法分配内存量,它将失败,除非.gpu_options.allow_growth = True,它告诉 TF 在失败的情况下再次尝试分配更少的内存,但迭代总是从全部或部分 GPU 内存开始。

如果你有 10 个会话,每个会话需要不到 1/10 的 GPU 内存,它应该可以工作。

【讨论】:

  • 嗨!感谢您的回答。唯一让我感到困惑的部分是,当我使用.gpu_options.allow_growth = True 时,GPU 的使用率为4875MiB / 16280MiB,但当我使用per_process_gpu_memory_fraction=0.05 时,GPU 的使用率为1331MiB / 16280MiB,但一切仍然正常。这是否意味着 allow_growth 分配的 GPU 内存比需要的多?
  • “总是从全部或部分 GPU 内存开始。”如果它无法获得这么多的内存,它会尝试更少,而不仅仅是正确的大小:-) 文档没有这么说,但根据我的观察......
  • 嗯,有趣!似乎我们仍然没有一个超级具体的答案。我会继续研究,看看有没有发现。
  • 如果您发现任何问题,请纠正我
猜你喜欢
  • 2017-11-13
  • 1970-01-01
  • 2016-03-15
  • 2017-11-14
  • 2019-04-07
  • 1970-01-01
  • 2020-03-15
相关资源
最近更新 更多