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

С помощью Memory Viewer можно визуализировать использование памяти на протяжении всего времени работы программы. Вы можете углубиться в детали содержимого памяти в момент пикового использования памяти, в том числе для отладки ситуаций нехватки памяти (Out Of Memory, OOM) . Memory Viewer поможет вам увидеть глобальное использование памяти и то, насколько близко вычисления находятся к исчерпанию памяти.

Вся информация, отображаемая в Memory Viewer, является чисто статической и получена от компилятора XLA; динамическая информация, получаемая во время выполнения, представлена ​​в инструменте Memory Profile .

Линейный график Memory Viewer

Поддерживаемые платформы

Поддерживаются как TPU, так и GPU.

Компоненты средства просмотра памяти

Инструмент Memory Viewer состоит из нескольких ключевых компонентов:

  1. Выпадающие списки элементов управления пользователя, позволяющие настраивать отображаемые данные:

    • Типы памяти: Поддерживаемые типы памяти зависят от ускорителя. Для графических процессоров основное внимание уделяется высокоскоростной памяти (HBM) и памяти хоста, тогда как для процессоров TPU дополнительно можно просмотреть использование встроенной памяти, включая VMEM, SMEM, CMEM, Sync Flags (SFlag), Sparsecore, а также памяти хоста.

      Выпадающее меню «Типы памяти» в окне просмотра памяти

    • Модули HLO: это программы XLA, которые были частью вашего выполнения. Хорошей отправной точкой часто является модуль верхнего уровня, обозначенный, например, jit_train_step или jit_generate . Этот выпадающий список находится на левой панели.

      Выпадающее меню модулей просмотра памяти

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

    Просмотр памяти Обзор текста памяти

  3. График зависимости размера выделенной памяти от порядка выполнения программы отображает использование памяти в зависимости от количества точек выполнения программы (последовательности HLO), запланированных компилятором.

    • Обратите внимание, что по оси X отложено не время.
    • На диаграмме конкретно выделена точка в программе с пиковым использованием памяти выбранного модуля . Профайлер и инструменты не знают о совместном размещении модулей на данном чипе/в памяти. При компиляции каждого модуля компилятор аннотирует профиль «базовой» начальной точкой общего объема выделенной памяти (модулями, скомпилированными до этого) и отсчитывает время вверх и вниз по мере дальнейших выделений и освобождений памяти. Однако любые будущие выделения памяти другими модулями, скомпилированными до выполнения, не учитываются; имейте это в виду при отладке ситуаций нехватки памяти.
  4. В нижней части страницы представлены диаграммы использования памяти, показывающие пиковые значения использования памяти программой (обозначенные вертикальной линией на графике использования памяти). Имеется три диаграммы, на каждой из которых отображается весь набор буферов, выделенных программой, но отсортированных тремя разными способами:

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

      Обратите внимание, что цвета буферов не имеют какого-либо особого значения.

  5. При нажатии на ссылку «временная шкала» рядом с заголовком диаграммы отображается визуализация распределения памяти в виде ряда цветных прямоугольников, по одному на каждое распределение. При наведении курсора на блок отображается дополнительная информация о распределении; например, операция HLO, создавшая распределение, форма распределения и т. д. Визуализацию можно интерпретировать следующим образом:

    • По оси X отложен порядок выполнения программы.
    • Высота каждого блока по оси Y соответствует размеру выделенной памяти.
    • Ширина каждого блока определяет время жизни выделенной области в порядке выполнения программ.

    Хронология просмотра памяти

    Временную шкалу также можно сохранить в формате SVG, DOT или HTML+SVG.

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

    • На график использования памяти накладывается полоса, цвет которой соответствует цвету буферной карты, указывающая на время жизни этого буфера; то есть горизонтальная полоса, левый и правый края которой указывают точки выделения и освобождения памяти в порядке выполнения программы. Высота горизонтальной полосы отражает относительный размер выбранного буфера по сравнению с пиковым значением выделения.
    • Отдельная карточка с подробными сведениями о буфере, обычно расположенная слева, содержит информацию о конкретной операции, если таковая имеется. Типичная карточка включает следующую информацию:

      • Имя: Название операции XLA, которое можно найти в Graph Viewer или Trace Viewer.
      • Размер: Размер выделяемого буфера, с учетом и без учета заполнения.
      • Форма: описывает ранг, размер и тип данных N-мерного массива.
      • Имя операции фреймворка: Отображает имя операции фреймворка, связанной с этим выделением ресурсов.
      • Тип выделения: Классифицирует выделение буфера по следующим типам: параметрическое, выходное, локальное для потока и временное (например, выделение буфера внутри операции слияния).
      • Источник: Отображает местоположение исходного кода (номер файла и строки) для операции, создавшей буфер.
      • Исходный стек: Отображает полный стек вызовов для операции, предоставляя контекст выполнения, который привел к выделению буфера.

      Диаграммы буферов Memory Viewer

Как интерпретировать диаграммы буфера в программе просмотра памяти

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

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

На приведенном ниже изображении диаграмма, отсортированная по размеру отступа, показывает, что из-за требований к отступу выделяется дополнительная память. Диаграммы буфера в программе Memory Viewer: расхождение в диаграмме, отсортированной по размеру отступа.