Keras训练简单全连接层时GPU/CPU负载过低问题咨询
分析与解决方案:GPU/CPU负载低的原因及验证方法
看起来你的问题核心是明明TensorFlow已经正确识别并启用了RTX 2080 GPU,但训练简单Dense模型时GPU和CPU负载始终偏低,想确认是否达到了GPU的性能上限对吧?咱们一步步拆解问题:
一、先确认基础状态:GPU确实在工作
从你提供的print(device_lib.list_local_devices())输出可以明确:
- TensorFlow成功识别了GeForce RTX 2080,并且创建了对应的GPU设备(/device:GPU:0),分配了约6GB显存
- 训练时模型确实会跑在GPU上,这点不用怀疑
二、为什么负载会低?核心原因是「任务太轻」
你的场景完全属于大GPU跑小任务,导致GPU的计算能力没被充分激活,具体体现在这几个方面:
- 数据集规模太小:只有1万条数据、4个特征,GPU擅长并行处理海量数据,这点数据量一轮迭代瞬间就能完成,GPU还没来得及拉高负载就进入下一轮了
- 模型计算量不足:你的模型虽然有多层Dense,但每层的神经元数量(88=64、168=128)太少,总参数规模很小,对于RTX 2080这种级别的GPU来说,计算压力几乎可以忽略
- Batch Size太小:当前用的
batch_size=64,GPU的并行计算单元需要足够多的数据才能填满,小batch会导致大部分计算单元处于闲置状态,数据传输的开销占比反而更高
三、如何验证是否达到GPU性能上限?
你可以通过以下操作来测试:
- 增大模型规模:把
num_p从8改成64甚至128,或者增加更多的Dense层,让模型的计算量大幅提升,观察GPU负载是否上升 - 逐步提高Batch Size:尝试把batch_size调到256、512、1024(直到出现显存不足OOM报错为止),更大的batch能让GPU的并行计算单元充分工作,负载会明显拉高
- 实时监控GPU状态:
- Linux/macOS可以在终端执行
nvidia-smi命令(或者watch -n 1 nvidia-smi实时刷新),查看GPU使用率和显存占用率 - Windows可以打开NVIDIA控制面板的「任务管理器-性能-GPU」页面监控
如果显存没占满、使用率持续偏低,说明确实是任务太轻,还没到GPU的性能上限
- Linux/macOS可以在终端执行
四、额外的小优化建议
- 充分利用tf.data管道:你已经写了tf.data的处理代码,但
model.fit时还是用的原始数组,建议改成:
虽然小数据集下影响不大,但能更好地利用TensorFlow的数据预处理优化,也为以后处理大数据集打好基础his = model.fit( dataset, steps_per_epoch=len(X_train_scaled)//batch_size, epochs=10000, verbose=0, validation_split=0.2, callbacks=[es] ) - 忽略CPU指令提示:日志里的「AVX AVX2」提示是说TensorFlow编译时没用到CPU的高级指令,但你用GPU训练的话,这个对性能几乎没有影响,完全可以忽略
内容的提问来源于stack exchange,提问作者AutomaKen




