Tensorflow:GPU 利用率几乎始终为 0%

2024-01-10

我将张量流与 Titan-X GPU 一起使用,并且我注意到,当我运行 CIFAR10 示例时,Volatile GPU-utilization稳定在 30% 左右,而当我训练自己的模型时,Volatile GPU-utilization远非稳定,它几乎总是 0%,并在 80/90% 时飙升,然后一遍又一遍地回到 0%。

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

任何想法?

batch = 128 # size of the batch
x = tf.placeholder("float32", [None, n_steps, n_input])
y = tf.placeholder("float32", [None, n_classes])

# with a capacity of 100 batches, the bottleneck should not be the data feeding
queue = tf.RandomShuffleQueue(capacity=100*batch,
                  min_after_dequeue=80*batch,
                  dtypes=[tf.float32, tf.float32],
                  shapes=[[n_steps, n_input], [n_classes]])
enqueue_op = queue.enqueue_many([x, y])
X_batch, Y_batch = queue.dequeue_many(batch)

sess = tf.Session()

def load_and_enqueue(data):
    while True:
        X, Y = data.get_next_batch(batch)
        sess.run(enqueue_op, feed_dict={x: X, y: Y})

train_thread = threading.Thread(target=load_and_enqueue, args=(data))
train_thread.daemon = True
train_thread.start()

for _ in xrange(max_iter):
    sess.run(train_op)

经过一些实验后,我找到了答案,因此我将其发布,因为它可能对其他人有用。

First, get_next_batch大约慢 15 倍train_op(感谢埃里克·普拉顿指出了这一点)。

然而,我认为队列已经厌倦了capacity而且只有在训练应该开始之后才可以。因此,我想,即使get_next_batch速度慢得多,队列应该隐藏这个延迟,至少在开始时,因为它保存capacity示例,只有在达到后才需要获取新数据min_after_dequeue低于capacity并且这会导致 GPU 利用率在某种程度上保持稳定。

但实际上,队列一到就开始训练min_after_dequeue例子。因此,一旦队列到达,队列就会出列min_after_dequeue运行的示例train_op,并且由于送入队列的时间比执行时间慢 15 倍train_op,队列中的元素数量下降到以下min_after_dequeue第一次迭代之后train_optrain_op必须等待队列再次到达min_after_dequeue例子。

当我强行train_op等待队列已满capacity (with capacity = 100*batch)而不是在达到时自动启动min_after_dequeue (with min_after_dequeue=80*batch),GPU 利用率稳定大约 10 秒,然后又回到 0%,这是可以理解的,因为队列达到min_after_dequeue例如,不到 10 秒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tensorflow:GPU 利用率几乎始终为 0% 的相关文章

随机推荐