我刚刚开始学习如何使用Tensorflow并遇到了一个让我怀疑自己应该如何运作的问题。我想大致了解一下我应该在GPU上使用基本算术运算获得多少性能。我创建一个1亿个元素的一维张量,然后在这个张量上链接1000个加法运算。我的期望是Tensorflow运行时能够将这些操作链接到在GPU上执行的单个CUDA内核,但是当我运行它时,似乎每个操作都是单独发布给GPU的。我的gtx 1080 ti需要大约5秒才能完成,大约可以提供20 Gflops。在运行时,python.exe正在耗尽一个完整的CPU核心,Nvidia Nsight显示正在提交的许多内核。相比之下,当我尝试看看我用Alea.GPU得到的东西时,我得到了3Tflops并发布了一个CUDA内核。
我是否误解了基本操作应该如何在GPU上运行?是获得良好GPU效率以手动将操作分组到更复杂的自定义操作或使用更高级别ML功能的唯一方法吗?
谢谢。
import tensorflow as tf
import time
TENSOR_SIZE=100000000
TF_REP=1000
def testSpeed(x):
tf.InteractiveSession();
z=tf.zeros(TENSOR_SIZE)
for i in range(0, TF_REP):
z=tf.add(z,x)
return tf.reduce_sum(z).eval();
x=tf.range(0.0, TENSOR_SIZE)
t0=time.perf_counter()
testSpeed(x)
t1=time.perf_counter()
print("Time taken "+str(t1-t0)+"s gflops= " + str(TENSOR_SIZE * TF_REP / 1000000000.0 / (t1 - t0)))
答案 0 :(得分:0)
首先,您应该将您的代码分为两个阶段,一个build_graph
阶段,它定义了各种张量。我建议在一个名为build_graph()
的函数中收集它们。然后创建会话并通过它运行数据。您正在尝试将过程编程技术应用于命令式库。
接下来是将数据交换到GPU上或从GPU上移除的问题。当您运行tf.reduce_sum(z).eval()
时,您每次都会将结果从GPU复制回CPU。
最后,您正在使用tf.InteractiveSession()
创建多个会话,您应该只创建一个会话。回到第一个问题来解决这个问题。最佳实践是在创建会话后永远不会创建tensorflow OP。 Tensorflow将允许您,但作为最佳实践不会,如果您正确编码,则不需要。如果您需要,请发布一个问题,询问为什么在创建会话之前无法定义XYZ,而且有人几乎肯定会对工作流程进行更正。