Keras和Tensorflow降低了NVIDIA GPU的使用率

时间:2019-10-08 15:56:07

标签: tensorflow keras gpu

我正在Windows 10上运行带有keras-gpu和tensorflow-gpu的CNN和NVIDIA GeForce RTX 2080 Ti,我的计算机具有Intel Xeon e5-2683 v4 CPU(2.1 GHz)。我正在通过Jupyter(最新的Anaconda发行版)运行代码。命令终端上的输出显示正在使用GPU,但是我正在运行的脚本花费的时间比我预期的要对数据进行训练/测试的时间长,并且当我打开任务管理器时,看来GPU的利用率很低。这是一张图片:enter image description here

请注意,未使用CPU,任务管理器上的其他内容均未显示任何东西已被充分利用。我没有以太网连接,并且已连接到Wifi(不要认为这会产生任何影响,但我不确定Jupyter,因为它通过网络浏览器运行)。我正在训练很多数据(〜128GB),这些数据都已加载到RAM(512GB)中。我正在运行的模型是具有566,290个可训练参数的全卷积神经网络(基本上是U-Net架构)。到目前为止,我尝试过的事情: 1.将批次大小从20增加到10,000(将GPU使用率从3-4%增加到6-7%,如预期的那样大大减少了培训时间)。 2.将use_multiprocessing设置为True并增加model.fit中的工作程序数量(无效)。

我按照以下网站上的安装步骤操作: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一起运行时遇到了麻烦(尽管我已经两年没有尝试过,所以使用最新版本可能会更容易),这就是为什么我使用了这种安装方法。

这很可能是GPU未得到充分利用(没有CuDNN / CUDA)的原因吗?它是否与专用GPU内存使用成为瓶颈有关?还是与我使用的网络架构有关(参数数量等)?

如果您需要有关我的系统或我正在运行以帮助诊断的代码/数据的更多信息,请告诉我。预先感谢!

编辑:我注意到任务管理器中有一些有趣的事情。批量为10,000个的时代大约需要200 s。在每个时期的最后〜5s,GPU使用率增加到〜15-17%(从每个时期的前195s的〜6-7%增长)。不知道这是否有助于或表明GPU之外还有瓶颈。

6 个答案:

答案 0 :(得分:4)

您肯定需要安装 CUDA/Cudnn 才能通过 tensorflow 充分利用 GPU。您可以使用

仔细检查软件包是否安装正确以及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 利用率(考虑从任务管理器进行监控时)

task manager

答案 1 :(得分:1)

一切正常。您的专用内存使用率已接近最高,并且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时-但不确定的可能是其他原因

答案 2 :(得分:1)

您所引用的安装方法似乎有所更改:https://www.pugetsystems.com/labs/hpc/The-Best-Way-to-Install-TensorFlow-with-GPU-Support-on-Windows-10-Without-Installing-CUDA-1187 现在,它变得容易得多,并且应该消除您遇到的问题。

重要编辑:您似乎并没有查看GPU的实际计算,而是查看了所附的图片: enter image description here

答案 3 :(得分:0)

答案 4 :(得分:0)

我首先要运行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上均可用,并且通过Nvidia驱动程序进行AFAIK安装。在Windows系统上,它位于

C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe

打开Windows命令提示符并导航到该目录。然后运行

nvidia-smi.exe -l 3

这将向您显示一个这样的屏幕,该屏幕每三秒钟更新一次。

enter image description here

在这里,我们可以看到有关GPU状态及其运行方式的各种信息。在这种情况下,特别感兴趣的是“ Pwr:使用情况/上限”和“ Volatile GPU-Util”列。如果您的模型确实在使用GPU,那么一旦您开始训练模型,这些列就会“立即”增加。

除非您有非常好的散热解决方案,否则您很可能会看到风扇速度和温度升高。在打印输出的底部,您还将看到一个名称类似于“ python”或“ Jupityr”的进程正在运行。


如果这不能提供有关训练时间慢的答案,那么我认为问题在于模型和代码本身。我认为实际上就是这种情况。专门查看Windows任务管理器列表中的“专用GPU内存使用情况”,基本上以最大速度ping通。

答案 5 :(得分:0)

如果您尝试过@KDecker和@OverLordGoldDragon的解决方案,那么GPU使用率仍然很低,我建议您首先调查您的数据管道。以下两个数字来自tensorflow官方指南data performance,它们很好地说明了数据管道将如何影响GPU效率。

enter image description here

enter image description here

如您所见,与训练并行准备数据将增加GPU使用率。在这种情况下,CPU处理将成为瓶颈。您需要找到一种机制来隐藏预处理的延迟,例如更改进程数,黄油的大小等。CPU的效率应与GPU的效率相匹配。这样,将最大程度地利用GPU。

看看Tensorpack,其中有有关如何加快输入数据管道速度的详细教程。