【发布时间】:2016-02-16 21:12:46
【问题描述】:
我已经将 TensorFlow DNN 模型(2 个隐藏层和在 MNIST 上训练的 elu 激活函数)实现为 Python 类,以便将 TF 调用包装在另一个库中,并使用其自己的优化例程和工具。
在 TeslaK20 上运行一些测试时,我注意到 GPU 的使用率为总容量的 4%。因此,我更仔细地查看了 log-device-placement 并发现所有关键操作,如 MatMul、Sum、Add、Mean 等都被分配给了 CPU。
首先想到的是因为我使用的是dtype=float64,所以我切换到dtype=float32。尽管分配给 GPU 的操作更多,但分配给 CPU 的操作仍然很多,例如 Mean、gradient/Mean_grad/Prod、gradient/Mean。
所以我的第一个问题来了(我在最后链接了一个工作代码示例),
1) 为什么会这样?我编写了不同的 TF 模型,这些模型由简单的张量乘法和减法组成,只要我使用单精度,它们就可以在 GPU 上完全运行。
那么第二个问题来了,
2)为什么TF会根据数据类型将图表分配给不同的设备?我知道并非所有内核都是为 GPU 实现的,但我认为像 MatMul 这样的东西可以在 GPU 上以单精度和双精度运行。
3) 模型封装在 Python 类中这一事实是否会产生影响?我认为情况并非如此,因为正如我所说,类似包装的其他模型并没有发生这种情况,但更简单。
4) 我可以采取哪些步骤在 GPU 上完全运行模型?
这是我从库中隔离的代码的完整工作示例
https://gist.github.com/smcantab/8ecb679150a327738102 。
如果您运行它并查看输出,您会看到图表的不同部分是如何分配给不同设备的。在示例末尾的main() 中查看这如何随着类型和设备的变化而变化dtype 和device。请注意,如果我设置allow_soft_placement=False,则图形无法初始化。
任何建议都将不胜感激。
【问题讨论】:
-
看起来对 matmul 中双精度的支持已关闭 here。看起来很奇怪,它调用了支持双精度的 CuBLAS。还有一些操作没有任何数据类型的 GPU 实现
-
底线——一堆操作没有在 GPU 上实现。一种策略是重组计算以使用更多与 GPU 兼容的操作并为其余的文件提交 github 问题以跟踪社区进度。启用对 matmul 的双重支持似乎很容易实现
-
尝试将
(use_gpu=True, force_gpu=True)添加到您的会话中,并在构建图表时查看失败的位置。 -
谢谢雅罗斯拉夫,我在这里提出了一个问题github.com/tensorflow/tensorflow/issues/1140
标签: python tensorflow