【问题标题】:Why is my GPU slower than CPU when training LSTM/RNN models?为什么在训练 LSTM/RNN 模型时我的 GPU 比 CPU 慢?
【发布时间】:2023-03-10 13:37:01
【问题描述】:

我的机器有以下规格:

CPU:至强 E5-1620 v4

GPU:Titan X(帕斯卡)

Ubuntu 16.04

英伟达驱动 375.26

CUDA 8.0

cuDNN 5.1

我对以下 Keras 示例进行了基准测试,其中 Tensorflow 作为支持 reference

SCRIPT NAME                  GPU       CPU
stated_lstm.py               5sec      5sec 
babi_rnn.py                  10sec     12sec
imdb_bidirectional_lstm.py   240sec    116sec
imbd_lstm.py                 113sec    106sec

我的 gpu 在非 lstm 模型中的性能明显优于我的 cpu。

SCRIPT NAME                  GPU       CPU
cifar10_cnn.py               12sec     123sec
imdb_cnn.py                  5sec      119sec
mnist_cnn.py                 3sec      47sec 

有其他人经历过吗?

【问题讨论】:

    标签: machine-learning tensorflow nvidia keras


    【解决方案1】:

    如果您使用 Keras,请使用 CuDNNLSTM 代替 LSTMCuDNNGRU 代替 GRU。就我而言(2 Tesla M60),我看到了 10 倍的性能提升。顺便说一句,我使用@Alexey Golyshev 建议的批量大小 128。

    【讨论】:

    • 我们都喜欢 2^n :)
    • 但是 LSTM 和 CuDNNLSTM 有什么区别呢?
    • 我的模型,64 批大小,通过在我的 RTX 2070 上将 LSTM 更改为 CuDNNLSTM,性能从 22 分钟提高到 1 分钟!
    【解决方案2】:

    批量太小。尝试增加。

    我的 GTX1050Ti 的结果:

    imdb_bidirectional_lstm.py batch_size 时间 32(默认)252 64 131 96 87 128 66 imdb_lstm.py batch_size 时间 32(默认)108 64 50 96 34 128 25

    【讨论】:

    • 我可以增加我的 gpu 和 cpu 的批量大小,它们的性能相似,我希望 gpu 性能更好。即使我的显卡比 1050ti 强得多,我们似乎也得到了相似的时间。我的 gpu 在 cnns 上明显优于我的 cpu,但不是 lstm,这是为什么呢?
    • @agsolid 你的 CPU 非常快。我的 Core i3-4330 计算 imdb_lstm.py (batch=128) 每个 epoch 需要 110 秒,而 GPU 需要 25 秒。你的 GPU 也比我的快。差异在于利用率百分比(您的较低)。
    • 如何充分利用我的 GPU?
    • @agsolid 利用率低也不错。这个问题对于您的 TitanX 来说太小了。例如,在 mnist_cnn.py 中,我的结果是你的 GPU 上的 12 秒对 3 秒(你快 4 倍)。在 TitanX 上,您可以解决甚至超出我的 GPU 内存的更大问题。
    • 对于 imdb_lstm.py: [GPU] GTX 760: 150s/epoch (32 batch size), 37s/epoch (128 batch size). ... [CPU] 2.5 GHz Intel Core i7-4870HQ: 88s/epoch (32 batch size), 50s/epoch (128 batch size) 所以我的 GPU 在大批量时才开始表现得更好。 问题: @AlexeyGolyshev 大批量有什么缺点 - 它会降低预测准确性吗?选择合适的批量大小的最佳方法是什么?
    【解决方案3】:

    这只是一个提示。

    使用 GPU 功能强大的时候

    1.你的神经网络模型很大。
    2.批量很大。

    这是我通过谷歌搜索找到的。

    【讨论】:

    【解决方案4】:

    我在这里遇到了类似的问题:

    测试 1

    CPU:Intel(R) Xeon(R) CPU E5-2697 v3 @ 2.60GHz

    Ubuntu 14.04

    imdb_bidirectional_lstm.py:155s

    测试 2

    GPU:GTX 860m

    英伟达驱动:369.30

    CUDA 工具包:v8.0

    cuDNN:v6.0

    imdb_bidirectional_lstm.py:450s

    分析

    当我观察 GPU 负载曲线时,我发现了一件有趣的事情:

    • 对于 lstm,GPU 负载在 ~80% 和 ~10% 之间快速跳跃

    GPU load

    这主要是由于 LSTM 层中的顺序计算。请记住,LSTM 需要顺序输入来迭代计算隐藏层权重,换句话说,您必须等待时间 t-1 的隐藏状态才能计算时间 t 的隐藏状态。

    这对于 GPU 内核来说不是一个好主意,因为它们是许多喜欢并行计算的小内核,顺序计算无法充分利用它们的计算能力。这就是为什么我们看到 GPU 负载在大多数情况下都在 10% 到 20% 左右。

    但在反向传播阶段,GPU 可以并行运行导数计算,因此我们可以看到 GPU 负载峰值在 80% 左右。

    【讨论】:

    • GTX 860m 是移动 GPU,因此带宽和 vram 非常有限。我强烈建议不要在移动 gpus 上分析任何内容。
    • 昨晚我用GTX 860mGTX 1060测试了我自己的c-lstm模型(1个cnn层+1个lstm层)。事实证明,1060 只比 860m 快 1.28 倍。所以我想断言对于imdb_bidirectional_lstm,1060 仍然比 CPU 慢。今晚将测试我的想法。
    • GTX 1060: 一个纪元需要320s
    • @ZekunZhang 你是怎么得到GPU负载图的?
    猜你喜欢
    • 1970-01-01
    • 2019-09-09
    • 2021-08-16
    • 2022-06-14
    • 1970-01-01
    • 2021-07-24
    • 2017-08-08
    • 2020-10-18
    相关资源
    最近更新 更多