使用GPU训练tensorflow/keras模型,Memory-Usage占用高,GPU-Util利用率低。提升GPU-Util利用率,提升模型训练速度

目录

  • 如何使用 gpu 训练模型
  • 使用 nvidia-smi 指令查看 gpu 利用率
  • 提升 GPU-Util 利用率以及模型训练速度
  • 将任务管理器的 Copy 改为 Cuda

如何使用 gpu 训练模型

win11 系统,已安装 CUDA-11.2、cuDNN-8.1、tensorflow-gpu-2.6.0 以及 keras-2.6.0。但我在运行如下代码训练模型时,通过任务管理器看到 cpu 占用 20%左右,gpu 占用为0%。我以为此时仍是 cpu 在训练模型(其实安装好相互兼容的 CUDA、cuDNN、tensorflow-gpu、keras,代码会自动调用 gpu 训练模型,必须对任务管理器进行修改才能看到实际的 gpu 利用率)。

history = model.fit(
    train_generator,
    steps_per_epoch=100,
    epochs=30,
    validation_data=validation_generator,
    validation_steps=50)

我以为需要通过特殊设置才能让 gpu 训练模型,看到网上说要加上这两行代码,加上以后,cpu 和 gpu 利用率还是没变化(其实在只有一张显卡的机器上完全不用加下面的代码来指定gpu,多显卡机器才需要)。

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

使用 nvidia-smi 指令查看 gpu 利用率

接着,我在命令行使用 nvidia-smi 指令发现在程序未运行时,GPU-Util 为 0%,但在训练模型时,GPU-Util 为 26%,并且显存占用了 6800MB。所以就是 gpu 在训练模型呀,我以为又是这垃圾 win11 的 bug,导致任务管理器显示异常。
使用GPU训练tensorflow/keras模型,Memory-Usage占用高,GPU-Util利用率低。提升GPU-Util利用率,提升模型训练速度_第1张图片

提升 GPU-Util 利用率以及模型训练速度

不过,我还是不满意,显存占用那么高,为什么 gpu 利用率才 26% 呢?继续查询得知:

1. 可能是 gpu 很快就算完了,在等待 cpu 传输新的数据
2. 可以通过设置 workers(线程数)来增加数据预处理和数据传输的 cpu 个数,如下:

history = model.fit(
    train_generator,
    steps_per_epoch=100,
    epochs=30,
    validation_data=validation_generator,
    validation_steps=50,
    workers=4)

经过测试,gpu 利用率果然大幅提升,模型训练速度也大幅提升:

workers 训练时间
未设置 2分48秒
2 1分44秒
4 1分11秒
6 1分06秒
8 1分03秒

将任务管理器的 Copy 改为 Cuda

查询过程中意外发现了训练模型时,任务管理器始终显示 gpu 利用率很低的原因:

如果你已经正确安装了 CUDA/cuDNN,那么你需要做的就是在任务管理器的下拉菜单中更改副本 --> cuda,它将显示活动 cuda 核心的数量。GPU 的其他指标在运行 tf/keras 时不会激活,因为没有视频编码/解码等工作要做;它只是在 GPU 上使用 cuda 内核,因此跟踪 GPU 使用情况的唯一方法是查看 cuda 利用率(考虑从任务管理器进行监控时)
使用GPU训练tensorflow/keras模型,Memory-Usage占用高,GPU-Util利用率低。提升GPU-Util利用率,提升模型训练速度_第2张图片

参考:https://stackoverflow.com/questions/58289983/low-nvidia-gpu-usage-with-keras-and-tensorflow

如果你发现下拉菜单中没有 Cuda 选项,你需要在设置中把“硬件加速 GPU 计划”关掉并重启电脑。
使用GPU训练tensorflow/keras模型,Memory-Usage占用高,GPU-Util利用率低。提升GPU-Util利用率,提升模型训练速度_第3张图片

你可能感兴趣的:(tensorflow,keras,深度学习)