为何NVIDIA Quadro P4000训练LSTM模型比旧AMD Athlon X4 760K更慢?
这种反直觉的情况其实挺常见的,我来帮你梳理几个核心原因:
数据传输瓶颈:你的输入数据体积高达3.5GB,如果数据预处理在CPU完成后,每次迭代都要把数据从CPU内存拷贝到GPU显存,这个传输耗时可能远远盖过GPU计算节省的时间。要是你的数据加载 pipeline 没做优化(比如没使用
tf.data.Dataset做预取、并行加载),CPU喂数据的速度跟不上GPU,就会导致GPU大部分时间处于闲置等待状态。GPU利用率不足:Quadro P4000虽是专业显卡,但你的模型是多个小型LSTM层加少量Dense层,这类模型的计算量可能没触达GPU的“性能甜点”。LSTM的并行性远不如卷积层,要是batch size设置得很小,GPU的多核心优势根本发挥不出来。反观你的AMD Athlon X4 760K,虽然是老CPU,但处理小批量序列任务时,少线程就能高效完成,反而没有GPU的额外启动和调度开销。
TensorFlow版本与GPU配置不匹配:从日志的2018年时间点来看,当时TensorFlow对GPU上LSTM的优化还不够成熟(比如CuDNN加速的LSTM可能没默认开启)。另外,如果你的GPU驱动、CUDA/CuDNN版本和TensorFlow版本不兼容,可能导致GPU无法正常发挥性能,甚至偷偷 fallback 到CPU模式运行。你可以用
nvidia-smi命令查看训练时的GPU利用率,如果利用率持续偏低,那大概率是配置或数据加载的问题。模型结构的硬件适配性问题:LSTM属于序列式计算,每个时间步的输出依赖前一个时间步的结果,并行度有限。你的序列长度是240,不算特别长,GPU擅长的大规模并行计算优势很难体现,反而GPU的启动开销、数据传输开销占了主导。
batch size设置不合理:如果batch size太小,GPU的计算单元无法被充分利用。CPU处理小批量数据时开销很低,但GPU需要足够规模的并行任务才能拉满性能。你可以尝试调大batch size,观察GPU的训练速度是否有所提升。
内容的提问来源于stack exchange,提问作者Torbik

