Я знаю, что могу измерить время выполнения вызова sess.run()
, но возможно ли получить более точную детализацию и измерить время выполнения отдельных операций?
Могу ли я измерить время выполнения отдельных операций с помощью TensorFlow?
Ответ 1
В публичном выпуске еще нет способа сделать это. Мы знаем, что это важная функция, и мы над этим работаем.
Ответ 2
Я использовал объект Timeline
, чтобы получить время выполнения для каждого node в графике:
- вы используете классический
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, перейти на страницу chrome://tracing
и загрузить файл timeline.json
.
Вы должны увидеть что-то вроде:
Ответ 3
Вы можете извлечь эту информацию, используя статистику времени выполнения. Вам нужно будет сделать что-то подобное (проверьте полный пример в вышеупомянутой ссылке):
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)
Лучше, чем просто его распечатать, вы можете увидеть его в тензодаре:
Кроме того, нажатие на node отображает точную общую память, времени вычисления и размерах тензора.
Ответ 4
Чтобы обновить этот ответ, у нас есть некоторые функции для профилирования CPU, ориентированные на вывод. Если вы посмотрите на https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/benchmark, вы увидите программу, которую вы можете запустить на модели, чтобы получить тайм-ауты для каждого.
Ответ 5
Для комментариев жир-лобита под ответом Оливье Моиндро, если вы хотите собрать временную шкалу на протяжении всех сеансов, вы можете изменить "open('timeline.json', 'w')
" на "open('timeline.json', 'a')
".
Ответ 6
Так как это очень важно, когда googling для "Tensorflow Profiling", обратите внимание, что текущий (конец 2017, TensorFlow 1.4) способ получения временной шкалы использует ProfilerHook. Это работает с MonitoredSessions в tf.Estimator, где tf.RunOptions недоступны.
estimator = tf.estimator.Estimator(model_fn=...)
hook = tf.train.ProfilerHook(save_steps=10, output_dir='.')
estimator.train(input_fn=..., steps=..., hooks=[hook])