在TensorFlow中使用共享GPU内存?

时间:2017-12-17 22:05:57

标签: tensorflow shared-memory vram

所以我在一台带有GeForce GTX 980显卡的Windows 10机器上安装了TensorFlow的GPU版本。

不可否认,我对显卡知之甚少,但据dxdiag说它确实有:

4060MB专用内存(VRAM)和;

8163MB共享内存

总计大约12224MB

但我注意到,这种“共享”记忆似乎毫无用处。当我开始训练模型时,VRAM将填满,如果内存需求超过这些4GB,TensorFlow将因“资源耗尽”错误消息而崩溃。

当然,我可以通过选择适当低的批量大小来防止达到这一点,但我想知道是否有办法利用这些“额外”8GB RAM,或者如果是这样的话TensorFlow需要专用内存。

3 个答案:

答案 0 :(得分:11)

共享内存是为图形保留的主系统RAM的一个区域。参考文献:

https://en.wikipedia.org/wiki/Shared_graphics_memory

https://www.makeuseof.com/tag/can-shared-graphics-finally-compete-with-a-dedicated-graphics-card/

https://youtube.com/watch?v=E5WyJY1zwcQ

这种类型的内存是集成显卡,例如Intel HD系列通常使用的内容。

这不在您的NVIDIA GPU上,CUDA无法使用它。 Tensorflow在GPU上运行时无法使用它,因为CUDA无法使用它,而且在CPU上运行时也是如此,因为它是为图形保留的。

即使CUDA可以某种方式使用它。它不会有用,因为系统RAM带宽比GPU内存带宽小10倍,你必须以某种方式通过慢速(和高延迟)PCIE从GPU获取数据总线。

带宽数量供参考: GeForce GTX 980:224 GB / s 桌面主板上的DDR4:大约25GB / s PCIe 16x:16GB / s

这并未考虑延迟。在实践中,对数据进行GPU计算任务太大而不适合GPU内存并且每次访问时必须通过PCIe进行传输对于大多数类型的计算来说都是如此慢,以至于在CPU上执行相同的计算会快得多

为什么在机器中安装NVIDIA显卡时会看到分配的内存类型?好问题。我可以想到几种可能性:

(a)您同时启用了NVIDIA和Intel图形驱动程序(例如,在两者上运行不同的显示时)。卸载Intel驱动程序和/或禁用BIOS和共享内存中的Intel HD图形将消失。

(b)NVIDIA正在使用它。这可以是例如额外的纹理存储器等。它也可以不是真实存储器而是仅对应于GPU存储器的存储器映射区域。查看NVIDIA驱动程序的高级设置,获取控制此设置的设置。

无论如何,不​​,Tensorflow可以使用任何东西。

答案 1 :(得分:1)

CUDA也可以使用RAM。在CUDA中,VRAM和RAM之间的共享内存称为统一内存。但是,由于性能原因,TensorFlow不允许这样做。

答案 2 :(得分:0)

嗯,这并不完全正确。您在降低批量大小方面是正确的,但这取决于您正在训练的模型类型。如果你训练 Xseg,它不会使用共享内存,但是当你进入 SAEHD 训练时,你可以在 CPU(而不是 GPU)上设置模型优化器以及你的学习丢失率,然后你就可以利用它共享内存用于这些优化,同时为您的模型分辨率和批量大小保存专用 GPU 内存。因此,共享内存似乎无用,但是使用您的设置,您会发现对于某些设置,这只是重新分配正确任务的问题。您将增加迭代时间,但您将以一种或另一种方式利用该共享内存。我必须进行大量实验才能找到适合我的 GPU 的方法,并且有一些令人惊讶的发现。这是一篇旧帖子,但我打赌你现在已经想通了,希望如此。