我有一个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
Run Code Online (Sandbox Code Playgroud)
之后,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
Run Code Online (Sandbox Code Playgroud)
我的问题是,剩下的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 |
Run Code Online (Sandbox Code Playgroud)
我要问这些未使用的1205MB(31274MiB-32480MiB)。也许它们存在是有原因的,也许它们是在OOM之前使用的。
监控GPU不像监控CPU那么简单。有许多并行进程正在进行,可以bottleneck
为您的 GPU创建一个。
可能存在各种问题,例如:
1. 数据的读/写速度
2. CPU 或磁盘导致瓶颈
但我认为使用 96% 是很正常的。更不用说 nvidia-smi 仅显示一个特定实例。
您可以安装gpustat
并使用它来实时监控 GPU(在 OOM 期间您应该达到 100%)
pip install gpustat
gpustat -i
Run Code Online (Sandbox Code Playgroud)
你能做什么 ?
1. 您可以使用data_iterator更快地并行处理数据。
2. 增加批量大小。(我不认为这在你的情况下会奏效OOM
)
3. 你可以超频 GPU(不推荐)
这是一篇关于硬件加速的好文章。
小智 0
当我使用 Tensorflow 训练模型时,我得到了相同的利用率。在我的例子中,原因很清楚,我手动选择一批随机样本并分别调用每批样本的优化。
这意味着每批数据都位于主内存中,然后将其复制到模型其余部分所在的 GPU 内存中,然后在 GPU 中执行前向/反向传播和更新,然后将执行交回给我抓取的代码另一个批次并对其进行优化。
如果您花几个小时设置 Tensorflow 以从预先准备的 TF 记录并行批量加载,则有一种更快的方法。
我意识到您可能会或可能不会在 keras 下使用张量流,但由于我的经验往往会产生非常相似的利用率数字,因此我建议从这些相关性中得出合理可能的因果关系,这是冒险的。如果您的框架将每个批次从主内存加载到 GPU 中,而没有增加异步加载的效率/复杂性(GPU 本身可以处理),那么这将是预期的结果。
归档时间: |
|
查看次数: |
409 次 |
最近记录: |