Tensorflow:GPU利用率几乎总是为0%

时间:2016-07-11 00:17:42

标签: neural-network gpu tensorflow nvidia deep-learning

我正在使用使用Titan-X GPU的tensorflow,我注意到,当我运行CIFAR10示例时,Volatile GPU-utilization非常恒定在30%左右,而当我训练自己的模型时,{ {1}}远远不稳定,几乎总是0%,并且在回到0%之前一次又一次地达到80/90%。

我认为这种行为是由于我将数据传送到网络的方式(我在每一步之后获取数据,这需要一些时间)。但是在实现了一个队列来提供数据并避免步骤之间的延迟之后,问题仍然存在(请参阅下面的排队系统)。

有什么想法吗?

Volatile GPU-utilization

1 个答案:

答案 0 :(得分:10)

在做了一些实验之后,我找到了答案,所以我发布了它,因为它可能对其他人有用。

首先,get_next_batchtrain_op慢约15倍(感谢Eric Platon指出这一点)。

但是,我认为队列被送到capacity并且只有在训练结束后才会开始。因此,我认为即使get_next_batch速度较慢,队列也应该至少在开始时隐藏此延迟,因为它包含capacity个示例,并且只有在到达后才需要获取新数据min_after_dequeue低于capacity并且会导致GPU使用率不稳定。

但实际上,只要队列到达min_after_dequeue个例子,训练就会开始。因此,一旦队列到达min_after_dequeue示例运行train_op,队列就会出列,因为提供队列的时间比train_op的执行时间慢15倍,在min_after_dequeue的第一次迭代之后,队列中的元素数量会降至train_op以下,而train_op必须等待队列再次访问min_after_dequeue示例。

当我强制train_op等待队列结束capacitycapacity = 100*batch)时,而不是在到达min_after_dequeue时自动启动(min_after_dequeue=80*batch 1}}),GPU利用率在恢复到0%之前稳定了10秒,这是可以理解的,因为队列在不到10秒的时间内达到min_after_dequeue示例。