使用 Keras 和 Tensorflow 降低 NVIDIA GPU 使用率
Posted
技术标签:
【中文标题】使用 Keras 和 Tensorflow 降低 NVIDIA GPU 使用率【英文标题】:Low NVIDIA GPU Usage with Keras and Tensorflow 【发布时间】:2020-02-05 22:55:21 【问题描述】:我在 Windows 10 上使用 keras-gpu 和 tensorflow-gpu 和 NVIDIA GeForce RTX 2080 Ti 运行 CNN。我的计算机有 Intel Xeon e5-2683 v4 CPU (2.1 GHz)。我正在通过 Jupyter(最新的 Anaconda 发行版)运行我的代码。命令终端中的输出显示正在使用 GPU,但是我正在运行的脚本花费的时间比我预期的训练/测试数据的时间要长,当我打开任务管理器时,看起来 GPU 利用率非常低。这是一张图片:
请注意,CPU 没有被利用,任务管理器上没有其他任何东西表明任何东西都被充分利用了。我没有以太网连接并且已连接到 Wifi(不认为这会产生任何影响,但我不确定 Jupyter,因为它通过网络浏览器运行)。我正在训练大量数据(~128GB),这些数据全部加载到 RAM(512GB)中。我正在运行的模型是一个完全卷积神经网络(基本上是一个 U-Net 架构),具有 566,290 个可训练参数。到目前为止我尝试过的事情: 1. 将批量大小从 20 增加到 10,000(将 GPU 使用率从 ~3-4% 增加到 ~6-7%,如预期的那样大大减少了训练时间)。 2.将use_multiprocessing设置为True,增加model.fit中worker的数量(无效)。
我按照这个网站上的安装步骤:https://www.pugetsystems.com/labs/hpc/The-Best-Way-to-Install-TensorFlow-with-GPU-Support-on-Windows-10-Without-Installing-CUDA-1187/#look-at-the-job-run-with-tensorboard
请注意,此安装专门不安装 CuDNN 或 CUDA。过去我在让 tensorflow-gpu 与 CUDA 一起运行时遇到了麻烦(尽管我已经 2 年多没有尝试过了,所以使用最新版本可能更容易),这就是我使用这种安装方法的原因。
这很可能是 GPU 没有得到充分利用(没有 CuDNN/CUDA)的原因吗?它是否与专用 GPU 内存使用成为瓶颈有关?或者可能与我正在使用的网络架构(参数数量等)有关?
如果您需要有关我的系统或我正在运行的代码/数据的更多信息以帮助诊断,请告诉我。提前致谢!
编辑:我注意到任务管理器中有一些有趣的东西。批量大小为 10,000 的 epoch 大约需要 200 秒。对于每个 epoch 的最后约 5 秒,GPU 使用率增加到约 15-17%(从每个 epoch 的前 195 秒的约 6-7% 上升)。不确定这是否有帮助或表明 GPU 之外的某个地方存在瓶颈。
【问题讨论】:
如果没有安装 CUDA,那么 tensorflow 根本没有使用 GPU。使用 GPU 需要 CUDA。 【参考方案1】:您肯定需要安装 CUDA/Cudnn 才能充分利用 GPU 和 tensorflow。您可以仔细检查软件包是否安装正确,以及 GPU 是否可用于 tensorflow/keras 使用
import tensorflow as tf
tf.config.list_physical_devices("GPU")
输出应该类似于[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
如果设备可用。
如果您已经正确安装了 CUDA/Cudnn,那么您需要做的就是在任务管理器的下拉菜单中更改副本 --> cuda,这将显示活动 cuda 核心的数量。 GPU 的其他指标在运行 tf/keras 时不会激活,因为没有视频编码/解码等工作要做;它只是在 GPU 上使用 cuda 内核,因此跟踪 GPU 使用情况的唯一方法是查看 cuda 利用率(考虑从任务管理器进行监控时)
【讨论】:
如果我的 Cuda 为 90% 但我的 GPU 为 6% 怎么办?这怎么可能? @RodrigoRuiz CUDA 是一个并行计算平台,允许使用 GPU 进行通用处理。任务管理器中的 GPU“选项卡”显示 GPU 用于图形处理,而不是一般处理。由于没有进行图形处理,任务管理器认为整体 GPU 使用率很低,通过切换到 CUDA 下拉菜单,您可以看到您的大部分内核将被使用(如果 tf/keras 安装正确)。 谢谢!那么,如果我的 Cuda 图表显示 90% 表示我的 GPU 正在全职工作于我的网络训练? @RodrigoRuiz 这意味着你 90% 的 cuda 核心正在被使用;如果您正在训练您的网络,这可能意味着它正在全职工作! 我误以为我的 GPU 没有被使用,因为我的“Cuda”下拉菜单被隐藏了(用“Copy”代替)。感谢您解决这个问题。【参考方案2】:我首先会运行 short "tests" 之一,以确保 Tensorflow 正在利用 GPU。例如,我更喜欢 @Salvador Dali's 在该链接问题中的答案
import tensorflow as tf
with tf.device('/gpu:0'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
with tf.Session() as sess:
print (sess.run(c))
如果 Tensorflow 确实在使用您的 GPU,您应该会看到打印的矩阵乘法结果。否则,一个相当长的堆栈跟踪表明无法找到“gpu:0
”。
如果一切正常,我建议使用 Nvidia 的 smi.exe
实用程序。它在 Windows 和 Linux 上都可用,AFAIK 与 Nvidia 驱动程序一起安装。在 Windows 系统上,它位于
C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe
打开 Windows 命令提示符并导航到该目录。然后运行
nvidia-smi.exe -l 3
这将显示一个像这样的屏幕,每三秒更新一次。
在这里,我们可以看到有关 GPU 状态以及它们正在做什么的各种信息。在这种情况下,特别感兴趣的是“Pwr:Usage/Cap”和“Volatile GPU-Util”列。如果您的模型确实在使用/a GPU,那么一旦您开始训练模型,这些列应该会“立即”增加。
除非您有非常好的冷却解决方案,否则您很可能会看到风扇速度和温度的增加。在打印输出的底部,您还应该看到一个名称类似于“python”或“Jupityr”的进程正在运行。
如果这未能提供关于训练时间缓慢的答案,那么我推测问题在于模型和代码本身。我认为它实际上就是这种情况。专门查看 Windows 任务管理器列表中的“专用 GPU 内存使用”基本上是最大的 ping。
【讨论】:
【参考方案3】:一切都按预期进行;您的专用内存使用量几乎达到最大值,TensorFlow 和 CUDA 都不能使用共享内存——请参阅 this answer。
如果您的 GPU 运行 OOM,唯一的补救措施是获得具有更多专用内存的 GPU,或减小模型大小,或使用以下脚本来防止 TensorFlow 将冗余资源分配给 GPU(它确实倾向于这样做):
## LIMIT GPU USAGE
config = tf.ConfigProto()
config.gpu_options.allow_growth = True # don't pre-allocate memory; allocate as-needed
config.gpu_options.per_process_gpu_memory_fraction = 0.95 # limit memory to be allocated
K.tensorflow_backend.set_session(tf.Session(config=config)) # create sess w/ above settings
您观察到的异常增加的使用量可能是由于其他可用资源耗尽而临时访问的共享内存资源,尤其是use_multiprocessing=True
- 但不确定,可能是其他原因
【讨论】:
【参考方案4】:如果您尝试过@KDecker 和@OverLordGoldDragon 的解决方案,GPU 使用率仍然很低,我建议您首先调查您的数据管道。下面两张图来自于tensorflow官方指南data performance,很好的说明了数据流水线对GPU效率的影响。
如您所见,在训练的同时准备数据会增加 GPU 的使用率。在这种情况下,CPU 处理正在成为瓶颈。你需要找到一种机制来隐藏预处理的延迟,比如改变进程的数量、黄油的大小等。CPU的效率应该与GPU的效率相匹配。这样,GPU 将被最大限度地利用。
看看Tensorpack,它有关于如何加快输入数据管道的详细教程。
【讨论】:
【参考方案5】:您引用的安装方法似乎发生了变化:https://www.pugetsystems.com/labs/hpc/The-Best-Way-to-Install-TensorFlow-with-GPU-Support-on-Windows-10-Without-Installing-CUDA-1187 现在更容易了,应该可以消除您遇到的问题。
重要编辑您似乎没有在查看 GPU 的实际计算,请查看附图:
【讨论】:
【参考方案6】:阅读以下两页,您将了解如何正确设置 GPU https://medium.com/@kegui/how-do-i-know-i-am-running-keras-model-on-gpu-a9cdcc24f986
https://datascience.stackexchange.com/questions/41956/how-to-make-my-neural-netwok-run-on-gpu-instead-of-cpu
【讨论】:
谢谢,但我想我的问题可能归结为,如果我没有安装 CUDA 或 CuDNN(我无法在任何地方都能找到可靠的答案)? keras 和 tensorflow 正在使用 GPU,我只是不确定为什么它没有被完全/正确使用。 尝试使用 pytorch 运行不同的模型,以上是关于使用 Keras 和 Tensorflow 降低 NVIDIA GPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章
Keras 2.0.7 版发布,诸多改进将强化TensorFlow的开发能力
Tensorflow 2.0 Keras 的训练速度比 2.0 Estimator 慢 4 倍
keras与tensorflow.python.keras - 使用哪一个?
keras 与 tensorflow.python.keras - 使用哪一个?