在 TensorFlow 中使用共享 GPU 内存?

Posted

技术标签:

【中文标题】在 TensorFlow 中使用共享 GPU 内存?【英文标题】:Use shared GPU memory with TensorFlow? 【发布时间】:2018-05-31 07:00:20 【问题描述】:

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

诚然,我对显卡知之甚少,但根据 dxdiag 的说法,它确实有:

4060MB 的专用内存 (VRAM) 和;

8163MB 共享内存

总共约12224MB

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

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

【问题讨论】:

【参考方案1】:

共享内存是主系统 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/秒 台式机主板上的 DDR4:约 25GB/s PCIe 16x:16GB/s

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

当您的机器中有 NVIDIA 卡时,为什么会看到这种内存被分配?好问题。我能想到几种可能性:

(a) 您同时激活了 NVIDIA 和 Intel 图形驱动程序(例如,在两者上运行不同的显示器时会发生这种情况)。在 Bios 中卸载 Intel 驱动程序和/或禁用 Intel HD 显卡,共享内存将消失。

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

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

【讨论】:

由于 GPU 不使用“共享图形内存”,因此与 GPU 相关的术语“共享内存”用于流式多处理器 (devblogs.nvidia.com/using-shared-memory-cuda-cc) 的片上高速缓存,导致我的回答有些混乱.. @BlueSun 不用担心! 当我运行一个用完专用 GPU 内存的 TF 作业,并打印一条错误消息说它不是致命的,然后它使用共享 GPU 内存。这是如何运作的?有关来自另一张海报的图片,请参阅***.com/questions/48492079/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于在 TensorFlow 中使用共享 GPU 内存?的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow 在 GPU 内存上存储训练数据

如何防止 Tensorflow 在使用 Eager Execution 时分配全部 GPU 内存?

tensorflow-gpu 使用的常见错误

为啥带有 TensorFlow 的 Keras 没有使用所有 GPU 内存

Tensorflow 耗尽 GPU 内存:分配器 (GPU_0_bfc) 尝试分配内存不足

在GPU上运行时使用TensorFlow内存:为什么看起来并非所有内存都被使用?