Tensorflow如何利用100%的GPU内存?

时间:2019-07-11 17:43:39

标签: python tensorflow

我有一个32Gb的图形卡,启动脚本后,我看到:

2019-07-11 01:26:19.985367: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 95.16G (102174818304 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:19.988090: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 85.64G (91957338112 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:19.990806: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 77.08G (82761605120 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:19.993527: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 69.37G (74485440512 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:19.996219: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 62.43G (67036893184 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:19.998911: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 56.19G (60333203456 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:20.001601: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 50.57G (54299881472 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:20.004296: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 45.51G (48869892096 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:20.006981: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 40.96G (43982901248 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:20.009660: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 36.87G (39584608256 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
2019-07-11 01:26:20.012341: E tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 33.18G (35626147840 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY

之后,TF会使用我96%的内存来解决。然后,当内存不足时,它将尝试分配65G

tensorflow/stream_executor/cuda/cuda_driver.cc:936] failed to allocate 65.30G (70111285248 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY

我的问题是,剩下的1300MB(0.04 * 32480)怎么办?我不介意在运行OOM之前使用它们。

如何使TF使用99.9%的内存而不是96%?

更新:nvidia-smi输出

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.40.04    Driver Version: 418.40.04    CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:00:16.0 Off |                    0 |
| N/A   66C    P0   293W / 300W |  31274MiB / 32480MiB |    100%      Default |

我要问的是这些1205MB(31274MiB-32480MiB)仍未使用。也许它们存在是有原因的,也许它们只是在OOM之前使用的。

2 个答案:

答案 0 :(得分:4)

监视GPU并不像监视CPU那样简单。 正在执行许多并行过程,这些过程可能会为您的GPU创建一个bottleneck

可能存在各种问题,例如:
1.读取/写入数据的速度
2. CPU或磁盘正在造成瓶颈

但是我认为使用96%是很正常的。更不用说nvidia-smi仅显示一个特定实例。

您可以安装gpustat并将其用于实时监控GPU(在OOM过程中应达到100%)

pip install gpustat

gpustat -i

你能做什么?
1.您可以使用data_iterator来更快地并行处理数据。
2.增加批次大小。 (我认为在您遇到OOM时,这种方法对您来说不起作用)
3.您可以超频GPU(不推荐)

Here是一篇不错的关于硬件加速的文章。

答案 1 :(得分:0)

当我使用Tensorflow训练模型时,得到的利用率大致相同。在我的情况下,原因很明显,我是手动选择一个随机样本批次,然后分别为每个批次调用优化。

这意味着每批数据都在主内存中,然后将其复制到模型其余部分所在的GPU内存中,然后在gpu中执行向前/向后传播和更新,然后将执行交还给我的代码我在这里抓取另一批并对其进行优化。

如果您花几个小时设置Tensorflow来从预先准备的TF记录中并行进行批量加载,则有一种更快的方法。

我意识到您可能会或可能不会在keras下使用tensorflow,但是由于我的经验往往会产生非常相似的利用率数字,因此我建议通过这些关联得出一个合理的可能因果关系,这让我大吃一惊。如果您的框架将每个批次从主内存加载到GPU中,却没有提高异步加载的效率/复杂度(GPU本身可以处理),那么这将是预期的结果。