При вызове tf.Сессия.run, важно ли для производительности минимизировать то, что извлекается?

В Tensorflow fetchesаргумент to tf.Session.runслужит двум целям: он обеспечивает выполнение определенных операций и возвращает значения python. Мой вопрос заключается в том, насколько я должен быть обеспокоен, чтобы избежать возвращения ценностей, которые мне на самом деле не нужны. Например, предположим, что op aзависит от opb, так что if abбудет тоже. Можно ли это сделать быстрее

a = sess.run([a])

чем заняться

a, _ = sess.run([a,b])

потому что последний будет копировать выход bиз GPU в CPU только для того, чтобы он был отброшен? Если aна стороне python требуется только часть информации, обычно ли хорошо делать тензор, зависящий от aтого, что только имеет именно то, что нужно, и получать это вместо aэтого ? Или я неправильно понимаю, как работают эти передачи GPU-CPU? Я думаю, что можно профилировать, сколько времени тратится на такие переводы (например, см. графики здесь: https://github.com/tensorflow/tensorflow/issues/4526), но я еще не понимаю, как это сделать, и я хотел бы знать, правильно ли я, по крайней мере, концептуализирую вещи, независимо от того, является ли мое конкретное приложение узким местом здесь.

1 ответ

  1. Это относительно важно, потому что оболочка python должна преобразовать из памяти тензора C++ в массив python numpy, таким образом выполняя операцию копирования. Если вы получаете большие переменные, время может быть не тривиальным, подумайте о 1 ГБ, которые должны быть преобразованы каждый раз.