【问题标题】:Low GPU usage by Keras / Tensorflow?Keras / Tensorflow 的 GPU 使用率低?
【发布时间】:2017-06-15 09:09:51
【问题描述】:

我在带有 nvidia Tesla K20c GPU 的计算机上使用带有 tensorflow 后端的 keras。 (CUDA 8)

我正在训练一个相对简单的卷积神经网络,在训练期间我运行终端程序nvidia-smi 来检查 GPU 的使用情况。正如您在以下输出中看到的,GPU 利用率通常显示在 7%-13% 左右

我的问题是:在 CNN 训练期间,GPU 使用率不应该更高吗?这是否表明 keras/tensorflow 的 GPU 配置或使用不当?

nvidia-smi output

【问题讨论】:

    标签: tensorflow gpu keras


    【解决方案1】:

    可能有多种原因,但很可能您在读取训练数据时遇到了瓶颈。由于您的 GPU 已经处理了一个批次,因此它需要更多数据。根据您的实现,这可能会导致 GPU 等待 CPU 加载更多数据,从而降低 GPU 使用率并延长训练时间。

    尝试将所有数据加载到内存中(如果合适)或使用QueueRunner,这将使输入管道在后台读取数据。这将减少您的 GPU 等待更多数据的时间。

    TensorFlow 网站上的Reading Data Guide 包含更多信息。

    【讨论】:

      【解决方案2】:

      你应该找到瓶颈:

      在 Windows 上使用 Task-Manager> Performance 监控您的资源使用情况

      在 Linux 上使用 nmon、nvidia-smi 和 htop 来监控您的资源。

      最可能的情况是:

      • 如果您有一个庞大的数据集,请查看磁盘读/写速率;如果您经常访问硬盘,很可能您需要更改处理数据集的方式以减少磁盘访问次数

      • 尽可能使用内存预加载所有内容。

      • 如果您使用的是 RESTful API 或任何类似的服务,请确保您无需等待太多就可以收到所需的内容。对于 restful 服务,每秒的请求数可能会受到限制(通过 nmon/任务管理器检查您的网络使用情况)

      • 确保在任何情况下都不要使用 swap 空间!

      • 通过任何方式(例如使用缓存、更快的库等)减少预处理的开销

      • 使用 bach_size(但是,据说批量大小的较高值 (>512) 可能会对准确性产生负面影响)

      【讨论】:

        【解决方案3】:

        衡量 GPU 性能和利用率并不像 CPU 或内存那么简单。 GPU是一个极端并行的处理单元,有很多因素。 nvidia-smi 显示的 GPU 利用率数字表示至少一个 gpu 多处理组处于活动状态的时间百分比。如果此数字为 0,则表明您的 GPU 没有被使用,但如果此数字为 100,则并不意味着 GPU 正在充分发挥其潜力。

        这两篇文章有很多关于这个主题的有趣信息: https://www.imgtec.com/blog/a-quick-guide-to-writing-opencl-kernels-for-rogue/ https://www.imgtec.com/blog/measuring-gpu-compute-performance/

        【讨论】:

          【解决方案4】:

          原因可能是您的网络“相对简单”。我有一个包含 60k 训练示例的 MNIST 网络。

          • 在 1 个隐藏层中有 100 个神经元,CPU 训练速度更快,GPU 训练时的 GPU 利用率约为 10%

          • 有 2 个隐藏层,每个 2000 个神经元,GPU 速度明显更快(CPU 为 24 秒 vs 452 秒),其利用率约为 39%

          我有一台相当旧的 PC(24GB DDR3-1333,i7 3770k),但有一个现代显卡(RTX 2070 + SSD,如果重要的话),所以内存-GPU 数据传输存在瓶颈。

          我还不确定这里有多大的改进空间。我必须训练一个更大的网络并将其与更好的 CPU/内存配置 + 相同的 GPU 进行比较。

          我想对于较小的网络来说,这并不重要,因为它们对 CPU 来说相对容易。

          【讨论】:

            【解决方案5】:

            GPU 利用率低可能是由于小批量。 Keras 习惯于占用整个内存大小,例如,您使用批量大小 x 或批量大小 2x。如果可能,请尝试使用更大的批量大小,看看它是否会发生变化。

            【讨论】:

              猜你喜欢
              • 2020-02-05
              • 2019-09-25
              • 2019-09-26
              • 2016-09-28
              • 2023-03-21
              • 1970-01-01
              • 2018-06-29
              • 2018-04-28
              • 2017-05-01
              相关资源
              最近更新 更多