为什么TensorFlow在GTX 2060笔记本GPU上运行速度比CPU慢?
问题核心原因
当前训练场景的计算量过小,GPU的数据传输、初始化开销超过了并行计算带来的收益,因此出现GPU比CPU慢的情况,具体诱因和解决方法如下:
具体诱因
- 数据集规模太小:15MB的CSV对应的训练样本量不足,单批次计算量极低,CPU和GPU之间的内存到显存的数据传输耗时,盖过了GPU的并行计算收益。
- batch size设置过小:代码中
fit方法未指定batch size,Keras默认使用32的小batch,GPU并行核心无法被充分调用,大部分时间处于闲置状态。 - 模型计算量太低:整个网络仅包含4层小通道数的1D卷积+1层70单元的LSTM,总参数量极低,CPU本身就可以快速完成计算,不需要调用GPU。
- 额外IO开销占比高:训练时每个epoch都执行保存检查点、写CSV日志的操作,小数据集下单个epoch耗时极短,频繁的磁盘IO操作进一步拉高了总耗时。
- 注:你提供的代码中存在HTML转义字符
",实际运行时需要全部替换为普通双引号",否则会报语法错误。
优化方案
- 调大batch size:在
cnn.fit参数中添加batch_size=512(可根据GTX2060的6G显存调整到1024甚至更高,只要不出现OOM报错即可),减少数据传输次数,提升GPU利用率。 - 减少不必要的IO操作:调整ModelCheckpoint的保存频率,添加参数
save_freq=10,改为每10个epoch保存一次检查点,降低磁盘IO占比。 - 把数据提前加载到显存:预处理完成后,将
X_train、y_train、X_test、y_test转换为TensorFlow张量并预存到显存,避免每轮训练都重复从内存拷贝数据,示例代码如下:
import tensorflow as tf X_train = tf.convert_to_tensor(X_train, dtype=tf.float32) y_train = tf.convert_to_tensor(y_train, dtype=tf.float32) X_test = tf.convert_to_tensor(X_test, dtype=tf.float32) y_test = tf.convert_to_tensor(y_test, dtype=tf.float32)
- 确认环境配置正确:执行以下代码确认GPU被正确识别,且CUDA、cuDNN版本与TensorFlow版本匹配:
import tensorflow as tf print(tf.config.list_physical_devices('GPU'))
如果上述优化后速度仍不符合预期,由于当前任务的计算量极低,直接使用CPU训练反而性价比更高。GPU的性能优势只有在大数据集、大参数量模型、大batch的训练场景下才能充分发挥。
内容的提问来源于stack exchange,提问作者Radu Florin Tudorache
相关产品推荐
相关产品推荐

