Почему ?

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

Как мы определяем производительность?

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

Арифметическая интенсивность:

  • Время памяти равно количеству байтов, к которым осуществляется доступ в памяти, деленному на пропускную способность памяти процессора (#bytes/BW_mem). Расчетное время равно количеству операций, деленному на математическую пропускную способность процессора (#ops/BW_math).
  • Таким образом, на данном процессоре данный обучающий алгоритм ограничен по математике, если:

  • операций/байт называется арифметической интенсивностью для алгоритма. Измеряется в FLOPS/байтах. BW_math / BW_mem известно как соотношение операций: байтов для процессора.
  • (алгоритм, процессор) ограничен по математике, если arithmetic_intensity › ops:bytes
  • (алгоритм, процессор) ограничен памятью, если arithmetic_intensity ‹ ops:bytes

Арифметическая интенсивность чаще всего определяется как соотношение FLOP на байт. [2]

Анализ производительности:

  1. Арифметическая интенсивность: операции/байты
  2. Математика в память bw : BW_math/BW_mem
  3. Сравните (1) и (2)

Как вычислить арифметическую интенсивность?

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