【问题标题】:Using CUDA GPUs at prediction time for high througput streams在预测时使用 CUDA GPU 处理高吞吐量流
【发布时间】:2017-10-08 10:26:56
【问题描述】:

我们正在尝试开发具有面向用户的组件的自然语言处理应用程序。用户可以通过 API 调用模型,并返回结果。 这些模型是使用 Keras 和 Theano 进行预训练的。我们使用 GPU 来加速训练。但是,使用 GPU 仍然可以显着加快预测速度。目前,我们有一台带有两个 GPU 的机器。然而,在运行时(例如,当运行面向用户的位时)存在一个问题:多个 Python 进程通过 CUDA 共享 GPU 似乎并没有提供并行加速。 我们将 nvidia-docker 与 libgpuarray (pygpu)、Theano 和 Keras 一起使用。 GPU 仍然大部分处于空闲状态,但添加更多 Python 工作者并不能加快进程。

解决在 API 后面运行 GPU 模型的问题的首选方法是什么?理想情况下,我们会在购买新 GPU 之前更有效地利用现有 GPU。

我可以想象我们在将其发送到 GPU 之前需要某种缓冲区,而不是为每个 HTTP 调用请求锁定?

【问题讨论】:

  • 如果我理解正确的话,可能会发生多个不同的内核/进程同时在一个GPU上运行? Afaik GPU 通常不擅长这一点 - 至少当所有内核都以一定数量的线程块启动时。
  • 这确实是一个相当广泛的问题,我不确定您是从 CUDA 的角度还是从涉及 Python 框架的角度提出这个问题。 NVIDIA 发布了一款名为 MPS 的产品,旨在用于 MPI 等多个进程需要同时访问 GPU 的用例。这会有帮助吗?
  • 我相信 talonmies 已经指出了问题,并提供了解决方案。来自不同进程的内核将在不同的 GPU 上下文中运行,kernels from separate contexts do not run concurrently。解决方案是拥有一个代表其他进程运行内核的“代理”进程,因此它们都共享相同的上下文。这正是MPS 所做的。

标签: cuda gpu keras theano nvidia


【解决方案1】:

这不是对您更笼统的问题的回答,而是根据我对您描述的场景的理解做出的回答。

如果有人编写了一个使用 GPU 执行某些计算任务的系统,他们(希望)花时间并行执行,以便从 GPU 可以提供的全部资源或类似的资源中受益。

这意味着如果您添加第二个类似的任务 - 即使是并行的 - 完成它们的总时间应该与连续完成它们的时间相似,即一个接一个 - 因为很少未充分利用的 GPU 资源让第二个任务受益。事实上,甚至可能出现两个任务都会变慢的情况(例如,如果它们都以某种方式大量使用 L2 缓存,并且在一起运行时会破坏它)。

无论如何,当你想提高性能时,最好的办法是分析你的应用程序——在这种情况下,使用nvprof profiler 或其nvvp frontend(第一个链接是官方文档,第二个链接是演示文稿)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多