Я использую Tenorflow Profiler для профилирования моей модели, чтобы увидеть, сколько времени занимает каждая операция.Я нахожу какое-то странное поведение, например, операция Conv2D
, которая помещается на графический процессор (я установил log_device_placement=True
, чтобы увидеть размещение), также имеет большое время выполнения процессора.Вот код, который я использую для профилирования (tenorflow 1.4.0):
import tensorflow as tf
from tensorflow.python.profiler import option_builder
builder = option_builder.ProfileOptionBuilder
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
# run and collect metadata
my_session.run(fetch_something, feed_dict=feed_dict,
options=run_options, run_metadata=run_metadata)
profiler_opts = builder(builder.time_and_memory()).order_by('micros').build()
# this will output the following results
tf.profiler.profile(my_graph, run_meta=run_metadata, cmd='scope', options=profiler_opts)
Вот вывод профилировщика:
node name | requested bytes | total execution time | accelerator execution time | cpu execution time
MyScope/Conv2D (4511.35MB/4511.35MB, 823.47ms/823.47ms, 445.37ms/445.37ms, 378.11ms/378.11ms)
Из результата профилирования, Conv2D
операция (tf.nn.conv2d
) занимает 378,11 мс на процессоре и 445,37 мс на графическом процессоре.Почему тензор потока не использует только графический процессор для Conv2D
?Время процессора для передачи данных между памятью и графическим процессором, потому что эта операция занимает много памяти (4511,35 МБ)?
======== update ========
Другое явление, которое я только что нашел.Когда «запрашиваемые байты» Conv2D
велики (в моем случае> 4 ГБ), время выполнения ЦП велико (около 400 ~ 500 мс).Когда «запрашиваемых байтов» мало (в моем случае 1,5 ГБ), время выполнения ЦП короткое (около 15 мс).Я предполагаю, что время выполнения процессора Conv2D
связано с потреблением памяти.Однако я не понимаю, почему в другой партии (my_session.run
) Conv2D
использует разное количество «запрошенных байтов».Тензор, к которому применяется Conv2D
, имеет почти одинаковый размер для разных партий.