Сохраните дату! Google I / O возвращается 18-20 мая Зарегистрируйтесь сейчас
Эта страница переведена с помощью Cloud Translation API.
Switch to English

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

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

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

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

Если вы хотите профилировать производительность своей модели на Cloud TPU , обратитесь к руководству Cloud TPU .

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

Установите Profiler, загрузив и запустив скрипт install_and_run.py из репозитория GitHub .

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

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

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

Если у вас нет CUPTI на пути, добавьте его установочный каталог к $LD_LIBRARY_PATH среды $LD_LIBRARY_PATH , запустив:

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

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

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

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

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

docker run option '--privileged=true'

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

Получите доступ к профилировщику на вкладке « Профиль » в TensorBoard, которая появляется только после того, как вы захватили некоторые данные модели.

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

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

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

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

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

изображение

  • Сводка производительности - отображает общую сводку производительности вашей модели. Сводка производительности состоит из двух частей:

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

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

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

  • 10 основных операций TensorFlow на устройстве - отображает операции на устройстве, которые выполнялись дольше всех.

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

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

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

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

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

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

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

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

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

См. Руководство по производительности конвейера ввода для получения рекомендаций по оптимизации конвейеров ввода данных.

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

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

изображение

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

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

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

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

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

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

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

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

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

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

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

изображение

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

  1. Операция ввода - показывает имя операции ввода 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. Селектор инструментов - содержит различные инструменты для взаимодействия со средством просмотра трассировки, такие как масштабирование, панорамирование, выбор и синхронизация. Используйте инструмент «Время», чтобы отметить временной интервал.
  5. События - показывают время, в течение которого была выполнена операция, или продолжительность мета-событий, таких как шаги обучения.
Разделы и дорожки

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

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

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

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

изображение

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

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

изображение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

изображение

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

изображение

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

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

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

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

изображение

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

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

Pod Viewer

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

изображение

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

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

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

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

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

Пользовательский интерфейс разделен на три раздела: сводка анализа производительности, сводка всех входных конвейеров и график входных конвейеров.

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

изображение

В этом разделе приводится сводка анализа. Он сообщает, обнаружен ли в профиле медленный конвейер ввода 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 мкс.

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

изображение

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

изображение

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

В каждом узле «Время начала» указывает время начала выполнения. Один и тот же узел может выполняться несколько раз, например, если во входном конвейере есть Batch. Если он выполняется несколько раз, это время начала первого выполнения.

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

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

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

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

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

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

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

  • Программный режим с использованием обратного вызова tf.keras.callbacks.TensorBoard ( 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])
    
  • Программный режим с использованием API функции tf.profiler

    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() для запуска сервера gRPC с запуском вашей модели 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)
    

Используйте диалоговое окно « Захват профиля », чтобы указать:

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

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

Чтобы профилировать настраиваемые циклы обучения в коде TensorFlow, инструментируйте цикл обучения с tf.profiler.experimental.Trace API tf.profiler.experimental.Trace чтобы отметить границы шагов для профилировщика. Аргумент name используется в качестве префикса для имен step_num аргумент ключевого слова step_num добавляется к именам шагов, а аргумент ключевого слова _r заставляет это событие трассировки обрабатывать step_num как событие шага.

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

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 профилирования вызывается на компьютере, отличном от того, на котором выполняется ваша модель, например, на облачном TPU.
  • Профилирование нескольких рабочих: вы можете профилировать несколько машин при использовании возможностей распределенного обучения TensorFlow.
  • Аппаратная платформа: профильные процессоры, графические процессоры и TPU.

В таблице ниже представлен краткий обзор того, какие из приведенных выше вариантов использования поддерживаются различными API-интерфейсами профилирования в TensorFlow:

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

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

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

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

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

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

  • Предварительная выборка данных
  • Распараллелить извлечение данных
  • Распараллелить преобразование данных
  • Кэшировать данные в памяти
  • Векторизация пользовательских функций
  • Уменьшите использование памяти при применении преобразований

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

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

  • Увеличение размера обучающего мини-пакета (количество обучающих выборок, используемых на устройство за одну итерацию обучающего цикла)
  • Используйте статистику TF, чтобы узнать, насколько эффективно выполняются операции на устройстве
  • Используйте tf.function для выполнения вычислений и, при необходимости, включите флаг experimental_compile
  • Сведите к минимуму операции хоста Python между шагами и уменьшите количество обратных вызовов. Рассчитывайте показатели каждые несколько шагов, а не на каждом шаге
  • Держите вычислительные блоки устройства занятыми
  • Отправляйте данные на несколько устройств параллельно
  • Оптимизируйте компоновку данных, чтобы сначала отдавать предпочтение каналам (например, NCHW, а не NHWC). Некоторые графические процессоры, такие как NVIDIA® V100, лучше работают с форматом данных NHWC.
  • Рассмотрите возможность использования 16-битных числовых представлений, таких как fp16 , формат с плавающей запятой половинной точности, определенный IEEE, или формат Brain с плавающей запятой bfloat16
  • Рассмотрите возможность использования API смешанной точности Keras
  • При обучении на графических процессорах используйте TensorCore. Ядра графического процессора используют TensorCore, когда точность равна fp16, а размеры ввода / вывода делятся на 8 или 16 (для int8)

Дополнительные ресурсы

Известные ограничения

Профилирование нескольких графических процессоров на TensorFlow 2.2 и TensorFlow 2.3

TensorFlow 2.2 и 2.3 поддерживают профилирование нескольких графических процессоров только для систем с одним хостом; профилирование нескольких GPU для систем с несколькими хостами не поддерживается. Чтобы профилировать конфигурации графического процессора с несколькими рабочими, каждый рабочий должен быть профилирован независимо. В TensorFlow 2.4 можно профилировать несколько рабочих tf.profiler.experimental.trace API tf.profiler.experimental.trace .

Для профилирования нескольких графических процессоров требуется CUDA® Toolkit 10.2 или новее. Поскольку TensorFlow 2.2 и 2.3 поддерживают версии CUDA® Toolkit только до 10.1, создайте символические ссылки на libcudart.so.10.1 и 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