我有一个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之前使用的。
答案 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本身可以处理),那么这将是预期的结果。