Мегамасштабный просмотрщик

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

Доступ к инструменту

Чтобы получить доступ к инструменту, откройте профиль в xprof, затем перейдите к пункту «Megascale Viewer» в выпадающем списке «Инструменты» на левой боковой панели. Выберите хост в выпадающем списке «Хосты», затем нажмите кнопку «Открыть в Perfetto».

Скриншот, демонстрирующий выпадающий список и кнопку.

Схема трассировки

После завершения загрузки трассировки инструментом вы увидите раздел «Глобальные счетчики», содержащий несколько строк счетчиков (например, использование сети). Эти счетчики суммируются по всем мегамасштабным группам на всех профилированных TPU на выбранном хосте. Ниже вы увидите раздел «TPU», отображающий все TPU.

Скриншот, демонстрирующий расположение трассировки в пользовательском интерфейсе Perfetto.

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

  • Шаги : отображает этапы обучения (отслеживаемые xprof).
  • Модули XLA : Отображает все выполнения/запуски всех программ XLA, которые работали в течение профилируемого периода.
  • XLA Ops : Отображает все операции XLA (и пользовательские ядра), работающие на TPU.
  • XLA TraceMe : Отображает события синхронизации (например, barrier-cores).
  • Мегамасштаб : Это родительский трек, который содержит дочерний трек для каждого уникального коллектива Мегамасштаба.

Скриншот, демонстрирующий линии TPU в пользовательском интерфейсе Perfetto.

Развернув родительскую дорожку Megascale, можно обнаружить множество дочерних дорожек; по одной на каждый коллектив мегамасштаба. Название каждой дорожки — это имя коллектива мегамасштаба. Число в скобках — это идентификатор устройства мегамасштаба локального TPU, который представляет собой комбинацию идентификатора среза и логического идентификатора TPU. События, отображаемые в этой дорожке, представляют собой граф действий этого коллектива мегамасштаба. Эти события помогают понять время, затраченное на обработку сети и хоста, и как оно влияет на время задержки при получении или отправке данных.

Скриншот, демонстрирующий линии мегамасштаба в пользовательском интерфейсе Perfetto.

Подключение операций TPU к масштабируемому графу действий

При анализе медленной операции TPU в мегамасштабе (например, recv-done) обычно следующим шагом является переход к соответствующему графу выполнения действий в мегамасштабе. Это можно сделать, щелкнув по интересующей операции recv-done, а затем щелкнув по соответствующему событию «recv-done END» на нижней панели в пользовательском интерфейсе Perfetto.

Скриншот, показывающий ссылки на события recv-done до и после них.

После нажатия на событие «END» в пользовательском интерфейсе появится стрелка потока, отображающая выполнение масштабного графа, которое разблокирует выбранное событие recv-done.

Скриншот, показывающий стрелку потока от события Megascale H2D к концу приема-завершения TPU.

Вы также можете щелкнуть по мгновенному событию «DeviceToHost START» в начале строки графика действий, чтобы увидеть соответствующую операцию «отправить» на TPU.

Скриншот, показывающий стрелку потока от TPU, отправляющую данные в начало Megascale DeviceToHost.

События на дорожках Megascale свернуты таким образом, что в любой момент времени отображается только одно событие. Это сделано для того, чтобы избежать одновременного отображения всех активных действий и уменьшить загромождение экрана. В любой момент времени одновременно выполняется несколько действий. В этой свернутой строке отображается то действие, которое завершится первым. Для получения дополнительной информации (например, реального времени начала события, задержки сети, идентификаторов одноранговых устройств) обратитесь к аргументам события на нижней панели в пользовательском интерфейсе Perfetto.

Скриншот, демонстрирующий аргументы события Megascale NetworkSend.

На приведенном выше примере видно, что событие «NetworkSend END» отображается в пользовательском интерфейсе в виде фрагмента длительностью 13,5 миллисекунд. Реальная длительность этого действия указана в аргументе события «action_duration_ns» и составляет 20,6 миллисекунд.

Просмотр статистики и поиск интересных событий

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

Запросы PerfettoSQL можно вводить на странице «Запрос (SQL)» в левой панели пользовательского интерфейса Perfetto. Пример запроса ниже показывает все экземпляры операции recv-done.28 . Затем с помощью пользовательского интерфейса их список отображается в порядке убывания длительности.

Скриншот, демонстрирующий результаты SQL-запроса Perfetto для recv-done.28

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

Примеры запросов

Здесь можно найти несколько полезных примеров запросов.

Пример пользовательского пути

Предположим, мы хотим выяснить, какой из вызовов recv-done вносит наибольший вклад в общее время выполнения шага. Мы можем сделать это, используя запрос recv-done stats и отсортировав результаты по параметру 'duration_ns_sum'.

Скриншот, демонстрирующий результаты макроса recv-done stats.

В этом примере мы видим, что recv-done.28 вносит наибольший вклад (~2,2 секунды из общей продолжительности профиля около 14 секунд). Мы также видим, что продолжительность tail/p99 для этой операции значительно выше медианы и среднего значения. Это говорит о том, что есть возможности для улучшения.

(Необязательно) Построение графика задержки приема-выполнения

Иногда также полезно посмотреть на линейный график продолжительности во времени. Мы можем сделать это, используя запрос «recv-done ops», а затем, используя функцию Perfetto «Add debug track», добавить треки типа «counter».

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

Результаты приведены ниже. Мы видим, что recv-done.28 действительно имеет гораздо большую продолжительность в определенные моменты времени (обычно в начале или конце этапа обучения). Мы видим, что многие другие операции recv-done также имеют высокую дисперсию.

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

Найти медленные экземпляры recv-done

Давайте найдем медленный экземпляр этой операции, изменив запрос «recv-done ops» таким образом, чтобы он фокусировался только на recv-done.28.

Скриншот, демонстрирующий редактирование SQL-запроса в пользовательском интерфейсе Perfetto.

Здесь мы можем отсортировать выходные данные по любому столбцу, а затем щелкнуть ссылку в столбце «id», чтобы перейти к этому событию в режиме временной шкалы. В данном случае самое медленное событие приходится на TPU 1.

Скриншот, демонстрирующий, как перейти к событию в режиме временной шкалы из таблицы SQL. Результаты

На этом этапе вы можете либо вручную увеличить масштаб события (с помощью мыши или клавиш WASD на клавиатуре), либо нажать клавишу «F» на клавиатуре, чтобы перейти к этому событию и полностью увеличить его масштаб.

Отсюда вы можете изучить сетевые линии (возможно, во время выполнения этой операции загрузка сети была максимальной?). Вы также можете перейти к графику мегамасштаба этой операции, щелкнув стрелку «recv-done END», как показано в предыдущем разделе.

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

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

Чтобы лучше понять, почему операция recv-done заняла так много времени, можно посмотреть события на графике мегамасштаба. В данном случае одной из потенциальных проблем является высокая задержка сети для некоторых входящих передач. Например, последняя операция NetworkReceive заняла 27 миллисекунд для передачи 3,5 МиБ, что слишком долго.

Обратите внимание, что длительность фрагмента "NetworkReceive END" составляет 11 мс 36 мкс. Эта длительность, по сути, бессмысленна и является артефактом способа отображения действий Megascale в одной строке. Реальная длительность действия (action_duration_ns) составляет 47,2 миллисекунды. На сетевую задержку приходится 27 миллисекунд из этого значения.

Скриншот, показывающий задержку передачи данных по сети и размер передаваемых данных для действия NetworkReceive.