Fast Run: волшебные функции для улучшения производительности вывода модели MegEngine

искусственный интеллект глубокое обучение задняя часть

Автор: Ван Боуэн | Архитектор MegEngine

1. Предпосылки

Для фреймворков глубокого обучения пользователи высоко ценят время обучения/вывода сети. В реальных производственных условиях сети НС, спроектированные пользователями, сильно различаются, и даже при одном и том же типе математического расчета параметры тоже разные. Без целенаправленной оптимизации фреймворк совершенно неконкурентоспособен. Поэтому в виде математического расчета разработчики разработают множество эффективных алгоритмов, которые подходят для разных параметров, чтобы обеспечить производительность сети. Далее разработчикам необходимо решить новую задачу, когда параметры расчета определены, как заставить самый быстрый алгоритм выполнить расчет.

Большинство фреймворков полагаются на предыдущий опыт для выбора алгоритмов, а MegEngine также суммирует превосходные значения предыдущего опыта для автоматического выбора алгоритмов во время вычислений. Но опора на опыт не гарантирует, что будет выбран самый быстрый алгоритм. Во многих практических сценариях пользователи хотят, чтобы сеть имела максимальную производительность. С этой целью MegEngine разработала специальный процесс, который может автоматически выбирать самый быстрый алгоритм для каждого расчета, тем самым обеспечивая кратчайшее время работы всей сети. И в то же время он может записывать рассчитанные параметры и соответствующую информацию об алгоритме и информацию об устройстве в память или файл.Когда пользователь снова запускает сеть, алгоритм с наилучшей производительностью может быть получен напрямую. Этот процесс повышения производительности называется Fast Run и позволяет пользователям MegEngine получать максимальную производительность при работе в разных сетях.

2. Краткое описание Fast Run

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

Взяв в качестве примера оператор свертки, на ARM MegEngine реализует очень общий алгоритм Im2col, алгоритм Винограда с отличной производительностью при определенных условиях и алгоритм прямой прямой свертки с высокой производительностью при свертке небольшого размера. В CUDA есть методы для вызова библиотечных функций cuDNN и т.д. Связь оператора MegEngine с оператором MegDNN и алгоритмом показана на следующем рисунке:

Оператор MegEngine может содержать одного или нескольких операторов MegDNN для завершения расчета, а оператору MegDNN необходимо выбрать один из нескольких объектов алгоритма для выполнения расчета. Для максимальной производительности вычислений необходимо выбрать самый быстрый алгоритм для оператора MegDNN перед запуском сетевых вычислений.

Идея Fast Run очень проста: перед началом расчета сети все возможные алгоритмы в каждом операторе MegDNN запускаются один раз (профилирование), данные о производительности записываются, и оператору MegDNN назначается самый быстрый алгоритм. Предпосылкой для Fast Run является стабильное время работы алгоритма, поэтому имеет смысл сравнивать данные профилирования каждого алгоритма.

Последнее — определить момент времени для выполнения Fast Run. MegEngine имеет унифицированное управление памятью. Каждый оператор MegEngine должен подать заявку на достаточное количество памяти для расчета времени в единицу планирования памяти до начала расчета. Эта память включает в себя память, требуемую его внутренним оператором MegDNN для расчета. Требуемый объем памяти полностью определяется алгоритм. Для этого требуется, чтобы MegDNN определила алгоритм, который будет использоваться на данном этапе. Естественно, MegEngine выбирает выполнение процесса Fast Run перед вызовом этого интерфейса. Таким образом, когда процесс Fast Run завершен, для каждого оператора MegDNN устанавливается наиболее эффективный алгоритм.

Стоимость исполнения Fast Run очевидна, это значительно увеличит время первого сетевого исполнения. Процесс быстрого запуска выглядит следующим образом:

Fast Run можно использовать следующими двумя способами, разница в том, что файлы кэша, записанные на приведенном выше рисунке, отличаются:

Автономный быстрый запуск, автономный быстрый запуск разделен на два этапа, которые выполняются в разных процессах. Первым шагом является выполнение всего расчета сети.Во время этого процесса Fast Run запишет данные о производительности каждого алгоритма в специальную структуру данных, и, наконец, данные будут равномерно записаны в файл кэша, а затем процесс завершится. Этот процесс называется "параметры поиска". Второй шаг — загрузить ту же сеть и прочитать файл Cache через интерфейс MegEngine. Видно, что в автономном режиме Fast Run можно выполнять даже на разных устройствах. Online Fast Run, Online Fast Run выполняется в одном и том же процессе. Первая половина аналогична автономному процессу Fast Run.После Fast Run данные о производительности каждого алгоритма сохраняются в структуре данных в памяти. В этот момент процесс не завершается. В дальнейшем в сеть могут быть загружены различные входные данные, на данный момент в каждом операторе MegDNN установлен алгоритм с наилучшей производительностью. Кроме того, может быть инициализирована другая сеть, и алгоритмы могут быть прочитаны из текущей структуры данных, как во второй половине автономного быстрого прогона. В целом в Fast Run предусмотрена функция поиска и записи параметров. Его функция заключается в выборе алгоритма с наилучшей производительностью при текущих параметрах для каждого оператора MegDNN в сети. Поскольку Fast Run выполняет одну и ту же операцию для каждого оператора MegDNN, ее можно использовать как для прямого вывода, так и для обратного распространения. В настоящее время MegEngine поддерживает Fast Run с тремя бэкендами: CUDA, CPU и ROCM.Пользователи MegEngine широко используют Fast Run при обучении и развертывании.

Три, быстрые принципы бега

В Fast Run профилирование оператора MegDNN и настройка алгоритма будут проходить этапы 4. Процесс выглядит следующим образом:

В этом процессе нужно обратить внимание на некоторые детали:

1. Рекурсивный поиск параметров: В MegDNN распространено вложение операторов. Например, в операторе Convolution алгоритм Im2col использует оператор MatMul MegDNN для выполнения матричного умножения. Затем производительность Convolution напрямую зависит от производительности MatMul. Видно, что перед профилированием оператора свертки известны данные о производительности, которые должны быть выполнены оператором MatMul. Чтобы решить эту проблему, Fast Run использует рекурсивный метод для решения проблемы вложенности операторов при поиске параметров. Как показано в пунктирной рамке на рисунке выше, оператор MegDNN после получения всех доступных алгоритмов будет вызывать интерфейс каждого алгоритма, чтобы узнать, зависит ли алгоритм от субоператора, и сохранить соответствующие результаты. не пусто, то субоператор будет профилирован один раз, а затем, когда будет профилирован оператор верхнего уровня, используемый субоператор будет иметь оптимальный алгоритм, хранящийся в кэше.

2. Хранилище данных о производительности Fast Run. Доступ к данным о производительности Fast Run неотделим от кэша. MegEngine предоставляет два типа PersistentCache, которые отличаются от того, где хранятся данные (память или файл). Структура Cache показана на следующем рисунке:

В MegEngine объект PersistentCache является одноэлементным, и оба кеша являются потокобезопасными. Кэш поддерживает коллекцию сопоставлений информации о категории с коллекцией, здесьcategoryявляется информацией о внутренней записи. Категория — это строка, полученная путем объединения внутренней информации и типа оператора.Базовая информацияОн различается по устройству.Например, информация о бэкэнде CUDA состоит из имени устройства, версии драйвера NVIDIA и информации о версии библиотеки времени выполнения CUDA; когда ЦП используется в качестве бэкенда, записывается только имя устройства. В MegEngine только три типа CUDA, CPU и ROCM имеют соответствующую генерацию категорий, поэтому MegEngine в настоящее время поддерживает Fast Run только на трех бэкендах CUDA, CPU и ROCM.тип оператораОн состоит из имени оператора и информации о версии кэша.

Категория сопоставляется с коллекцией, которая поддерживает сопоставление информации одного оператора MegDNN с результатами профилирования всех его доступных алгоритмов. набораключевое значениеВсе входы оператора MegDNNTensorРазмер складывается из всех параметров оператора (эти параметры могут полностью определять доступность алгоритма).ценностьпредставляет собой массив, который содержит такую ​​информацию, как время, необходимое дополнительное пространство и т. д. для каждого алгоритма профилирования, и отсортирован. При сортировке он сортируется в порядке возрастания времени выполнения, и гарантируется, что каждый алгоритм в последовательности должен использовать меньше памяти, чем его предшественник, чтобы ни один алгоритм в последовательности не был одновременно медленнее другого и использовал больше оперативной памяти. Результаты быстрого запуска из разных бэкендов могут существовать в кэше, если их категории различаются.

На некоторых распространенных моделях при отключении и включении Fast Run во время логического вывода производительность выглядит следующим образом:

Судя по использованию Fast Run в лендинге проекта, в большинстве сценариев можно значительно сократить время работы сети.

4. Использование быстрого бега

Существует множество настраиваемых параметров MegEngine, многие из которых являются решениями для инженерной реализации, прошедшими большую практику в отрасли. Некоторые из этих параметров тесно связаны с использованием Fast Run, и их использование подробно объясняется здесь.

4.1 Включить быстрый запуск

Использование Fast Run на уровне исходного кода может ссылаться на исполняемую программу, поставляемую с MegEngine.load_and_run, если вы сосредоточитесь только на использовании load_and_run для тестирования модели, необходимо использовать следующие два параметра:

  1. --full-run/--fast-run, существует два режима поиска параметров, и пользователю необходимо выбрать один из режимов.Разница между ними заключается в том, что при профилировании размер доступного алгоритма устанавливается для сгенерированный оператор MegDNN отличается. Если задан параметр --full-run, он будет профилировать все доступные алгоритмы оператора MegDNN, включая самый простой алгоритм (оператор MegDNN имеет по крайней мере один алгоритм, который гарантированно доступен при любом параметре и работает медленно). --fast-run исключает наивные алгоритмы. Если вы хотите сократить затраты времени на профилирование, вы можете выбрать режим --fast-run, при этом следует учитывать, что если в сети есть оператор со слишком специфическими параметрами, оператор может столкнуться с ситуация, что нет доступного алгоритма (оптимизация. Прошлый алгоритм недоступен, наивный алгоритм исключен), в это время MegEngine сообщит об ошибке «нет доступного алгоритма» и завершит работу.
  2. --fast-run-algo-policy указывает путь к файлу кэша, данные о производительности в файле будут считаны в память и сохранены глобально уникальным объектом PersistentCache. Перед завершением процесса все данные о производительности в PersistentCache будут записаны в этот файл.

Эти два параметра можно использовать по отдельности или вместе:

  1. Только с --full-run/--fast-run данные профилирования хранятся в памяти.
  2. При совместном использовании данные о производительности в файле сначала считываются в память. Если файл пуст, данные о производительности будут записаны обратно в файл после того, как все операторы MegDNN завершат поиск параметров. Если файл не пустой, и оператор MegDNN может запросить данные о производительности из кэша, параметры не будут искаться, а если данные о производительности не будут найдены, то будет произведен поиск параметров. Таким образом реализована функция параметров поиска точек останова, которую MegEngine называет «непрерывным поиском». Если программа по какой-либо причине аварийно завершает работу во время Fast Run, «продолжить поиск» позволит Fast Run подключиться в следующий раз. «Продолжить поиск» также позволяет объединить данные о производительности из нескольких моделей в один файл кэша. Если все операторы MegDNN смогут найти данные о производительности из кэша, поиск параметров не произойдет и сеть будет иметь наилучшую производительность.
  3. Если --fast-run-algo-policy используется отдельно, то данные о производительности в файле будут считаны в память первыми. Оператор MegDNN устанавливается на основе эмпирического значения, и производительность может быть не самой лучшей.

При использовании Fast Run его можно использовать вместе с --verbose, и программа будет печатать подробную информацию об отладке во время Fast Run, включая имя оператора MegDNN, информацию о размере ввода и вывода, имя набора алгоритм и др. Если обнаруживается, что производительность не соответствует ожиданиям, например, когда загруженная модель не соответствует файлу кэша, обычно происходит «продолжение поиска», создавая иллюзию длительного времени выполнения сети. Поэтому мы настоятельно рекомендуем использовать параметр --verbose на этом этапе, чтобы увидеть, работает ли программа должным образом.

4.2 Свойства алгоритма

Некоторые алгоритмы в MegDNN имеют уникальные свойства, влияющие на набор алгоритмов для операторов MegDNN, используемых в настоящее время.Атрибуты имеют:

  1. REPRODUCIBLE: Алгоритм со свойством REPRODUCIBLE, который обеспечивает выравнивание по битам результата вычисления. В Fast Run обеспечивается поддержка атрибута REPRODUCIBLE при чтении информации об алгоритме из кэша. Установите --reproducible, Fast Run выберет наиболее эффективный алгоритм со свойством REPRODUCIBLE из кэша. На этапе профилирования не различается, является ли алгоритм ВОСПРОИЗВОДИМЫМ или нет, поэтому алгоритмы в кэше имеют как ВОСПРОИЗВОДИМЫЕ атрибуты, так и НЕВОСПРОИЗВОДИМЫЕ атрибуты, которые имеют определенную общность.
  2. НАИВНЫЙ: Только самые наивные алгоритмы в MegDNN обладают свойством НАИВ. Разница между --full-run и --fast-run заключается в том, что --fast-run отфильтровывает самый медленный наивный алгоритм по этому атрибуту.

4.3 Предварительная обработка веса

Некоторые алгоритмы требуют вспомогательного преобразования данных при расчете. Среди них преобразование веса веса может быть одноразовым, что может сэкономить время работы. Например, в алгоритме Винограда его веса могут быть изменены перед вычислением свертки, что значительно снижает нагрузку на производительность во время выполнения. MegEngine предоставляет параметр weight_preprocess в GraphCommonOptimizeOptions для поддержки предварительного преобразования весов во время развертывания. После установки weight_preprocess для тех алгоритмов, веса которых могут быть преобразованы заранее, данные о производительности не будут включать время преобразования веса. Проще говоря, установка weight_preprocess на этапе поиска параметров повлияет на данные о производительности алгоритма, поэтому порядок данных о производительности алгоритма в кэше может быть другим. Если Кэш получен поиском параметров с включенной предобработкой весов, обязательно включите предобработку весов, чтобы добиться лучшей производительности при развертывании, иначе есть риск снижения производительности. Предварительная обработка Fast Run и веса не требуется, их можно использовать отдельно. Однако, как правило, лучшую производительность можно получить, используя комбинацию этих двух способов.

4.4 Быстрая версия

Информация о версии Fast Run представлена ​​в категории Cache в виде строки. Cache обладает совместимостью, что позволяет собирать результаты поиска разных версий MegEngine в один и тот же Cache, и в Cache видны разные категории. Однако пользователям все равно нужно обращать внимание на версию Fast Run при ее использовании. Как правило, если алгоритм MegDNN удален или атрибуты изменены, информация о версии Fast Run изменится. После изменения информации о версии Fast Run необходимо выполнить повторный поиск параметров.

Прикрепил:

Гитхаб:MegEngine Тяньюань

Официальный сайт:MegEngine — глубокое обучение, простая разработка

Добро пожаловать в группу технической биржи MegEngine QQ: 1029741705