Оптимизация производительности TensorFlow с помощью профилировщика

В этом руководстве показано, как использовать инструменты, доступные с TensorFlow Profiler, для отслеживания производительности ваших моделей TensorFlow. Вы узнаете, как понять, как ваша модель работает на хосте (CPU), устройстве (GPU) или на комбинации хоста и устройства (а).

Профилирование помогает понять потребление аппаратных ресурсов (время и память) различными операциями (ops) TensorFlow в вашей модели, устранить узкие места в производительности и, в конечном итоге, ускорить выполнение модели.

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

Если вы хотите , чтобы профилирование производительности модели на облако TPU , обратитесь к руководству Облака ТПА .

Установите необходимые компоненты Profiler и GPU

Установите плагин Profiler для TensorBoard с помощью pip. Обратите внимание, что для профилировщика требуются последние версии TensorFlow и TensorBoard (> = 2.2).

pip install -U tensorboard_plugin_profile

Для профилирования на GPU необходимо:

  1. Знакомьтесь драйверы NVIDIA® GPU и требования CUDA® Toolkit , перечисленных на требованиях поддержки программного обеспечения TensorFlow GPU .
  2. Убедитесь , что NVIDIA® CUDA® профилированию Tools Interface (CUPTI) существует на пути:

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

Если у вас нет CUPTI на пути, снабдите его каталог установки в $LD_LIBRARY_PATH переменного окружения команды:

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

Затем запустите ldconfig команду выше еще раз , чтобы убедиться в том , что библиотека CUPTI найдена.

Решить проблемы с привилегиями

При запуске программы профилирования с CUDA® Toolkit в среде Докер или Linux, вы можете столкнуться с проблемами , связанные с недостаточными привилегиями CUPTI ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). Перейти к Docs NVIDIA Developer более узнать о том , как вы можете решить эти проблемы на Linux.

Чтобы решить проблемы с привилегиями CUPTI в среде Docker, запустите

docker run option '--privileged=true'

Инструменты профилировщика

Доступ к Profiler на вкладке Профиль в TensorBoard, который появляется только после того, как вы захватили некоторые данные модели.

В Profiler есть набор инструментов для анализа производительности:

  • Обзорная страница
  • Анализатор входного трубопровода
  • Статистика TensorFlow
  • Средство просмотра трассировки
  • Статистика ядра GPU
  • Инструмент профиля памяти
  • Pod Viewer

Обзорная страница

Страница обзора обеспечивает представление верхнего уровня о том, как ваша модель работала во время выполнения профиля. На этой странице представлена ​​сводная страница обзора для вашего хоста и всех устройств, а также некоторые рекомендации по повышению эффективности обучения вашей модели. Вы также можете выбрать отдельные хосты в раскрывающемся списке Host.

На странице обзора отображаются следующие данные:

изображение

  • Производительность Резюме: Отображает сводку высокого уровня вашей работы модели. Сводка производительности состоит из двух частей:

    1. Разбивка времени шага: разбивает среднее время шага на несколько категорий, на которые оно тратится:

      • Компиляция: время, затраченное на компиляцию ядер.
      • Вход: время, затраченное на чтение входных данных.
      • Вывод: время, затраченное на чтение выходных данных.
      • Запуск ядра: время, затрачиваемое хостом на запуск ядер.
      • Время вычислений хоста ..
      • Время связи между устройствами.
      • Время вычислений на устройстве.
      • Все остальные, включая накладные расходы Python.
    2. Точность вычислений устройства - сообщает процент времени вычислений устройства, в котором используются 16- и 32-разрядные вычисления.

  • Шаг времени График: отображает график этапа устройства времени (в миллисекундах) в течение всех этапов выборки. Каждый шаг разбит на несколько категорий (с разными цветами), на которые тратится время. Красная область соответствует части времени шага, в течение которого устройства бездействовали в ожидании входных данных от хоста. Зеленая область показывает, сколько времени устройство действительно работало.

  • Топ 10 TensorFlow операции на устройстве (например , GPU): отображает OPS на устройстве , которые шли дольше.

    Каждая строка отображает собственное время операции (в процентах от времени, затраченного на все операции), совокупное время, категорию и имя.

  • Запуск среда: Отображает резюме высокого уровня среды модели выполнения в том числе:

    • Количество используемых хостов.
    • Тип устройства (GPU / TPU).
    • Количество ядер устройства.
  • Рекомендации для следующего шага: Отчеты , когда модель ввода связана и рекомендует средства , которые можно использовать , чтобы найти и узкие места производительности решительности модели.

Анализатор входного трубопровода

Когда программа TensorFlow считывает данные из файла, она начинается с вершины графа TensorFlow конвейерным способом. Процесс чтения разделен на несколько этапов обработки данных, соединенных последовательно, где выход одного этапа является входом для следующего. Эта система чтения данных называются входным трубопроводом.

Типичный конвейер чтения записей из файлов состоит из следующих этапов:

  1. Чтение файлов.
  2. Предварительная обработка файлов (по желанию).
  3. Передача файлов с хоста на устройство.

Неэффективный конвейер ввода может серьезно замедлить работу вашего приложения. Заявка считается вход связан , когда он проводит значительную часть времени во входном трубопроводе. Используйте информацию, полученную с помощью анализатора входного конвейера, чтобы понять, где входной конвейер неэффективен.

Анализатор входного конвейера немедленно сообщает вам, связана ли ваша программа с входными данными, и проведет вас через анализ на стороне устройства и хоста для устранения узких мест производительности на любом этапе входного конвейера.

Ознакомьтесь с руководством по производительности конвейера ввода, чтобы узнать о передовых методах оптимизации конвейеров ввода данных.

Панель входного конвейера

Чтобы открыть анализатор трубопровода ввода, выберите профиль, а затем выберите input_pipeline_analyzer из инструментов выпадающего меню.

изображение

Панель управления состоит из трех разделов:

  1. Резюме: Обобщают общий входной трубопровод с информацией о ли ваше приложение вход связаны и, если да, то сколько.
  2. Устройство на стороне анализ: Отображает подробные результаты анализа на стороне устройства, в том числе устройства ступенчатого времени и диапазон времени устройства , проведенного в ожидании ввода данных между ядрами на каждом шаге.
  3. Хост-сторона анализ: показывает детальный анализ на стороне хоста, включая разбивку время обработки входного сигнала на хосте.

Сводка входного конвейера

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

Анализ на стороне устройства

Анализ на стороне устройства дает представление о времени, затраченном на устройство по сравнению с хостом, и о том, сколько времени устройство было потрачено на ожидание входных данных от хоста.

  1. Время Шага зависимости от количества номера шага: отображает график на шаге устройства времени (в миллисекундах) в течение всех этапов выборки. Каждый шаг разбит на несколько категорий (с разными цветами), на которые тратится время. Красная область соответствует части времени шага, в течение которого устройства бездействовали в ожидании входных данных от хоста. Зеленая область показывает, сколько времени устройство фактически работало.
  2. Статистика времени Шаг: Отчеты среднее, стандартное отклонение, и диапазон ([минимум, максимум]) времени шага устройства.

Анализ на стороне хоста

Анализ хост стороны сообщает разбивка времени обработки входного сигнала (время , затраченное на tf.data API ОПС) на хосте на несколько категорий:

  • Чтение данных из файлов по требованию: Время , затраченное на чтение данных из файлов без кэширования, предварительной выборки, и перемежения.
  • Чтение данных из файлов заранее: Время , затраченное на чтение файлов, включая кэширование, упреждающую выборку, и перемежения.
  • Данные предварительной обработки: Время , затраченное на предварительную обработку , опс, например декомпрессии изображения.
  • Enqueuing данные должны быть переданы на устройство: Время , затраченное на ввод данных в врезания очереди перед передачей данных в устройство.

Expand Input Op Статистика инспектировать статистику для отдельных входных ОПС и их категории с разбивкой по времени выполнения.

изображение

Появится таблица исходных данных с каждой записью, содержащей следующую информацию:

  1. Input Op: Показывает TensorFlow имя оп входного цит.
  2. Количество: Показывает общее количество экземпляров выполнения оп в течение периода профилирования.
  3. Общее время (в мс): Показывает накопленную сумму времени , затрачиваемого на каждый из этих случаев.
  4. Общее время%: показывает общее время , затраченное на опах в виде доли от общего времени , проведенного в обработке ввода.
  5. Всего себя Время (в мс): Показывает накопленную сумму времени , затрачиваемого на себе каждый из этих случаев. Самостоятельное время здесь измеряет время, проведенное внутри тела функции, за исключением времени, затраченного на функцию, которую она вызывает.
  6. Общее время самостоятельной%. Показывает общее собственное время как долю от общего времени, затраченного на обработку ввода.
  7. Категория. Показывает категорию обработки входной операции.

Статистика TensorFlow

Инструмент TensorFlow Stats отображает производительность каждой операции TensorFlow, которая выполняется на хосте или устройстве во время сеанса профилирования.

изображение

Инструмент отображает информацию о производительности на двух панелях:

  • На верхней панели отображается до четырех круговых диаграмм:

    1. Распределение времени самостоятельного выполнения каждой операции на хосте.
    2. Распределение времени самостоятельного выполнения каждого типа операции на хосте.
    3. Распределение времени самостоятельного выполнения каждой операции на устройстве.
    4. Распределение времени самостоятельного выполнения каждого типа операции на устройстве.
  • На нижней панели отображается таблица с данными об операциях TensorFlow с одной строкой для каждой операции и одним столбцом для каждого типа данных (сортируйте столбцы, щелкая заголовок столбца). Нажмите кнопку Экспорт в виде CSV на правой стороне верхней панели , чтобы экспортировать данные из этой таблицы в виде файла CSV.

    Обратите внимание, что:

    • Если у каких-либо операций есть дочерние операции:

      • Общее «накопленное» время операции включает время, проведенное внутри дочерней операции.

      • Общее "собственное" время операции не включает время, проведенное внутри дочерней операции.

    • Если операция выполняется на хосте:

      • Процент общего времени автономной работы на устройстве, понесенный операцией, будет равен 0.
      • Совокупный процент от общего времени автономной работы на устройстве до этой операции включительно будет равен 0.
    • Если на устройстве выполняется операция:

      • Процент общего времени нахождения на хосте, вызванный этой операцией, будет равен 0.
      • Совокупный процент от общего времени нахождения на хосте до этой операции включительно будет равен 0.

Вы можете включить или исключить время простоя в круговых диаграммах и таблице.

Средство просмотра трассировки

Средство просмотра трассировки отображает временную шкалу, которая показывает:

  • Продолжительность операций, которые были выполнены вашей моделью TensorFlow
  • Какая часть системы (хост или устройство) выполнила операцию. Обычно хост выполняет операции ввода, предварительно обрабатывает данные обучения и передает их на устройство, в то время как устройство выполняет фактическое обучение модели.

Средство просмотра трассировки позволяет выявлять проблемы с производительностью в вашей модели, а затем предпринимать шаги для их решения. Например, на высоком уровне вы можете определить, занимает ли обучение вводных данных или модели большую часть времени. Переходя вниз по иерархии, вы можете определить, какие операции выполняются дольше всего. Обратите внимание, что средство просмотра трассировки ограничено 1 миллионом событий на устройство.

Интерфейс программы просмотра трассировки

Когда вы открываете средство просмотра трассировки, оно отображает ваш последний запуск:

изображение

Этот экран содержит следующие основные элементы:

  1. Временная шкала панели: Показывает вуп устройство и хост выполняется в течение долгого времени.
  2. Детали панель: Показывает дополнительная информация для ОПС , выбранного на панели временной шкалы.

Панель временной шкалы содержит следующие элементы:

  1. Верхняя панель: Содержит различные вспомогательные элементы управления.
  2. Ось времени: Показывает время относительно начала следа.
  3. Раздел и путевой метки: Каждый раздел содержит несколько дорожек и имеет треугольник слева , что вы можете нажать , чтобы развернуть и свернуть раздел. Для каждого обрабатывающего элемента в системе есть одна секция.
  4. Инструмент селектор: Содержит различные инструменты для взаимодействия со зрителем трассировки , такие как масштабирование, панорамирование, Select и Timing. Используйте инструмент «Время», чтобы отметить временной интервал.
  5. События: Они показывают время , в течение которого выполняется операционный или длительность мета-событий, таких как учебные шаги.
Разделы и дорожки

Средство просмотра трассировки содержит следующие разделы:

  • Один из разделов для каждого узла устройства, меченных с номером чипа устройства и узлом устройства в пределах чипа (например, /device:GPU:0 (pid 0) ). Каждый раздел узла устройства содержит следующие дорожки:
    • Шаг: Показывает продолжительность учебных шагов , которые были запущены на устройстве
    • TensorFlow Ops: Показывает ППО , выполненные на устройстве
    • XLA Ops: Показывает XLA операции (OPS) , которая работала на устройстве , если XLA является компилятор используется (каждый TensorFlow цит переводится на один или несколько XLA опса XLA компилятор переводит XLA оп в код , который работает на устройстве.).
  • Одна секция для потоков , выполняющихся на CPU хост - компьютера, помеченный «Host Темы». Раздел содержит по одной дорожке для каждого потока ЦП. Обратите внимание, что вы можете игнорировать информацию, отображаемую рядом с метками разделов.
События

События на временной шкале отображаются разными цветами; сами цвета не имеют особого значения.

Средство просмотра трассировки также может отображать трассировки вызовов функций Python в вашей программе TensorFlow. Если вы используете tf.profiler.experimental.start API, вы можете включить Python трассировки с помощью ProfilerOptions namedtuple при запуске профилирования. С другой стороны , если вы используете режим выборки для профилирования, вы можете выбрать уровень трассировки с помощью раскрывающихся опций в диалоговом окне Capture Profile.

изображение

Статистика ядра GPU

Этот инструмент показывает статистику производительности и исходную операцию для каждого ядра с ускорением на GPU.

изображение

Инструмент отображает информацию на двух панелях:

  • На верхней панели отображается круговая диаграмма, на которой показаны ядра CUDA, у которых истекло наибольшее общее время.

  • На нижней панели отображается таблица со следующими данными для каждой уникальной пары ядро-оператор:

    • Ранг в порядке убывания общей истекшей продолжительности работы графического процессора, сгруппированный по парам ядро-операция.
    • Имя запущенного ядра.
    • Количество регистров графического процессора, используемых ядром.
    • Общий размер используемой совместно используемой памяти (статическая + динамическая совместно используемая) в байтах.
    • Размер блока выражается как blockDim.x, blockDim.y, blockDim.z .
    • Размеры сетки выражены как gridDim.x, gridDim.y, gridDim.z .
    • Независимо от того , ор , имеет право использовать Тензорные сердечники .
    • Содержит ли ядро ​​инструкции Tensor Core.
    • Имя оператора, запустившего это ядро.
    • Количество вхождений этой пары ядро-операция.
    • Общее время работы графического процессора в микросекундах.
    • Среднее время, затраченное на GPU в микросекундах.
    • Минимальное время работы графического процессора в микросекундах.
    • Максимальное затраченное время GPU в микросекундах.

Инструмент профиля памяти

В памяти профиль инструмент отслеживает использование памяти вашего устройства в течение интервала профилирования. Вы можете использовать этот инструмент, чтобы:

  • Устранение проблем с нехваткой памяти (OOM) путем определения пикового использования памяти и соответствующего выделения памяти для операций TensorFlow. Вы также можете отлаживать проблемы ОЫХ , которые могут возникнуть при запуске несколько аренды умозаключения.
  • Устранение проблем фрагментации памяти.

Инструмент профиля памяти отображает данные в трех разделах:

  1. Сводка профиля памяти
  2. График временной шкалы памяти
  3. Таблица разбивки памяти

Сводка профиля памяти

В этом разделе отображается высокоуровневый обзор профиля памяти вашей программы TensorFlow, как показано ниже:

Сводка профиля памяти состоит из шести полей:

  1. Память ID: Выпадающий в котором перечислены все доступные системы памяти устройства. В раскрывающемся списке выберите систему памяти, которую вы хотите просмотреть.
  2. #Allocation: количество выделений памяти , сделанные в течение интервала профилирования.
  3. #Deallocation: Количество deallocations памяти в интервале профилирования
  4. Объем памяти: Суммарная мощность (в ГИБСЕ) системы памяти , которые вы выбираете.
  5. Пик кучного Использование: Использование пика памяти (в Gibs) , так как модель начала работать.
  6. Использование Пик памяти: Использование пика памяти (в Gibs) в интервале профилирования. Это поле содержит следующие подполя:
    1. Отметка: Отметка времени, когда произошло использование пика памяти на временной шкале графика.
    2. Стек Оговорка: Объем памяти резервируется на стеке (в ошметки).
    3. Heap Распределение: Объем памяти выделяется в куче (в ошметки).
    4. Свободная память: Объем свободной памяти (в ошметки). Объем памяти - это сумма резервирования стека, распределения кучи и свободной памяти.
    5. Дробление: процент фрагментации (ниже , тем лучше). Он рассчитывается как процент от (1 - Size of the largest chunk of free memory / Total free memory) .

График временной шкалы памяти

В этом разделе отображается график использования памяти (в ГиБ) и процент фрагментации в зависимости от времени (в мс).

изображение

Ось X представляет собой временную шкалу (в мс) интервала профилирования. Ось Y слева представляет использование памяти (в ГиБ), а ось Y справа представляет процент фрагментации. В каждый момент времени по оси X общая память разбита на три категории: стек (красный), куча (оранжевый) и свободная (зеленый). Наведите указатель мыши на конкретную метку времени, чтобы просмотреть подробную информацию о событиях выделения / освобождения памяти в этот момент, как показано ниже:

изображение

Во всплывающем окне отображается следующая информация:

  • метка времени (мс): Расположение выбранного события на временной шкале.
  • событие: Тип события (выделение или открепление).
  • requested_size (Gibs): Объем памяти требуется. Это будет отрицательное число для событий освобождения.
  • allocation_size (Gibs): фактический объем памяти , выделенный. Это будет отрицательное число для событий освобождения.
  • tf_op: TensorFlow оп который запрашивает выделение / освобождение.
  • step_id: Учебный этап , в котором произошло это событие.
  • region_type: тип объекта данных , что эта выделенная память для. Возможные значения temp для временных, output для активации и градиентов, и persist / dynamic для весов и констант.
  • тип_данных: Тип тензора элемента (например, uint8 для 8-битового целого числа без знака).
  • tensor_shape: Форма тензора выделяется / высвобождены.
  • memory_in_use (Gibs): Общая память , которая используется в данный момент времени.

Таблица разбивки памяти

В этой таблице показано распределение активной памяти в момент пикового использования памяти в интервале профилирования.

изображение

Для каждой операции TensorFlow есть одна строка, и каждая строка содержит следующие столбцы:

  • Op Имя: Название TensorFlow соч.
  • Распределение размер (Gibs): Общий объем памяти , выделенный для этой ор.
  • Запрошенный Размер (планки): Общий объем памяти требуется для этого оп.
  • Проявления: Число распределений для этого оп.
  • Тип Регион: тип объекта данных , что эта выделенная память для. Возможные значения temp для временных, output для активации и градиентов, и persist / dynamic для весов и констант.
  • Тип данных: Тип Тензор элемент.
  • Форма: Форма выделенных тензоров.

Pod Viewer

Инструмент Pod Viewer показывает разбивку этапа обучения по всем работникам.

изображение

  • На верхней панели есть ползунок для выбора номера шага.
  • На нижней панели отображается столбчатая диаграмма с накоплением. Это высокоуровневое представление разбитых категорий времени шага, размещенных друг над другом. Каждый сложенный столбец представляет собой уникального рабочего.
  • Когда вы наводите курсор на сложенный столбец, карточка с левой стороны показывает более подробную информацию о разбивке по шагам.

tf.data анализ узких мест

tf.data инструмент анализа узких мест автоматически обнаруживает узкие места в tf.data входных трубопроводов в программе и дает рекомендации о том , как их исправить. Он работает с любой программой , использующей tf.data независимо от платформы (CPU / GPU / ТП). Его анализ и рекомендации основаны на данном руководстве .

Он обнаруживает узкое место, выполнив следующие действия:

  1. Найдите хост с наибольшей входной связью.
  2. Найти самое медленное выполнение tf.data входного трубопровода.
  3. Восстановите входной конвейерный граф из трассировки профилировщика.
  4. Найдите критический путь на входном конвейере.
  5. Определите самое медленное преобразование на критическом пути как узкое место.

Пользовательский интерфейс разделен на три секции: Анализ производительности Резюме, Резюме всех входных трубопроводов и трубопроводов ввода Graph.

Сводка анализа производительности

изображение

В этом разделе приводится сводка анализа. Он сообщает о медленных tf.data входных трубопроводов , обнаруженных в профиле. В этом разделе также показан хост с наибольшим ограничением ввода и его самый медленный конвейер ввода с максимальной задержкой. Что наиболее важно, он определяет, какая часть входного конвейера является узким местом и как это исправить. Информация об узком месте предоставляется с указанием типа итератора и его длинного имени.

Как читать длинное имя итератора tf.data

Длинное имя в формате Iterator::<Dataset_1>::...::<Dataset_n> . В конечном имя, <Dataset_n> соответствует типу итератора , а другие наборы данных в длинном имени представляют вниз по течению преобразования.

Например, рассмотрим следующий набор данных входного конвейера:

dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)

Длинные имена итераторов из вышеприведенного набора данных будут:

Тип итератора Длинное имя
Диапазон Итератор :: Пакет :: Повторить :: Карта :: Диапазон
карта Итератор :: Пакет :: Повторить :: Карта
Повторить Итератор :: Пакет :: Повторить
Партия Итератор :: Пакетный

Сводка всех входных конвейеров

изображение

В этом разделе представлена ​​сводка всех входных конвейеров на всех хостах. Обычно существует один входной конвейер. При использовании стратегии распределения, есть один входной трубопровод работает хост программы tf.data кода и несколько входных устройств трубопроводов извлечения данных из входного трубопровода хоста и передачи его к устройствам.

Для каждого входного конвейера отображается статистика времени его выполнения. Вызов считается медленным, если он длится более 50 мкс.

Входной конвейерный график

изображение

В этом разделе показан входной конвейерный график с информацией о времени выполнения. Вы можете использовать «Хост» и «Входной конвейер», чтобы выбрать, какой хост и входной конвейер просматривать. Исполнения входного трубопровода сортируется по времени исполнения в порядке , который вы можете выбрать с помощью выпадающего меню Ранга по убыванию.

изображение

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

В каждом узле, Start Time указывает время начала выполнения. Же узел может быть выполнен несколько раз, например, если есть Batch опы во входном трубопроводе. Если он выполняется несколько раз, это время начала первого выполнения.

Общая длительность этого время стены исполнения. Если он выполняется несколько раз, это сумма времени стены всех выполнений.

Само Время Общее время без перекрытого времени с его непосредственными дочерними узлами.

«# Calls» - это количество раз выполнения входного конвейера.

Собирать данные о производительности

Профилировщик TensorFlow собирает действия хоста и трассировки графического процессора вашей модели TensorFlow. Вы можете настроить Profiler для сбора данных о производительности либо в программном режиме, либо в режиме выборки.

Профилирующие API

Вы можете использовать следующие API-интерфейсы для выполнения профилирования.

  • Программный режим с использованием TensorBoard Keras Обратного вызова ( tf.keras.callbacks.TensorBoard )

    # Profile from batches 10 to 15
    tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir,
                                                 profile_batch='10, 15')
    
    # Train the model and use the TensorBoard Keras callback to collect
    # performance profiling data
    model.fit(train_data,
              steps_per_epoch=20,
              epochs=5,
              callbacks=[tb_callback])
    
  • Программный режим с использованием tf.profiler функции API

    tf.profiler.experimental.start('logdir')
    # Train the model here
    tf.profiler.experimental.stop()
    
  • Программный режим с использованием диспетчера контекста

    with tf.profiler.experimental.Profile('logdir'):
        # Train the model here
        pass
    

  • Режим выборка: Выполнение по требованию профилирования с помощью tf.profiler.experimental.server.start запустить сервер КПГР с вашей TensorFlow модели перспективы. После запуска сервера КПГР и работает модель, вы можете захватить профиль через кнопку Profile Capture в TensorBoard профиль плагина. Используйте сценарий в разделе «Установить профилировщик» выше, чтобы запустить экземпляр TensorBoard, если он еще не запущен.

    В качестве примера,

    # Start a profiler server before your model runs.
    tf.profiler.experimental.server.start(6009)
    # (Model code goes here).
    #  Send a request to the profiler server to collect a trace of your model.
    tf.profiler.experimental.client.trace('grpc://localhost:6009',
                                          'gs://your_tb_logdir', 2000)
    

    Пример профилирования нескольких воркеров:

    # E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you
    # would like to profile for a duration of 2 seconds.
    tf.profiler.experimental.client.trace(
        'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466',
        'gs://your_tb_logdir',
        2000)
    

Используйте диалоговое окно Capture профиля указать:

  • Разделенный запятыми список URL-адресов службы профилей или имен TPU.
  • Продолжительность профилирования.
  • Уровень отслеживания вызовов функций устройства, хоста и Python.
  • Сколько раз вы хотите, чтобы профилировщик повторил попытку захвата профилей, если сначала не удалось.

Профилирование пользовательских циклов обучения

Для профилирования пользовательских обучающих циклов в коде TensorFlow, инструмент тренировки петля с tf.profiler.experimental.Trace API , чтобы отметить ступенчатые границы для Profiler.

name аргумент используются в качестве префикса для имен шагов, то step_num аргумент ключевого слова добавляются в ступенчатых именах, а также _r аргумент ключевого слова делает этот след события обрабатываются как событие шага по Profiler.

В качестве примера,

for step in range(NUM_STEPS):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_data = next(dataset)
        train_step(train_data)

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

Убедитесь , что вы включили в набор данных итератор в пределах tf.profiler.experimental.Trace контекста для точного анализа входного трубопровода.

Приведенный ниже фрагмент кода является анти-шаблоном:

for step, train_data in enumerate(dataset):
    with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
        train_step(train_data)

Варианты использования профилирования

Профилировщик охватывает несколько вариантов использования по четырем разным осям. Некоторые комбинации в настоящее время поддерживаются, а другие будут добавлены в будущем. Некоторые из вариантов использования:

  • Локальное и удаленное профилирование: Эти два распространенных способа настройки вашей профилирование среды. При локальном профилировании API профилирования вызывается на том же компьютере, на котором выполняется ваша модель, например, на локальной рабочей станции с графическими процессорами. При удаленном профилировании API профилирования вызывается на компьютере, отличном от того, на котором выполняется ваша модель, например, на Cloud TPU.
  • Профилирование нескольких рабочих: Профилирование может несколько машин при использовании распределенных возможностей в обучении TensorFlow.
  • Аппаратная платформа: Профильные процессоры, графические процессоры и TPUs.

В таблице ниже представлен краткий обзор упомянутых выше вариантов использования с поддержкой TensorFlow:

Профилирование API Местный Удаленный Несколько рабочих Аппаратные платформы
Обратный вызов TensorBoard Keras Поддерживается Не поддерживается Не поддерживается CPU, GPU
tf.profiler.experimental старт / стоп API Поддерживается Не поддерживается Не поддерживается CPU, GPU
tf.profiler.experimental client.trace API Поддерживается Поддерживается Поддерживается CPU, GPU, TPU
API контекстного менеджера Поддерживается Не поддерживается Не поддерживается CPU, GPU

Лучшие практики для оптимальной работы модели

Используйте следующие рекомендации, применимые к вашим моделям TensorFlow, для достижения оптимальной производительности.

В общем, выполните все преобразования на устройстве и убедитесь, что вы используете последнюю совместимую версию библиотек, таких как cuDNN и Intel MKL, для вашей платформы.

Оптимизировать конвейер входных данных

Используйте данные из [#input_pipeline_analyzer], чтобы оптимизировать конвейер ввода данных. Эффективный конвейер ввода данных может значительно повысить скорость выполнения вашей модели за счет сокращения времени простоя устройства. Попробуйте включить лучшие практики , описанные в производительности лучше с API tf.data руководства и ниже , чтобы сделать ваш ввод данных трубопровода более эффективным.

  • В общем, распараллеливание любых операций, которые не нужно выполнять последовательно, может значительно оптимизировать конвейер ввода данных.

  • Во многих случаях это помогает изменить порядок некоторых вызовов или настроить аргументы так, чтобы он лучше всего работал для вашей модели. Оптимизируя конвейер входных данных, протестируйте только загрузчик данных без шагов обучения и обратного распространения, чтобы независимо количественно оценить эффект оптимизации.

  • Попробуйте запустить свою модель с синтетическими данными, чтобы проверить, не является ли входной конвейер узким местом для производительности.

  • Использование tf.data.Dataset.shard для обучения нескольких GPU. Убедитесь, что вы выполняете сегментирование на очень ранней стадии цикла ввода, чтобы предотвратить снижение пропускной способности. При работе с TFRecords убедитесь, что вы сегментировали список TFRecords, а не содержимое TFRecords.

  • Распараллеливание несколько ОПСА путем динамической установки значения num_parallel_calls с использованием tf.data.AUTOTUNE .

  • Рассмотрим ограничение использования tf.data.Dataset.from_generator как она медленнее по сравнению с чистыми TensorFlow опс.

  • Рассмотрим ограничение использования tf.py_function , поскольку она не может быть сериализовать и не поддерживается для работы в распределенной TensorFlow.

  • Используйте tf.data.Options для управления статическими оптимизаций к входному трубопроводу.

Также читайте tf.data анализа производительности руководство для более руководство по оптимизации ввода трубопровода.

Оптимизировать увеличение данных

При работе с данными изображения, сделать увеличение данных более эффективным путем литья с различными типами данных после применения пространственного преобразования, такие как листать, обрезка, поворот и т.д.

Используйте NVIDIA® DALI

В некоторых случаях, например, когда у вас есть система с высоким соотношением GPU к CPU, всех вышеперечисленных оптимизаций может быть недостаточно для устранения узких мест в загрузчике данных, вызванных ограничениями циклов ЦП.

Если вы используете графические процессоры NVIDIA® для компьютерного зрения и аудио глубоких приложений обучения, рассмотрите возможность использования Загрузки данных библиотеки ( DALI ) для ускорения конвейера данных.

Проверьте NVIDIA® DALI: Операции документации для получения списка поддерживаемых опс DALI.

Используйте многопоточность и параллельное выполнение

Запуск опс на несколько потоков процессора с tf.config.threading API , чтобы выполнить их быстрее.

TensorFlow автоматически устанавливает количество потоков параллелизма по умолчанию. Пул потоков, доступный для выполнения операций TensorFlow, зависит от количества доступных потоков ЦП.

Контроль максимального параллельного ускорения для одного цита с помощью tf.config.threading.set_intra_op_parallelism_threads . Обратите внимание, что если вы запускаете несколько операций параллельно, все они будут совместно использовать доступный пул потоков.

Если у вас есть независимый неблокируемый оп опа (с не ориентированным путем между ними на графике), используйте tf.config.threading.set_inter_op_parallelism_threads запускать их одновременно , используя имеющийся пул потоков.

Разнообразный

При работе с небольшими моделями на графических процессорах NVIDIA®, вы можете установить tf.compat.v1.ConfigProto.force_gpu_compatible=True , чтобы заставить все тензоры CPU должны быть выделены с CUDA возлагали памяти , чтобы дать значительный толчок производительности модели. Однако будьте осторожны при использовании этого параметра для неизвестных / очень больших моделей, поскольку это может отрицательно повлиять на производительность хоста (ЦП).

Повышение производительности устройства

Следуйте рекомендации , подробно здесь и в руководстве по оптимизации производительности GPU для оптимизации на устройстве производительности TensorFlow модели.

Если вы используете графические процессоры NVIDIA, зарегистрируйте использование графического процессора и памяти в файл CSV, запустив:

nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv

Настроить макет данных

При работе с данными, которые содержат информацию о канале (например, изображения), оптимизируйте формат макета данных, чтобы отдавать предпочтение последним каналам (NHWC вместо NCHW).

Канальный последние форматы данных улучшают Тензор Core , использование и обеспечивает значительное повышение производительности , особенно в сверточных моделях , когда в сочетании с AMP. Макеты данных NCHW по-прежнему могут использоваться тензорными ядрами, но вносят дополнительные накладные расходы из-за операций автоматического транспонирования.

Вы можете оптимизировать расположение данных предпочитают макеты NHWC, установив data_format="channels_last" для слоев , таких как tf.keras.layers.Conv2D , tf.keras.layers.Conv3D и tf.keras.layers.experimental.preprocessing.RandomRotation .

Использование tf.keras.backend.set_image_data_format для установки формата компоновки данных по умолчанию для серверной API Keras.

Максимально заполните кеш L2

When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.

import ctypes

_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128

Configure GPU thread usage

The GPU thread mode decides how GPU threads are used.

Set the thread mode to gpu_private to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.

import os

os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'

Configure GPU memory options

In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.

Also, use tf.config.experimental.set_memory_growth to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.

To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.

Miscellaneous

  • Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.

  • Disable reporting OOM errors during tensor allocation in production code. Set report_tensor_allocations_upon_oom=False in tf.compat.v1.RunOptions .

  • For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.

  • Use TF Stats to find out how efficiently on-device ops run.

  • Use tf.function to perform computations and optionally, enable the jit_compile=True flag ( tf.function(jit_compile=True ). To learn more, go to Use XLA tf.function .

  • Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.

  • Keep the device compute units busy.

  • Send data to multiple devices in parallel.

  • Consider using 16-bit numerical representations , such as fp16 —the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.

Additional resources

Known limitations

Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3

TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace API.

CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1 and libcupti.so.10.1 :

sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1