program tip

TensorFlow로 개별 작업의 실행 시간을 측정 할 수 있습니까?

radiobox 2020. 11. 10. 08:00
반응형

TensorFlow로 개별 작업의 실행 시간을 측정 할 수 있습니까?


에 대한 호출의 실행 시간을 측정 할 수 sess.run()있지만 더 세분화하여 개별 작업의 실행 시간을 측정 할 수 있습니까?


공개 릴리스에서는 아직이 작업을 수행 할 방법이 없습니다. 우리는 이것이 중요한 기능이라는 것을 알고 있으며이를 위해 노력하고 있습니다.


Timeline객체사용 하여 그래프의 각 노드에 대한 실행 시간을 얻었습니다.

  • 클래식을 사용 sess.run()하지만 선택적 인수를 지정 options하고run_metadata
  • 그런 다음 데이터 Timeline개체 를 만듭니다.run_metadata.step_stats

다음은 행렬 곱셈의 성능을 측정하는 예제 프로그램입니다.

import tensorflow as tf
from tensorflow.python.client import timeline

x = tf.random_normal([1000, 1000])
y = tf.random_normal([1000, 1000])
res = tf.matmul(x, y)

# Run the graph with full trace option
with tf.Session() as sess:
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
    run_metadata = tf.RunMetadata()
    sess.run(res, 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('timeline.json', 'w') as f:
        f.write(ctf)

그런 다음 Google 크롬을 열고 페이지로 이동 chrome://tracing하여 timeline.json파일을 로드 할 수 있습니다. 다음과 같은 내용이 표시되어야합니다.

타임 라인


이것은 "Tensorflow Profiling"을 검색 할 때 높기 때문에 현재 (2017 년 말, TensorFlow 1.4) 타임 라인을 가져 오는 방법은 ProfilerHook을 사용하는 것 입니다. 이것은 tf.RunOptions를 사용할 수없는 tf.Estimator의 MonitoredSessions와 함께 작동합니다.

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

런타임 통계를 사용하여이 정보를 추출 할 수 있습니다 . 다음과 같은 작업을 수행해야합니다 (위에 언급 된 링크에서 전체 예제 확인).

run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
sess.run(<values_you_want_to_execute>, options=run_options, run_metadata=run_metadata)
your_writer.add_run_metadata(run_metadata, 'step%d' % i)

인쇄하는 것보다 텐서 보드에서 볼 수 있습니다.

또한 노드를 클릭하면 정확한 총 메모리, 계산 시간 및 텐서 출력 크기가 표시됩니다.

[Example from link


To update this answer, we do have some functionality for CPU profiling, focused on inference. If you look at https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/benchmark you'll see a program you can run on a model to get per-op timings.


For the comments of fat-lobyte under Olivier Moindrot's answer, if you want to gather the timeline over all sessions, you can change "open('timeline.json', 'w')" to "open('timeline.json', 'a')".


As of Tensorflow 1.8, there's a really good example for using the tf.profile.Profiler here.


Recently released by Uber SBNet custom op library (http://www.github.com/uber/sbnet) has an implementation of cuda event based timers, which can be used in the following manner:

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

Note that any portion of subgraph can be asynchronous you should be very careful with specifying all the input and output dependencies for the timer ops. Otherwise the timer might get inserted into the graph out of order and you can get erroneous time. I found both the timeline and time.time() timing of very limited utility for profiling Tensorflow graphs. Also note that cuda_timer APIs will synchronize on default stream, which is currently by design because TF uses multiple streams.

Having said this I personally recommend switching to PyTorch :) Development iteration is faster, code runs faster and everything is a lot less painful.

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를 즐기십시오. )

참고 URL : https://stackoverflow.com/questions/34293714/can-i-measure-the-execution-time-of-individual-operations-with-tensorflow

반응형