TensorFlow:分配给cpu的关键图操作而不是gpu

时间:2016-02-16 21:12:46

标签: python tensorflow

我已经实现了TensorFlow DNN模型(2个隐藏层,其中包含在MNIST上训练的阐释激活函数)作为Python类,以便使用自己的优化例程和工具将TF调用包装在另一个库中。

在TeslaK20上运行一些测试时,我注意到GPU的使用率是总容量的4%。因此,我更接近日志设备位置,并认为所有关键操作(如MatMulSumAddMean等都已分配给中央处理器。

首先想到的是,因为我使用的是dtype=float64,所以我切换到了dtype=float32。虽然为GPU分配了更多操作,但仍然为CPU分配了一个很好的数字,例如Meangradient/Mean_grad/Prodgradient/Mean

所以这是我的第一个问题(我在最后链接一个工作代码示例),

1)为什么会这样?我编写了不同的TF模型,包括简单的张量乘法和减少,只要我使用单精度,它们就可以完全在GPU上运行。

所以这是第二个问题,

2)为什么TF会根据数据类型将图表分配给不同的设备?我知道并非所有内核都是针对GPU实现的,但我认为像MatMul这样的东西可以在GPU上运行单精度和双精度。

3)模型是否包含在Python类中的事实是否会产生影响?我不认为是这种情况,因为正如我所说的那样,其他模型包装类似,但更简单。

4)我可以采取哪些步骤在GPU上完全运行模型?

以下是我从我的库中隔离的代码的完整工作示例

https://gist.github.com/smcantab/8ecb679150a327738102

如果您运行它并查看输出,您将看到图表的不同部分如何分配给不同的设备。要查看此类型和设备的更改方式,请更改示例末尾dtype内的devicemain()。请注意,如果我设置allow_soft_placement=False,则图表无法初始化。

任何建议都会非常感激。

2 个答案:

答案 0 :(得分:4)

正如雅罗斯拉夫所说:Mean, in particular, was not yet implemented for GPU,但它现在可用,所以这些操作应该在GPU上运行最新的TensorFlow。 (根据该链接的DEVICE_GPU注册)

在提供平均值之前,其状态为:

(a)您可以手动实现平均值,因为reduce_sum is available on GPU

(b)我已经重新点击某人,看看是否有一种简单的方式来添加GPU支持,但我们会看到。

在GPU上重新float64,有人在三天前使用supporting float64 reductions on GPU的补丁打开了一个问题。目前正在审核和测试。

不,如果它包含在Python中并不重要 - 它真的只是关于是否已定义内核以在GPU上执行它。在很多情况下,为什么X不支持X的原因是什么?#34;归结为是否需要Y在GPU上运行。 float64的答案更简单:float32更快,所以在大多数情况下,人们努力使他们的模型尽可能在float32中工作,因为它提供了全方位的速度优势。

答案 1 :(得分:0)

大多数显卡如GTX 980,1080等都被剥离了双精度浮点硬件单元。由于它们比新型特斯拉单元(具有FP64双精度硬件)便宜得多,因此更普遍,因此与单精度相比,在显卡上进行双精度计算非常慢。在没有FP64硬件的GPU上,GPU上的FP64计算似乎比FP32慢约32倍。我相信这就是为什么FP32计算往往是为GPU设置而FP64用于CPU(在大多数系统中更快)。希望将来,框架将在运行时测试GPU功能以决定在哪里分配FP64计算。