7

我正在从事强化学习任务,并决定使用 keras NN 模型进行 Q 值逼近。这种方法很常见:在每个动作之后,奖励都存储在内存重放数组中,然后我从中抽取随机样本,并用新数据拟合模型state-action => reward+predicted_Q(更多细节在这里)。为了进行训练,必须为训练集中的每个项目预测 Q 值。

脚本运行非常缓慢,所以我开始调查。Profiling 显示 56,87% 的累积时间是由_predict_loop方法占用的: 在此处输入图像描述 而且看起来很奇怪,因为预测只是一种单向传播。只是一组数字的一次乘法。我使用的模型非常简单:8 个输入,隐藏层上的 5 个节点,1 个输出。

我已经安装并配置了 CUDA,运行了几个示例测试,它显示使用了 GPU,我也可以看到 GPU 的巨大负载。当我运行我的代码时 - 有一条消息:“使用 gpu 设备 0:GeForce GT 730”但我可以看到GPU 负载非常低(大约 10%)。

预测功能需要这么多时间是否正常?有没有办法使用 GPU 进行这种计算?

4

2 回答 2

9

您的 NN 的大小似乎太小而无法充分利用 GPU。通常,只有当输入/隐藏/输出层大小大于 200~500(取决于实现代码)时,GPU 才比多核 CPU 快。

但是你的神经网络的大小只有 8/5/1,这意味着大部分时间都花在了 GPU 开销上,比如 CUDA 内核启动、PCIe 数据传输等。在这种情况下,调用次数是决定的主要因素训练时间。为了加快速度,您可能需要在 CPU 上训练模型,并使用开销低得多的编程语言(例如 C/C++)。

于 2016-06-25T10:00:55.483 回答
1

这是众所周知的问题。这就是我们拥有 CNMeM 的原因。这是一个由 NVIDIA 开发的库,可帮助深度学习框架管理 CUDA 内存。CNMeM 已经集成在 Theano 中,因此您无需安装任何东西。要在 Theano 中启用 CNMeM,您必须添加.theanorc以下行:

[lib]
cnmem = 0.8

cnmem 值指定为 Theano 分配的 GPU 内存量。引用文档:

0:未启用。

0 < N <= 1:使用总 GPU 内存的这一部分(对于驱动程序内存,剪裁为 0.95)。[注意:这应该是一个浮点值,例如 0.25 或 1.0]

. >1:以兆字节 (MB) 内存为单位使用此数字。

有关 .theanorc 和 CuDNN(另一个有用的库)的更多信息,请访问:

http://ankivil.com/making-theano-faster-with-cudnn-and-cnmem-on-windows-10/

于 2016-12-30T19:31:54.327 回答