Пользовательское профилирование звонков

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

Как включить трассировку

Установите следующий флаг XLA для перекомпиляции рабочей нагрузки с использованием инструментирования:

--xla_xprof_enable_custom_call_tracing=true

Если вы используете Cloud TPU с параметром LIBTPU_INIT_ARGS , вы можете передать его следующим образом:

LIBTPU_INIT_ARGS="--xla_xprof_enable_custom_call_tracing=true --xla_xprof_register_llo_debug_info=true" python your_jax_workload.py

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

Вот пример того, как выглядят трассировки LLO в программе просмотра трассировок Xprof:

LLO Trace OpsИнструкции по отслеживанию LLO


Расширенные параметры (Обработка пропущенных событий)

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

Эти параметры настраиваются через xla_tpu_bundle_instrumentation_options . Вы можете контролировать, как часто трассировки упаковываются в пакеты инструкций.

Ключевые параметры:

  • trace_best_effort_frequency (По умолчанию: 10): Целевой интервал (в пакетах) для вставки трассировок, упакованных в существующие пакеты. Компилятор будет пытаться вставить трассировку с такой частотой, но не будет создавать для нее новые пакеты.
  • trace_guaranteed_frequency (По умолчанию: 10): Максимальное количество пакетов, разрешенных между двумя трассировками. Это гарантированное значение. Если мы не можем обеспечить это значение путем упаковки трассировок в существующие пакеты, мы создадим новый пакет и поместим трассировку туда (отдельно).

Как настроить:

  • Если вы видите сообщение "Пропуск событий" : увеличьте значения (например, установите значение 50 или 100), чтобы трассировка выполнялась реже , что уменьшит объем генерируемых данных трассировки.
  • Если вам нужна более высокая детализация : уменьшите количество значений, которые необходимо отслеживать чаще (ценой увеличения накладных расходов и потенциального переполнения буфера).

Как рассчитывается количество циклов выполнения инструкций

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

Компилятор вычисляет внутреннюю стоимость аппаратных циклов каждой инструкции LLO на основе целевого поколения TPU и исполнительного блока, который её обрабатывает. Эти значения количества циклов представляют собой пропускную способность выполнения и задержки.

Поток высокого уровня

  1. Инструкция по разбору LLO : Определите код операции и метаданные.
  2. Получение базовых аппаратных циклов : определение циклов на основе поколения TPU (v5e/v5p, v6e/v7x и т. д.).
  3. Преобразование в такты глобального счетчика таймера (GTC) : Преобразуйте циклы в такты глобального счетчика таймера (GTC), используя формулу: Cycles * (GTC_Freq * 16) / TC_Freq .
  4. Создать временной интервал : равномерно интерполировать промежуточные события между известными границами трассировки.

Расчеты циклов по энергоблокам и источникам генерации

Ниже приведены примеры моделирования базовых аппаратных циклов для различных исполнительных блоков:

Блок матричного умножения (MXU)

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

Категория инструкций Подтип / Формат (v5e/v5p) (v6e/v7x)
Вектор Матмул Ф32 8 8
Предварительная обработка матричных уравнений (F8 до BF16) 4 4
Упакованный BF16 2 2
Целочисленные форматы (U8, S8, U4, S4) 1 1
Векторные защелки Транспонированный F32 4 4
Транспонированный BF16 8 8
Нетранспонированный F32 2 2
Нетранспонированный BF16 4 4
Matprep / Dwg Все 1 1
Транспонированный блок (XLU)

Количество циклов отражает задержки транспонирования в памяти и задержки кроссбара.

Категория инструкций Подтип / Формат (v5e/v5p) (v6e/v7x)
Упакованный транспон Все 17 4
Стандартный транспонирование B32 Транспонирование 9 4
B16 Транспонирование (сегментированное/сжатое) 17 4
Пул исполнительных блоков (EUP)

Инструкции EUP представляют собой векторные математические функции (например, tanh , log , exp ).

Категория инструкций (v5e/v5p) (v6e/v7x)
Векторная математика ( tanh , exp и т. д.) 2 1

(СТАРАЯ ВЕРСИЯ) Включение настраиваемой видимости звонков

Для включения пользовательского профилирования вызовов необходимо установить следующие флаги XLA при запуске рабочей нагрузки:

  • --xla_enable_custom_call_region_trace=true : Этот флаг включает трассировку для регионов, содержащих пользовательские вызовы.
  • --xla_xprof_register_llo_debug_info=true : Этот флаг регистрирует отладочную информацию LLO, что позволяет XProf отображать подробную статистику использования для пользовательского вызова.

Пример :

LIBTPU_INIT_ARGS="--xla_enable_custom_call_region_trace=true --xla_xprof_register_llo_debug_info=true" python your_jax_workload.py

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

Линия использования LLO

Линия использования LLO предоставляет визуализацию того, как используются аппаратные ресурсы во время выполнения пользовательского вызова. Это особенно полезно для выявления узких мест в пользовательских ядрах (например, написанных на Pallas или Mosaic).

Использование LLO

Передовые методы

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