【发布时间】: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