Tensorflow - Профиль Custom Op
Мне интересен способ измерить детальную производительность пользовательского Tensorflow Op при работе на GPU.
До сих пор я пробовал подход этого поста, используя временную шкалу, а также внутренний Tensorflow Profiler (tf.profiler.Profiler
). Оба дают очень похожие результаты, что хорошо, если я хочу исследовать сеть, но для профилирования одного операционного вывода вывод слишком грубый и не включает внутриоперационные вычисления (по крайней мере, я не мог найти способ для этого), Моя следующая попытка была с использованием профилировщика CUDA nvprof
(или же nvvp
в этом отношении), который в более правильном направлении отображает одиночные обращения к ядрам CUDA и выделению памяти. Но теперь, вычисления процессора не включены. Я пробовал бегать nvprof --cpu-profiling on
, но теперь профилировщик никогда не заканчивает (см. здесь)
Мой сценарий таков: я написал собственную операционную систему, которая очень похожа на свертку в 2D и не должна занимать намного больше времени для вычисления. В сети производительность моей пользовательской операции примерно в 3 раза хуже, чем tf.nn.conv2d
, С использованием tf.profiler.Profiler
Я получаю следующее:
Profile:
node name | requested bytes | total execution time | accelerator execution time | cpu execution time
CustomConv2DBackpropInput 72.09MB (100.00%, 7.04%), 194.36ms (100.00%, 38.05%), 49.82ms (100.00%, 17.61%), 144.54ms (100.00%, 63.44%)
CustomConv2D 65.54MB (92.96%, 6.40%), 95.41ms (61.95%, 18.68%), 45.16ms (82.39%, 15.96%), 50.25ms (36.56%, 22.06%)
CustomConv2DBackpropFilter 134.48MB (86.55%, 13.14%), 72.39ms (43.27%, 14.17%), 41.22ms (66.44%, 14.56%), 31.17ms (14.50%, 13.68%)
Conv2DBackpropFilter 294.68MB (73.41%, 28.79%), 63.39ms (29.10%, 12.41%), 62.80ms (51.87%, 22.19%), 594us (0.82%, 0.26%)
Conv2DBackpropInput 230.97MB (44.62%, 22.57%), 48.77ms (16.69%, 9.55%), 48.16ms (29.68%, 17.02%), 610us (0.56%, 0.27%)
Conv2D 225.74MB (22.06%, 22.06%), 36.50ms (7.15%, 7.15%), 35.84ms (12.66%, 12.66%), 664us (0.29%, 0.29%)
Поэтому мне кажется, что мои пользовательские операции занимают примерно столько же времени на GPU, но более чем на порядок дольше на процессоре. Для операции с графическим процессором это неприемлемо, и я хотел бы выяснить, где мои сотрудники проводят это время на процессоре. Что меня еще больше удивляет, так это то, что мои Ops, кажется, выделяют только одну треть памяти GPU, как это делают оригинальные Conv Ops.
Есть ли способ получить подробный профиль моей пользовательской операции (который включает использование процессора и графического процессора), который может объяснить мне, что я сделал неправильно, и помочь мне исправить мои ошибки?