Keras和Tensorflow中NVIDIA GPU使用率低

19
我正在使用 keras-gpu 和 tensorflow-gpu 运行一个卷积神经网络,使用的是 NVIDIA GeForce RTX 2080 Ti,在 Windows 10 上运行。我的电脑配备了 Intel Xeon e5-2683 v4 CPU(2.1 GHz)。我通过 Jupyter(最新的 Anaconda 发行版)运行代码。命令终端中的输出显示 GPU 正在被利用,但我运行的脚本需要比预期更长的时间来训练/测试数据,并且当我打开任务管理器时,GPU 利用率非常低。这里有一张图片:enter image description here
请注意,CPU 没有被利用,任务管理器中没有任何其他东西表明有任何东西被充分利用。我没有以太网连接,而是连接到 Wifi(不认为这会影响任何事情,但由于 Jupyter 是通过 Web 浏览器运行的,我不确定)。我正在对大量数据(~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。过去我曾尝试使用CUDA运行tensorflow-gpu(虽然已经两年多没用过,也许最新版本更容易),这就是我使用这种安装方法的原因。
这可能是GPU没有被充分利用的主要原因吗(没有CuDNN/CUDA)?这是否与专用GPU内存使用成为瓶颈有关?或者可能与我使用的网络结构(参数数量等)有关吗?
如果您需要更多有关我的系统或正在运行代码/数据的信息来帮助诊断,请告诉我。先感谢您!
编辑:我在任务管理器中注意到一些有趣的东西。批量大小为10,000的时代需要大约200秒的时间。在每个时代的最后约5秒钟内,GPU使用率增加到约15-17%(从每个时代的前195秒内的约6-7%增加)。不确定这是否有帮助或者除GPU之外是否存在瓶颈。

2
如果未安装CUDA,则TensorFlow根本不会使用GPU。 GPU使用需要CUDA。 - Dr. Snoopy
@楼主请采纳最佳答案。 - Taylr Cawte
6个回答

16

如果您想充分利用tensorflow的GPU,那么您肯定需要安装CUDA / Cudnn。您可以通过使用以下方式来双重检查这些软件包是否已正确安装并且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核心的数量。当运行tf / keras时,GPU的其他指示灯将不会处于活动状态,因为没有视频编码/解码等需要完成; 它只是使用GPU上的cuda核心,因此从任务管理器监视GPU使用情况的唯一方法是查看cuda利用率。

task manager


2
如果我的Cuda使用率为90%,但GPU使用率只有6%,这是怎么可能的? - Rodrigo Ruiz
2
CUDA是一种并行计算平台,允许使用GPU进行通用处理。任务管理器中的GPU“选项卡”显示GPU用于图形处理而非通用处理的使用情况。由于没有进行图形处理,任务管理器认为整体GPU使用率较低,通过切换到CUDA下拉菜单,您可以看到大多数核心将被利用(如果tf/keras正确安装)。 - Taylr Cawte
谢谢!如果我的Cuda图表显示90%,那么意味着我的GPU正在全力进行网络训练吗? - Rodrigo Ruiz
@RodrigoRuiz 这意味着你的90% CUDA核心正在被使用;如果你正在训练你的网络,那么它很可能是全职工作! - Taylr Cawte
3
我之前错误地认为我的GPU没有被利用,因为我的"Cuda"下拉菜单被隐藏了(被"Copy"代替)。谢谢你澄清这个问题。 - Mike McCartin

5

我建议先运行其中一个简短的“测试”来确保Tensorflow正在使用GPU。例如,我更喜欢在该链接问题中@Salvador Dali的答案。

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驱动程序的安装而安装。在Windows系统上,它位于
C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe

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

nvidia-smi.exe -l 3

这将显示一个屏幕,每三秒更新一次。

enter image description here

这里我们可以看到关于GPU状态和它们正在做的各种信息。在这种情况下,特别感兴趣的是“功率:使用/容量”和“易失性GPU-Util”列。如果您的模型确实在使用GPU,则这些列应该在开始训练模型后“立即”增加。
除非您有非常好的冷却解决方案,否则您很可能会看到风扇速度和温度的增加。在打印输出的底部,您还应该看到一个名为“python”或“Jupityr”的进程在运行。
如果这不能解释训练速度缓慢的原因,那么我认为问题在于模型和代码本身。我认为实际情况就是如此。具体来说,查看Windows任务管理器中“专用GPU内存使用情况”的列表,其基本上已经达到了最大值。

3

3
如果您已经尝试过@KDecker和@OverLordGoldDragon的解决方案,但GPU使用率仍然很低,我建议首先调查您的数据管道。以下两个图来自TensorFlow官方指南数据性能,它们很好地说明了数据管道如何影响GPU效率。

enter image description here

enter image description here

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

参考Tensorpack,它有详细的教程,可以教您如何加速输入数据管道。


2
一切都按预期工作;您的专用内存使用率几乎达到最大值,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时暂时访问共享内存资源,但不确定,也可能有其他原因。

0

谢谢,但我想我的问题归根结底是,如果我没有安装CUDA或CuDNN,GPU会自动停用/变慢吗(我无法在任何地方找到一个确定的答案)? GPU正在被Keras和TensorFlow使用,我只是不确定为什么它没有被充分/正确地使用。 - A. LaBella
尝试使用PyTorch运行不同的模型。 - maddy23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接