我正在使用使用Titan-X GPU的tensorflow,我注意到,当我运行CIFAR10示例时,Volatile GPU-utilization
非常恒定在30%左右,而当我训练自己的模型时,{ {1}}远远不稳定,几乎总是0%,并且在回到0%之前一次又一次地达到80/90%。
我认为这种行为是由于我将数据传送到网络的方式(我在每一步之后获取数据,这需要一些时间)。但是在实现了一个队列来提供数据并避免步骤之间的延迟之后,问题仍然存在(请参阅下面的排队系统)。
有什么想法吗?
Volatile GPU-utilization
答案 0 :(得分:10)
在做了一些实验之后,我找到了答案,所以我发布了它,因为它可能对其他人有用。
首先,get_next_batch
比train_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
等待队列结束capacity
(capacity = 100*batch
)时,而不是在到达min_after_dequeue
时自动启动(min_after_dequeue=80*batch
1}}),GPU利用率在恢复到0%之前稳定了10秒,这是可以理解的,因为队列在不到10秒的时间内达到min_after_dequeue
示例。