Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以用TensorFlow测量单个操作的执行时间吗?_Tensorflow - Fatal编程技术网

我可以用TensorFlow测量单个操作的执行时间吗?

我可以用TensorFlow测量单个操作的执行时间吗?,tensorflow,Tensorflow,我知道我可以测量对sess.run()调用的执行时间,但是有可能获得更精细的粒度并测量单个操作的执行时间吗?在公共版本中还没有这样做的方法。我们意识到这是一个重要的特性,我们正在研究它。要更新这个答案,我们确实有一些CPU评测功能,重点是推理。如果您查看,您将看到一个可以在模型上运行的程序,以获取每次操作的计时。我已使用来获取图形中每个节点的执行时间: 您可以使用经典的sess.run(),但也可以指定可选参数options和run\u metadata 然后使用run\u元数据创建一个Tim

我知道我可以测量对sess.run()调用的执行时间,但是有可能获得更精细的粒度并测量单个操作的执行时间吗?

在公共版本中还没有这样做的方法。我们意识到这是一个重要的特性,我们正在研究它。

要更新这个答案,我们确实有一些CPU评测功能,重点是推理。如果您查看,您将看到一个可以在模型上运行的程序,以获取每次操作的计时。

我已使用来获取图形中每个节点的执行时间:

  • 您可以使用经典的
    sess.run()
    ,但也可以指定可选参数
    options
    run\u metadata
  • 然后使用
    run\u元数据创建一个
    Timeline
    对象

下面是一个测量矩阵乘法性能的示例程序:

将tensorflow导入为tf
从tensorflow.python.client导入时间线
x=tf.random_normal([10001000])
y=tf.随机_正常([10001000])
res=tf.matmul(x,y)
#使用完整跟踪选项运行图形
使用tf.Session()作为sess:
运行选项=tf.RunOptions(跟踪级别=tf.RunOptions.FULL\u跟踪)
run_metadata=tf.RunMetadata()
运行(res,options=run\u options,run\u metadata=run\u metadata)
#创建Timeline对象,并将其写入json
tl=timeline.timeline(运行元数据.step\u stats)
ctf=tl.generate_chrome_trace_format()
将open('timeline.json','w')作为f:
f、 写入(ctf)

然后,您可以打开Google Chrome,进入页面
chrome://tracing
并加载
timeline.json
文件。 您应该看到如下内容:


您可以使用提取此信息。您将需要执行以下操作(检查上述链接中的完整示例):

run\u options=tf.RunOptions(跟踪级别=tf.RunOptions.FULL\u跟踪)
run_metadata=tf.RunMetadata()
sess.run(,options=run\u options,run\u metadata=run\u metadata)
您的\u编写器。添加\u运行\u元数据(运行\u元数据,“步骤%d”%i)

比仅打印更好,您可以在tensorboard中看到它:

此外,单击节点将显示确切的总内存, 计算时间和张量输出大小


对于Olivier Moindrot回答下fat lobyte的评论,如果您想收集所有会话的时间线,您可以将“
open('timeline.json','w')
”更改为“
open('timeline.json','a')

由于在谷歌搜索“Tensorflow Profiling”时这一点很高,请注意当前(2017年底,Tensorflow 1.4)获取时间线的方式是使用。这适用于tf.Estimator中的MonitoredSessions,其中tf.RunOptions不可用

estimator = tf.estimator.Estimator(model_fn=...)
hook = tf.train.ProfilerHook(save_steps=10, output_dir='.')
estimator.train(input_fn=..., steps=..., hooks=[hook])

Uber SBNet custom op library()最近发布了一个基于cuda事件的计时器的实现,可以以下列方式使用:

with tf.control_dependencies([input1, input2]):
    dt0 = sbnet_module.cuda_timer_start()
with tf.control_dependencies([dt0]):
    input1 = tf.identity(input1)
    input2 = tf.identity(input2)

### portion of subgraph to time goes in here

with tf.control_dependencies([result1, result2, dt0]):
    cuda_time = sbnet_module.cuda_timer_end(dt0)
with tf.control_dependencies([cuda_time]):
    result1 = tf.identity(result1)
    result2 = tf.identity(result2)

py_result1, py_result2, dt = session.run([result1, result2, cuda_time])
print "Milliseconds elapsed=", dt
请注意,子图的任何部分都可以是异步的。您应该非常小心地指定计时器操作的所有输入和输出依赖项。否则,计时器可能会按顺序插入到图形中,并且您可能会得到错误的时间。我发现timeline和time.time()计时对于分析Tensorflow图来说非常有限。还请注意,cuda_计时器API将在默认流上同步,这是目前设计的,因为TF使用多个流

说到这里,我个人建议切换到PyTorch:)开发迭代更快,代码运行更快,一切都不那么痛苦

从tf.Session中减去开销的另一种有点晦涩难懂的方法(可能是巨大的)是将图复制N次,并对变量N运行它,求解未知固定开销的方程。也就是说,在N1=10和N2=20的情况下测量session.run()的前后,您知道您的时间是t,开销是x。大概是

N1*x+t = t1
N2*x+t = t2

解x和t。缺点是这可能需要大量内存,而且不一定准确:)还要确保您的输入完全不同/随机/独立,否则TF将折叠整个子图,并且不会运行N次。。。享受TensorFlow带来的乐趣:)

从TensorFlow 1.8开始,有一个非常好的例子可以使用
tf.profile.Profiler
2.0兼容的答案:您可以在
Keras回调中使用
评测

代码为:

log_dir="logs/profile/" + datetime.now().strftime("%Y%m%d-%H%M%S")

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1, profile_batch = 3)

model.fit(train_data,
          steps_per_epoch=20,
          epochs=5, 
          callbacks=[tensorboard_callback])

有关如何分析的更多详细信息,请参阅此。

Hi!我试着为我的网络培训创建一个时间线,但不幸的是,按照您的说明这样做只会为最后一次调用session.run生成一个时间线。有没有一种方法可以聚合所有会话的时间线?使用TensorFlow 0.12.0-rc0,我发现我需要确保libcupti.so/libcupti.dylib位于库路径中,才能工作。对于我(在Mac上),我将
/usr/local/cuda/extras/CUPTI/lib
添加到
DYLD\u LIBRARY\u PATH
。或者
LD\u LIBRARY\u PATH=/usr/local/cuda/extras/CUPTI/lib64:${LD\u LIBRARY\u PATH}
在ubuntudutuw上为什么有add操作符?因为调用
tf.random\u normal
时,TensorFlow首先创建一个均值为0、方差为1的随机张量。然后乘以标准偏差(这里是1)并加上平均值(这里是0)。这个答案有可能更新吗?因为似乎有人可以计算单个操作的失败次数,从而可以深入了解执行时间。链接()已更新。链接已失效,是否有更新版本?(仍适用于TF 1.x)
log_dir="logs/profile/" + datetime.now().strftime("%Y%m%d-%H%M%S")

tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1, profile_batch = 3)

model.fit(train_data,
          steps_per_epoch=20,
          epochs=5, 
          callbacks=[tensorboard_callback])