2017-01-05 35 views
0

我目前正在开发和分析一个GTX 1070中tensorflow中的神经网络。由于一些昂贵的FFT操作,我的第一个实现结果相当低效。 附图中的上部时间线显示一个训练步骤大约需要115ms。第二个(数学等价的)实现似乎消耗更少的时间,一步需要10ms以下。Tensorflow剖析时间线与墙时间不一致

timelines (对不起,我不允许张贴图片还)

令人惊讶的两种方法需要约。通过在python测量时相同的时间:

build model, get train_op... 
sess = tf.Session() 

import timeit 
t = timeit.default_timer() 
for i in range(100): 
    sess.run(train_op) 
dt = timeit.default_timer() - t 
print(dt) 

在两种情况下100次采取〜17S> 100 * 115ms> 100 * 10毫秒这是多余将从蟒开销期望。 网络使用队列进行馈送,但结果是直接将numpy数组馈送到图中,所以我得出结论empyt队列不能成为瓶颈。

的时间表是在记录与差别原则,我测量两个运行:

build model, get train_op... 
sess = tf.Session() 

def write_timeline(path): 
    from tensorflow.python.client import timeline 
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE) 
    run_metadata = tf.RunMetadata() 
    sess.run(train_op, options=run_options, run_metadata=run_metadata) 

    # Create the Timeline object, and write it to a json 
    tl = timeline.Timeline(run_metadata.step_stats) 
    ctf = tl.generate_chrome_trace_format() 
    with open(path, 'w') as f: 
     f.write(ctf) 

write_timeline('timeline_1st_run.json') 
write_timeline('timeline_2nd_run.json') 

第一次运行总是比相应的以下运行更长的时间,是tensorflow做一些优化这里或在分配内存第一次?

timelines_first_runs

有人能解释这些inconistent结果? 为什么我的第二个实现在python中使用同一时间进行测量时,分析时间表显示它应该运行得更快?

回答

0

由于全局内存池增长,PTX编译和优化,首次运行可能需要更长的时间。

如下

sess = tf.Session(config=tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0))) 

然而,PTX编译仍然可以1-2秒添加到第一个运行你可以关闭一些优化。因此,为了分析目的,人们通常包括“预热”运行以在分析之前运行相同的计算。

此外,如果您的train_op类似于assignassign_add,则运行train_op会将结果提取回Python。 Python < - > TensorFlow内存传输未反映在时间轴上(grpc传输也丢失,跟踪issue)。对于剖析目的,你可以运行运算并省略了Python传递如下

sess.run(train_op.op) 
+0

关闭优化确实加快了首轮一点,并提出以下运行慢一点。 我的train_op是由'tf.train.Optimizer.minimize(loss)'生成的,它肯定会在内部执行'assign'等操作。 'sess.run(train_op)'返回'无',我是对的,这就排除了Python <-> TensorFlow内存传输的问题? 调用'sess.run([loss,train_op])'需要更长的时间。 难道还有另外一个原因,为什么两个实现需要相同的挂墙时间? – sejanDee

+0

返回'None'会排除Python内存传输的问题。您的高效率与低效率的实施似乎在时间轴上的时间相似(500 vs 700毫秒),您预热后的挂钟时间有多少差异? –

+0

上面的第一个时间线实际上是预热(10ms vs 110ms)。预热的挂钟时间为160ms和170ms,平均测量超过1000次。 – sejanDee