如何使用 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-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 利用率(考虑从任务管理器进行监控时)
参考:https://stackoverflow.com/questions/58289983/low-nvidia-gpu-usage-with-keras-and-tensorflow
如果你发现下拉菜单中没有 Cuda 选项,你需要在设置中把“硬件加速 GPU 计划”关掉并重启电脑。