Некоторое время я замечал, что TensorFlow (v0.8), похоже, не полностью использует вычислительную мощность моего Titan X. Для нескольких CNN, которые я использовал для использования GPU, похоже, не превышает ~ 30 %. Как правило, использование графического процессора еще ниже, более 15%. Один конкретный пример CNN, который показывает это поведение, - это CNN из документа DeepMind Atari с Q-обучением (см. Ссылку ниже для кода).
Когда я вижу других людей из нашей лаборатории, на которых работают CNN, написанные на Theano или Torch, использование GPU обычно составляет 80%+. Это заставляет меня задаться вопросом, почему CNN, которые я пишу в TensorFlow так "медленно", и что я могу сделать, чтобы более эффективно использовать вычислительную мощность GPU? Как правило, меня интересуют способы профилирования операций GPU и выяснения того, где эти узкие места. Любые рекомендации, как это сделать, очень приветствуются, поскольку в данный момент это невозможно сделать с TensorFlow.
Что я сделал, чтобы узнать больше о причине этой проблемы:
-
Анализ размещения устройства TensorFlow , все, кажется, находится на gpu:/0, поэтому выглядит нормально.
-
Используя cProfile, я оптимизировал процесс генерации пакетов и других шагов предварительной обработки. Предварительная обработка выполняется в одном потоке, но фактическая оптимизация, выполняемая шагами TensorFlow, занимает гораздо больше времени (см. Среднее время работы ниже). Одна очевидная идея увеличить скорость - это использовать бегуны очереди TFs, но поскольку подготовка партии уже в 20 раз быстрее, чем оптимизация, я задаюсь вопросом, будет ли это иметь большое значение.
Avg. Time Batch Preparation: 0.001 seconds Avg. Time Train Operation: 0.021 seconds Avg. Time Total per Batch: 0.022 seconds (45.18 batches/second)
-
Запустите на нескольких машинах, чтобы исключить аппаратные проблемы.
-
Обновлено до последних версий CuDNN v5 (RC), CUDA Toolkit 7.5 и переустановлено TensorFlow из источников около недели назад.
Пример Q-обучения CNN, для которого эта "проблема" встречается, можно найти здесь: https://github.com/tomrunia/DeepReinforcementLearning-Atari/blob/master/qnetwork.py
Пример NVIDIA SMI, показывающий использование низкого использования графического процессора: NVIDIA-SMI