【问题标题】:Tensorflow not linking operations into single CUDA kernelTensorflow 未将操作链接到单个 CUDA 内核
【发布时间】:2018-07-15 18:34:48
【问题描述】:

我刚刚开始学习如何使用 Tensorflow,遇到了一个问题,让我怀疑我对它应该如何工作的理解。我想大致了解在 GPU 上使用基本算术运算应该获得多少性能。我创建了一个包含 1 亿个元素的一维张量,然后在这个张量上链接 1000 个添加操作。我的期望是 Tensorflow 运行时能够将这些操作链接到在 GPU 上执行的单个 CUDA 内核中,但是当我运行它时,似乎每个操作都是单独发布给 GPU 的。在我的 gtx 1080 ti 上完成大约需要 5 秒,它提供了大约 20 Gflops。运行时,python.exe 正在使用完整的 CPU 内核,Nvidia Nsight 显示许多内核正在提交。相比之下,当我尝试查看使用 Alea.GPU 得到的结果时,我得到了大约 3Tflops 和单个 CUDA 内核。

我是否误解了基本操作在 GPU 上的工作方式?手动将操作分组为更复杂的自定义操作或使用更高级别的 ML 函数是获得良好 GPU 效率的唯一方法吗?

谢谢。

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)))

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    首先,您应该将代码分成两个阶段,一个build_graph 阶段,它定义了各种张量。我建议将它们收集到一个名为 build_graph() 的函数中。然后创建您的会话并通过它运行数据。您正在尝试将过程编程技术应用于命令式库。

    接下来是在 GPU 上交换数据的问题。当您运行 tf.reduce_sum(z).eval() 时,您每次都将结果从 GPU 复制回 CPU。

    最后,您正在使用tf.InteractiveSession() 创建许多会话,您应该只创建 1 个会话。回到第一个问题来解决这个问题。最佳实践是在创建会话后永远不要创建 tensorflow OP。 Tensorflow 将允许您这样做,但作为最佳实践,不要这样做,如果您正确编码,则不需要这样做。如果您觉得需要,请发布一个问题,询问为什么在创建会话之前不定义它就不能执行 XYZ,并且几乎肯定有人会提供对工作流程的更正。

    【讨论】:

      猜你喜欢
      • 2016-09-29
      • 2019-11-10
      • 2021-03-20
      • 1970-01-01
      • 2018-07-12
      • 2011-10-14
      • 1970-01-01
      • 2021-02-01
      • 2022-06-30
      相关资源
      最近更新 更多