Код AI Flame Graphs теперь открыт, этот проект поддерживает GPU Intel Battlemage. Это значит, что AI Flame Graphs теперь способен генерировать flame-графики (Flame Graph, граф пламени, диаграмма пламени), охватывающие полный стек GPU — это даёт пользователям новые аналитические данные о производительности игр. Особенно полезным AI Flame Graphs выглядит в связке с FlameScope (это — мой опенсорсный проект, созданный несколько лет назад). Вот — пример профилирования игры GZDoom. Тут показаны результаты визуализации использования CPU и GPU, проведённые с помощью FlameScope и снабжённые комментариями.

Параллельный анализ использования CPU и GPU. Чем насыщеннее цвет прямоугольников — тем выше нагрузка на CPU (слева) или GPU (справа). Длительные периоды простоя GPU (светлые полосы в правой части графика), вызванные ожиданием CPU, могут проявляться в видимых «тормозах» графической части игры.
Параллельный анализ использования CPU и GPU. Чем насыщеннее цвет прямоугольников — тем выше нагрузка на CPU (слева) или GPU (справа). Длительные периоды простоя GPU (светлые полосы в правой части графика), вызванные ожиданием CPU, могут проявляться в видимых «тормозах» графической части игры.

(Вот — исходные версии диаграмм для CPU и GPU). Диаграммы FlameScope представляют собой тепловые карты (heatmap), разбитые на фрагменты, символизирующие нагрузку на устройства, испытываемую ими в течение отрезков времени с длительностью значительно меньше одной секунды. В данном примере каждый столбец диаграммы разбит на 50 блоков по 20 мс и представляет собой одну секунду. Насыщенность цвета блока указывает на количество собранных образцов данных при профилировании кода. Эти диаграммы позволяют обнаруживать изменения уровней нагрузки на устройства и выявлять различные возмущения. Выбрав соответствующий участок диаграммы FlameScope можно построить flame-график только для заданного временного диапазона. Обновление: размер строки диаграммы можно настраивать (он ограничен частотой сбора данных, заданной в профиле), например — можно сгенерировать 60 строк для того, чтобы данные согласовывались с особенностями игры, частота кадров которой составляет 60 FPS.

Если разместить диаграммы FlameScope для CPU и GPU рядом друг с другом — можно, просто глядя на них, выявить закономерности, указывающие на какие-либо проблемы. Поиск подобных закономерностей другими способами, заключающийся в сопоставлении отчётов о производительности CPU и GPU, занимает гораздо больше времени. Пропуски на FlameScope-диаграмме GPU, показанной справа, указывают на моменты большой загрузки процессора. Они соответствуют более насыщенным участкам на диаграмме CPU, находящейся слева.

Анализ CPU

Инструмент FlameScope позволяет исследователю выделять интересующие его отрезки времени. Выбрав одну из полос, соответствующую компиляции шейдеров, мы можем построить flame-график для нужного отрезка времени.

Построение flame-графика для выбранного участка FlameScope-диаграммы CPU.
Построение flame-графика для выбранного участка FlameScope-диаграммы CPU.

Это просто потрясающе, так как позволяет точно узнать о том, почему CPU был чем-то занят в течение 180 мс (длина красной вертикальной полосы, выделенной на диаграмме FlameScope). Оказывается, что процессор занят компиляцией GPU-шейдеров и кое-какими преобразованиями NIR (оптимизациями NIR Intermediate Representation, промежуточного представления данных, используемого в компиляторе Mesa). Если вы раньше не встречались с flame-графиками — знайте, что, работая с ними, сначала надо обращать внимание на самые широкие «башни» и заниматься оптимизацией того, что с ними связано. Вот — интерактивная SVG-версия графика, рассмотренного выше.

Flame-графики для CPU, а так же FlameScope-диаграммы для них — это вовсе не новость (вот, соответственно, материалы 2011 и 2018 года об этих технологиях, и та и другая — опенсорсные). Новость — это flame-графики для полного стека GPU и FlameScope-диаграммы для GPU.

Анализ GPU

Интересные фрагменты можно выделить и на FlameScope-диаграмме GPU, чтобы сгенерировать на основе их данных flame-графики. В этом примере показан выбор диапазона «room 3», который символизирует комнату на карте Doom, содержащую сотни врагов. 

Фрагмент FlameScope-диаграммы, который будет подвергнут анализу с помощью flame-графика.
Фрагмент FlameScope-диаграммы, который будет подвергнут анализу с помощью flame-графика.

Кадры, закрашенные зелёным цветом — это реальные инструкции, выполняющиеся на GPU. Кадры голубовато-зелёного цвета символизируют источники соответствующих функций. Красные (язык C) и жёлтые (C++) кадры — это пути выполнения кода на CPU, которые инициировали выполнение GPU-программ. Серые кадры, отмеченные чёрточками, играют вспомогательную роль, разделяя код CPU и GPU. (Это похоже на то, что я описывал в материале AI Flame Graphs, где дополнительные кадры включаются в графики для кода ядра). Ось X символизирует нагрузку на систему, поэтому, работая с этим графиком, обращают особое внимание на самые широкие блоки и работают над тем, чтобы уменьшить их размеры.

Построение flame-графика для выбранного участка FlameScope-диаграммы GPU.
Построение flame-графика для выбранного участка FlameScope-диаграммы GPU.

Вот — интерактивная SVG-версия этого flame-графика. Вы можете исследовать её с помощью мыши. Вот — её PNG-версия.

Flame-график разделён в соответствии с причинами простоев (stalls), возникающих в работе GPU. Это — рендеринг стен (41,4%), реализация эффектов постобработки (35,7%), применение stencil-буфера (17,2%) и работа со спрайтами (4,95%). Стеки CPU подвергаются дальнейшей дифференциации по отдельным шейдерам, которые вызывают простои, а так же по причинам возникновения этих простоев.

GZDoom

Мы решили проводить эксперименты с GZDoom из-за того, что это — опенсорсная версия всем известной игры, которая работает на Linux (наш профилировщик пока не поддерживает Windows). Intel Battlemage без труда справляется с GZDoom, но, из-за того, что профилирование GPU основано на анализе простоев, мы получали не особенно много образцов данных. Мы могли бы переключиться на более современную игру, предъявляющую более высокие требования к GPU, но я не смог подобрать ни одного подходящего опенсорсного игрового проекта. Поэтому я решил просто сделать так, чтобы GZDoom нужно было бы больше ресурсов. Мы построили карты для GZDoom, создающие высокую нагрузку на GPU (не могу поверить, что я нашёл причину воспользоваться Slade, связанную с работой). Мы, кроме того, настроили некоторые параметры Battlemage, ограничивающие ресурсы, создав таким образом повышенную нагрузку на ресурсы, оставшиеся в распоряжении игры.

Кадр из GZDoom
Кадр из GZDoom

На тестовой карте имеется три комнаты: комната 1 (room 1) пуста, комната 2 (room 2) полна факелов, комната 3 (room 3) — это открытое пространство с большим скайбоксом, наполненное врагами, в котором, в том числе, имеются места, где спавнятся враги типа «Sergeant». Такой подход дал нам несколько вариантов рабочих нагрузок, для исследования которых достаточно было просто переходить из комнаты в комнату.

Использование iaprof — опенсорсного профилировщика ускорителей Intel

Проект AI Flame Graph — это новаторская разработка, для его реализации понадобилось вносить различные изменения в графические компиляторы, библиотеки, в драйверы ядра, причём — не только в код, но и в систему его сборки. Так как у Intel имеется собственное общедоступное облачное решение (Intel Tiber AI Cloud), мы можем заранее привести весь стек к необходимому состоянию, поэтому для наших клиентов всё «просто работает». Взгляните на доступные релизы iaprof. В настоящее время этот инструмент поддерживает Intel GPU Max Series.

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

  • Linux-система с root-доступом — чтобы можно было пользоваться eBPF и Intel eustalls.

  • Свежее ядро Linux с последними GPU-драйверами Intel. В случае с Battlemage это означает Linux 6.15+ с драйверами Xe. Для Intel GPU Max Series это — Linux 5.15 с драйверами i915.

  • Нужно ядро Linux, собранное с интерфейсами eustall и eudebug, специфичными для драйверов Intel (подробности смотрите в документации на GitHub). Некоторые из этих модификаций уже включены в состав последних версий Linux, над некоторыми сейчас ещё ведётся работа. (В Intel Tiber AI Cloud эти интерфейсы доступны без дополнительной настройки).

  • Все системные библиотеки или программы, которые затрагивает профилирование, должны включать в себя указатели кадра (frame pointers). Это нужно для того, чтобы у профилировщика был бы доступ к полному программному стеку, включая Intel oneAPI и графические библиотеки. Для рассматриваемого здесь примера саму игру GZDoom понадобилось скомпилировать с указателями кадра, то же касается и всех библиотек, которые она использует (glibc и прочие). Решение всех этих задач облегчается на последних версиях Fedora и Ubuntu (например — Ubuntu 24.04 LTS). Системные библиотеки, поставляемые с ними, уже включают в себя указатели кадра. Правда, полагаю, что там будут приложения и зависимости, которые пока ещё собраны без указателей кадра. Их понадобится перекомпилировать. Если в ваших flame-графиках есть области, размеры которых крайне малы, глубина стека в которых составляет один-два кадра, то это — ответ на вопрос о том, к чему все эти сложности.

Уровень сложности — Nightmare!
Уровень сложности — Nightmare!

Если вы раньше не сталкивались с индивидуальными сборками ядра и не возились с тонкой настройкой библиотек, тогда, чтобы всё это у вас заработало, вам придётся, фигурально выражаясь, поиграть в Doom на сложности Nightmare!. Но со временем ситуация улучшится и всё мало-помалу станет проще: почитайте документацию на GitHub. Intel, кроме того, может разработать гораздо более простую версию этого инструмента, включив его в более широкую линейку продуктов, может сделать так, чтобы всё это работало не только на Linux и на Battlemage (вы можете либо, дожидаясь этого, следить за ситуацией, либо, если у вас есть возможность поговорить с представителем Intel — можете попросить его ускорить дело).

После того, как вы всё настроите — запустите команду iaprof для профилирования GPU. Например, это может выглядеть так:

git clone --recursive https://github.com/intel/iaprof
cd iaprof
make deps
make
sudo iaprof record > profile.txt
cat profile.txt | iaprof flame > flame.svg

Команда iaprof основана на команде Linux perf. (Возможно, однажды она будет включена прямо в состав perf). Благодарю Габриэля Муньоса за работу, которую он проделал для открытия исходного кода iaprof.

Часто задаваемые вопросы и размышления о дальнейшем развитии проекта

С того момента, как в прошлом году проект AI Flame Graphs увидел свет, мне кажется, что вопрос, который будут задавать о нём чаще всего, прозвучит так: «А как насчёт NVIDIA?». У NVIDIA, в инструменте Nsight Graphics, предназначенном для анализа нагрузки на GPU, имеются flame-графики, но эти графики сейчас не отличаются большой глубиной, так как отражают лишь работу GPU-кода. Этим инструментом, кроме того, хлопотно пользоваться, так как для его работы, насколько мне известно, нужен промежуточный слой абстракции, «перехватчик». С другой стороны, в Nsight Graphics имеется полезная возможность щёлкнуть по тому, что интересно аналитику, и перейти к исходному коду. Новый механизм профилирования GPU, над которым мы работаем, это простой инструмент, который позволяет профилировать всё что угодно в любое время, работая именно так, как того можно ожидать от профилировщиков CPU.

Будущее проекта мне видится в выпуске GitHub-релизов, в работе над поддержкой большего количества «железа», в снижении дополнительной нагрузки на систему, вызванной профилированием. Мы — первые, кто использует для решения подобных задач eustalls, и нам нужно лучше оптимизировать проект для достижения целевого показателя дополнительной нагрузки, не превышающей 5%. Особенно это касается драйвера i915.

Итоги

Мы открыли исходный код AI Flame Graphs и протестировали его на новом аппаратном обеспечении — на Intel Battlemage, а так же — на рабочей нагрузке, не связанной с ИИ — на игре GZDoom. Это большое дело — иметь возможность видеть, с миллисекундной точностью, разбивку ресурсов, потребляемых кодом на CPU и GPU. То, что представлено в виде тепловой карты с помощью FlameScope-диаграммы, можно проанализировать и, выбрав нужный фрагмент, построить на базе соответствующих данных flame-график, отражающий поведение кода. Мы применили новый инструмент к анализу игры GZDoom и нашли объяснение простоям GPU, анализируя те места отчёта о CPU, которые соответствуют всплескам нагрузки на него. FlameScope-диаграммы и flame-графики позволяют анализировать поведение CPU и GPU на произвольных отрезках времени.

Несмотря на то, что мы открыли код наших инструментов, для того чтобы это всё заработало — нужно аппаратное обеспечение Intel и необходимо повозиться с ядром Linux и с библиотеками. Эта возня вполне может оказаться сложнее, чем игра в Doom на уровне сложности Nightmare!. Но со временем ситуация улучшится. А пока мы над этим работаем — нам очень интересно было бы узнать о том, сумеет ли кто-нибудь, справившись с временными трудностями, воспользоваться нашими инструментами, и о том, какие проблемы с производительностью он сможет с их помощью решить.

О, а приходите к нам работать? ? ?

Мы в wunderfund.io занимаемся высокочастотной алготорговлей с 2014 года. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.

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

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

Присоединяйтесь к нашей команде

Комментарии (0)