将共享 GPU 内存与 TensorFlow 一起使用?
Use shared GPU memory with TensorFlow?
所以我在 Windows 10 机器上安装了 TensorFlow 的 GPU 版本,上面有 GeForce GTX 980
显卡。
诚然,我对显卡知之甚少,但根据dxdiag的说法,它确实有:
4060MB
专用内存 (VRAM) 和;
8163MB
共享内存
总共约 12224MB
.
不过,我注意到这个 "shared" 内存似乎几乎没有用。当我开始训练模型时,VRAM 将填满,如果内存需求超过 4GB
,TensorFlow 将崩溃并显示 "resource exhausted" 错误消息。
当然,我可以通过选择适当低的批量大小来防止达到这一点,但我想知道是否有办法利用这些 "extra" 8GB
RAM,或者如果是这样,TensorFlow 需要专用内存。
共享内存是为图形保留的主系统 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 倍左右, 和 你必须以某种方式在缓慢(和高延迟)的情况下将数据传入和传出 GPU PCIE总线。
供参考的带宽数字:
GeForce GTX 980:224 GB/s
台式机主板上的 DDR4:大约 25GB/s
PCIe 16x:16GB/s
这没有考虑延迟。在实践中,运行 GPU 计算任务处理的数据太大而无法放入 GPU 内存并且每次访问时都必须通过 PCIe 传输,对于大多数类型的计算来说速度太慢以至于在 CPU 会快很多。
当你的机器上有 NVIDIA 卡时,为什么会看到分配这种内存?好问题。我可以想到几种可能性:
(a) 您同时启用了 NVIDIA 和 Intel 图形驱动程序(例如,当 运行 两者的显示器不同时会发生这种情况)。卸载 Intel 驱动程序 and/or 在 BIOS 中禁用 Intel 高清显卡,共享内存将消失。
(b) NVIDIA 正在使用它。这可能是额外的纹理内存等。它也可能不是真正的内存,而只是对应于 GPU 内存的内存映射区域。在 NVIDIA 驱动程序的高级设置中查找控制此设置的设置。
无论如何,不,没有任何Tensorflow可以使用的东西。
CUDA 也可以使用 RAM。在 CUDA 中,VRAM 和 RAM 之间的共享内存称为统一内存。但是,由于性能原因,TensorFlow 不允许这样做。
嗯,这不完全正确。就降低批量大小而言,你是对的,但这取决于你训练的模型类型。如果你训练 Xseg,它不会使用共享内存,但是当你进入 SAEHD 训练时,你可以在 CPU(而不是 GPU)上设置你的模型优化器以及你的学习辍学率,这会让你利用共享内存进行这些优化,同时为您的模型分辨率和批量大小节省专用 GPU 内存。所以看起来共享内存似乎毫无用处,但尝试一下您的设置,您会发现对于某些设置,这只是重新分配正确任务的问题。您将增加迭代时间,但您将以一种或另一种方式利用该共享内存。我必须进行大量实验才能找到适合我的 GPU 的方法,并且有一些令人惊讶的发现。这是一个旧的 post 但我敢打赌你现在已经弄明白了,希望如此。
我遇到了同样的问题。我的 vram 是 6gb 但只检测到 4gb。我读了一段关于 tensorflow 限制 gpu 内存的代码,然后我尝试了这段代码,但它有效:
#Setting gpu for limit memory
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
#Restrict Tensorflow to only allocate 6gb of memory on the first GPU
try:
tf.config.experimental.set_virtual_device_configuration(gpus[0],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=6144)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
#virtual devices must be set before GPUs have been initialized
print(e)
注意:如果你有 10gb 显存,那么尝试分配 10240 的内存限制。
所以我在 Windows 10 机器上安装了 TensorFlow 的 GPU 版本,上面有 GeForce GTX 980
显卡。
诚然,我对显卡知之甚少,但根据dxdiag的说法,它确实有:
4060MB
专用内存 (VRAM) 和;
8163MB
共享内存
总共约 12224MB
.
不过,我注意到这个 "shared" 内存似乎几乎没有用。当我开始训练模型时,VRAM 将填满,如果内存需求超过 4GB
,TensorFlow 将崩溃并显示 "resource exhausted" 错误消息。
当然,我可以通过选择适当低的批量大小来防止达到这一点,但我想知道是否有办法利用这些 "extra" 8GB
RAM,或者如果是这样,TensorFlow 需要专用内存。
共享内存是为图形保留的主系统 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 倍左右, 和 你必须以某种方式在缓慢(和高延迟)的情况下将数据传入和传出 GPU PCIE总线。
供参考的带宽数字: GeForce GTX 980:224 GB/s 台式机主板上的 DDR4:大约 25GB/s PCIe 16x:16GB/s
这没有考虑延迟。在实践中,运行 GPU 计算任务处理的数据太大而无法放入 GPU 内存并且每次访问时都必须通过 PCIe 传输,对于大多数类型的计算来说速度太慢以至于在 CPU 会快很多。
当你的机器上有 NVIDIA 卡时,为什么会看到分配这种内存?好问题。我可以想到几种可能性:
(a) 您同时启用了 NVIDIA 和 Intel 图形驱动程序(例如,当 运行 两者的显示器不同时会发生这种情况)。卸载 Intel 驱动程序 and/or 在 BIOS 中禁用 Intel 高清显卡,共享内存将消失。
(b) NVIDIA 正在使用它。这可能是额外的纹理内存等。它也可能不是真正的内存,而只是对应于 GPU 内存的内存映射区域。在 NVIDIA 驱动程序的高级设置中查找控制此设置的设置。
无论如何,不,没有任何Tensorflow可以使用的东西。
CUDA 也可以使用 RAM。在 CUDA 中,VRAM 和 RAM 之间的共享内存称为统一内存。但是,由于性能原因,TensorFlow 不允许这样做。
嗯,这不完全正确。就降低批量大小而言,你是对的,但这取决于你训练的模型类型。如果你训练 Xseg,它不会使用共享内存,但是当你进入 SAEHD 训练时,你可以在 CPU(而不是 GPU)上设置你的模型优化器以及你的学习辍学率,这会让你利用共享内存进行这些优化,同时为您的模型分辨率和批量大小节省专用 GPU 内存。所以看起来共享内存似乎毫无用处,但尝试一下您的设置,您会发现对于某些设置,这只是重新分配正确任务的问题。您将增加迭代时间,但您将以一种或另一种方式利用该共享内存。我必须进行大量实验才能找到适合我的 GPU 的方法,并且有一些令人惊讶的发现。这是一个旧的 post 但我敢打赌你现在已经弄明白了,希望如此。
我遇到了同样的问题。我的 vram 是 6gb 但只检测到 4gb。我读了一段关于 tensorflow 限制 gpu 内存的代码,然后我尝试了这段代码,但它有效:
#Setting gpu for limit memory
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
#Restrict Tensorflow to only allocate 6gb of memory on the first GPU
try:
tf.config.experimental.set_virtual_device_configuration(gpus[0],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=6144)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
#virtual devices must be set before GPUs have been initialized
print(e)
注意:如果你有 10gb 显存,那么尝试分配 10240 的内存限制。