Могу ли я измерить время выполнения отдельных операций с помощью TensorFlow?

Я знаю, что могу измерить время выполнения вызова sess.run() , но возможно ли получить более тонкую детализацию и измерить время выполнения отдельных операций?

9 Solutions collect form web for “Могу ли я измерить время выполнения отдельных операций с помощью TensorFlow?”

В публичном выпуске еще нет способа сделать это. Мы знаем, что это важная функция, и мы над этим работаем.

Я использовал объект Timeline для получения времени выполнения для каждого узла в графике:

  • вы используете classический 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 . Вы должны увидеть что-то вроде:

график

Вы можете извлечь эту информацию, используя статистику времени выполнения . Вам нужно будет сделать что-то вроде этого (см. Полный пример в вышеупомянутой ссылке):

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

Лучше, чем просто распечатать его, вы можете увидеть его в тензодаре:

Кроме того, при щелчке по узлу будут отображаться точные значения суммарной памяти, времени вычисления и тензора.

[Пример из ссылки

Чтобы обновить этот ответ, у нас есть некоторые функции для профилирования CPU, ориентированные на вывод. Если вы посмотрите на https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/benchmark, вы увидите программу, которую вы можете запустить на модели, чтобы получить тайм-ауты за операцию.

Так как это очень важно, когда вы отправляете поисковые запросы для «Профилирования Tensorflow», обратите внимание, что текущий (конец 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]) 

Для комментариев fat-lobyte под ответом Оливье Моиндро , если вы хотите собрать временную шкалу во всех сеансах, вы можете изменить « open('timeline.json', 'w') « open('timeline.json', 'a') “.

Начиная с Tensorflow 1.8, есть действительно хороший пример использования tf.profile.Profiler здесь .

Для профилирования сеансов TensorFlow вы можете использовать профилировщик StackImpact . Нет необходимости проводить сеансы инструмента или добавлять какие-либо параметры. Вам просто нужно инициализировать профайлер:

 import stackimpact agent = stackimpact.start( agent_key = 'agent key here', app_name = 'MyApp') 

Оба профиля времени выполнения и профили памяти будут доступны в Личном кабинете.

Подробная информация в этой статье: Профилирование TensorFlow в средах разработки и производства .

Отказ от ответственности: я работаю для StackImpact.

Недавно выпущенная пользовательской операционной библиотекой Uber SBNet ( http://www.github.com/uber/sbnet ) реализована таймер, основанный на событии 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 

Обратите внимание, что любая часть подграфа может быть асинхронной, вы должны быть очень осторожны с указанием всех зависимостей ввода и вывода для ops таймера. В противном случае таймер может быть вставлен в график не по порядку, и вы можете получить ошибочное время. Я нашел временную шкалу и время time.time () для очень ограниченной утилиты для профилирования графиков Tensorflow. Также обратите внимание, что API-интерфейсы cuda_timer будут синхронизироваться по streamу по умолчанию, который в настоящее время разработан, потому что TF использует несколько streamов.

Сказав это, я лично рекомендую перейти на PyTorch 🙂 Итерация развития быстрее, код работает быстрее, и все намного менее болезненно.

Еще один хакерский и тайный подход к вычитанию накладных расходов из tf.Session (который может быть огромным) заключается в том, чтобы реплицировать график N раз и запустить его для переменной N, решая для уравнения неизвестных фиксированных накладных расходов. Т.е. вы будете измерять вокруг session.run () с N1 = 10 и N2 = 20, и вы знаете, что ваше время равно t, а накладные расходы – x. Так что-то вроде

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

Решите для x и t. Даунсайд – это может потребовать много памяти и не обязательно точно 🙂 Также убедитесь, что ваши входы полностью разные / случайные / независимые, иначе TF сбрасывает весь подграф и не запускает его N раз … Веселитесь с TensorFlow: )

  • Работа с несколькими графиками в TensorFlow
  • Как понять статическую форму и динамическую форму в TensorFlow?
  • TensorFlow не найден с использованием pip
  • Ошибка установки Tensorflow: не поддерживается колесо на этой платформе
  • Как я могу определить только gradleиент для подграфа Tensorflow?
  • После создания TensorFlow из источника, видя ошибки libcudart.so и libcudnn
  • Tensorflow: ImportError: libcusolver.so.8.0: невозможно открыть файл общих объектов: нет такого файла или каталога
  • Как тензоры имен TensorFlow?
  • Как создать и использовать Google TensorFlow C ++ api
  • Interesting Posts

    Как объединить несколько строк на C ++ в одной строке?

    Как блоки CUDA делятся на перекосы?

    Скопируйте расширения Chrome с одного компьютера на другой

    Как я могу глобально настроить ориентацию экрана в Android?

    Компьютер Windows 10 не может подключиться к другому компьютеру в сети

    Что означает поддержка «Legacy USB Mouse» в BIOS?

    Получение последней записи в каждой группе из базы данных – SQL Server 2005/2008

    Android – распаковать папку?

    Безопасно удалить OSX's / private / var / folders / * при перезагрузке?

    Какие заголовки в стандартной библиотеке C ++ гарантированно include другой заголовок?

    Как правильно выйти из приложения C #?

    Как я могу подсчитать уникальные значения, разделенные запятыми, в Excel 2010

    Как предотвратить свертывание строк SQL Injection

    Почему вложенные веса плохо подходят для производительности? Альтернативы?

    Как переместить врага в сторону движущегося игрока?

    Давайте будем гением компьютера.