展开Tensorflow循环以避免频繁的GPU内核开销

时间:2017-06-30 15:28:10

标签: tensorflow tensorflow-gpu

考虑以下程序,我迭代地计算@if (var3!= null) { <p> Product: @var3 </p> } 进行多次迭代。

b += a

显然,上面的循环调用至少100次内核启动,看起来不必要,因为我实际上正在进行此添加。有没有办法避免内核启动开销?理想情况下,我正在寻找一个tensorflow API解决方案(只有A = tf.constant(np.random.randn(1000000)) B = tf.constant(np.random.randn(1000000)) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for i in range(100): B = tf.add(A, B) 上的一个调用),而不是更改run的逻辑。

3 个答案:

答案 0 :(得分:0)

您可以使用tf.while_loop

i = tf.constant(100)
op = tf.while_loop(
  lambda a, b, i: tf.greater(i, 0),
  lambda a, b, i: (a+b, b, i-1),
  (a, b, i))
res = op[0]

res在运行循环后包含“a”的值 - 请注意a实际上未更改且仍包含起始值。

答案 1 :(得分:0)

基本上,您在图表中创建了100个分配和添加操作,这可能不是您想要的。

这段代码应该做你想要的。

mbstring

答案 2 :(得分:0)

您需要了解TF的第一件事是您需要将图形的定义与其执行分开。当您处理真正的问题时,它将节省您数小时的调试/搜索效率低下的问题。

你当前的问题是因为你还没有这样做。在循环中,每次创建一个图形节点(100次)。如果你愿意 - 检查你的张量板图表,如果你是懒惰的,只需将值增加到一个非常大的值,你的程序就会崩溃graph is bigger than 2Gb

要以更好的方式执行此操作,您可以定义然后执行。要重新分配值,请使用assign operator。

A = tf.constant(3) # change to your random stuff
B = tf.Variable(1) # change to your random stuff
B_new = B.assign(tf.add(A, B)) 

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(100):
        res = sess.run(B_new)
    print res

最后你显然不需要循环:

A = tf.constant(3)
B = tf.constant(1)
C = 100 * A + B

with tf.Session() as sess:
    print sess.run(C)