Что нужно знать о компиляторах глубокого обучения

искусственный интеллект глубокое обучение

​​​​​​​​​​​​Аннотация: компилятор глубокого обучения можно использовать в качестве общего компонента и моста между фреймворком и оборудованием.Конечная цель состоит в том, чтобы мы могли разработать Автоматически генерировать оптимальный код для любое устройство.

Эта статья опубликована в сообществе HUAWEI CLOUD.Введение в компиляторы глубокого обучения, оригинальный автор: luchangli.

За последние десять лет глубокое обучение быстро развивалось, и в отрасли появилось множество сред разработки алгоритмов глубокого обучения. В то же время, поскольку глубокое обучение имеет широкий спектр сценариев применения и огромный спрос на вычислительную мощность, нам необходимо запускать алгоритмы глубокого обучения на различном оборудовании общего и специального назначения, таком как различные типы ЦП, ГП, ТПУ. , НПУ и др. Затем происходит комбинаторный взрыв между платформами и оборудованием, как показано на рисунке 1. Например, если TensorFlow хочет поддерживать вычисления на графическом процессоре, необходимо разработать версию графического процессора для всех операторов в tensorflow.Если он хочет поддерживать чипы D, необходимо разработать версию чипа D для каждого оператора. Этот процесс, несомненно, занимает много времени и сил.

Рисунок 1

В то же время у нас сейчас много алгоритмических сетей, таких как YOLO, BERT, GPT и так далее. Эти сети алгоритмов состоят из операторов разных типов, форм и отношений связи. В конце концов, они работают на разных типах и моделях оборудования. Это приводит к высокой стоимости ручной разработки и внедрения оптимальных операторов для каждого сценария. Вот два примера. Как показано на рисунке 2, слияние операторов является распространенным методом оптимизации производительности. Перед слиянием каждому оператору необходимо прочитать данные из памяти в кэш до и после вычисления, а затем записать обратно из кеша в ОЗУ. После слияния можно избежать чтения и записи памяти между операторами для повышения производительности. Традиционный метод заключается в ручной разработке операторов слияния в соответствии с отношениями подключения оператора, но почти невозможно полностью перечислить отношения подключения оператора разных типов в разных сетях. Другим примером является настройка оператора.В процессе реализации оператора есть много параметров, которые будут влиять на производительность, но трудно выразить и поддерживать эти параметры в традиционном методе ручной разработки оператора, и эти параметры настраиваются для достижения различных форм и оборудования. оптимальная производительность.

фигура 2

Компилятор глубокого обучения был создан для решения вышеуказанного ряда проблем. Его можно использовать в качестве общего компонента и моста между фреймворком и оборудованием. Конечная цель состоит в том, что нам нужно разработать его только один раз и автоматически сгенерировать для любого устройства. , оптимальный код. Например, операторы, разработанные для CPU, можно практически без изменений использовать для GPU и D-чипов, тем самым значительно снижая затраты.

Вот краткое введение в компоненты и функции компилятора глубокого обучения, как показано на рисунке 3. Прежде всего, его внешний интерфейс получает граф вычислений из разных фреймворков и использует эту структуру данных Highlevel IR для его представления, а затем выполняет ряд оптимизаций графа на этом этапе, таких как свертывание констант, слияние операторов, эквивалентная замена и т. д. . Вот пример эквивалентной замены.Исходный график расчета такой.Меняем на него метод расчета,результат тот же,но производительность может быть лучше. Далее для каждого оператора в графе расчета используется предметно-ориентированный язык DSL для описания процесса расчета оператора и оптимизации оператора. Например тайлинг, многоядерность, двойная буферизация и другие оптимизации для операторов. Поскольку процесс вычисления оператора обычно реализуется несколькими циклами, например, умножение матриц является тройным циклом. Компилятор глубокого обучения может легко выполнять различные преобразования в цикле и настраивать параметры этих преобразований, чтобы получить наилучшую реализацию оператора для различных форм и оборудования. Наконец, для различного оборудования генерируется специальный код на основе IR низкого уровня.

изображение 3

Наконец, представлены существующие в отрасли проекты компиляторов. В настоящее время наиболее полный экологический проект с открытым исходным кодом, независимый от фреймворка, является первым, продвигающим TVM, который был принят многими компаниями. Процесс TVM показан на рисунке 3a.TVM может импортировать модели из различных фреймворков, таких как TensorFlow pb, onnx, TorchScript и других моделей, которые единообразно представлены IR высокого уровня, называемым Relay by TVM. Каждый оператор в IR использует DSL тензорного выражения для описания вычислений и планирования. Этот DSL использует нотацию Эйнштейна для описания вычислений оператора, а вычисления оператора обычно воплощаются в виде нескольких циклов for. Затем, основываясь на идее Халида, расписание используется для выполнения различных преобразований в этом множественном цикле for, таких как слияние циклов, разделение, преобразование порядка и т. д. Наконец, IR от нижнего до низкого уровня генерирует код конкретного устройства и выводы.

Вот краткое введение в то, как TVM генерирует оптимальный код оператора. Выше описано, что оператор должен быть описан вычислением, а затем ему необходимо выполнить преобразование планирования для нескольких циклов for, соответствующих вычислению, то есть расписанию. Генерация оператора и настройка TVM прошли 3 поколения развития. Первое поколение TVM/AutoTVM, это поколение требует от пользователя написания вычислений оператора и расписания оператора.Разница между AutoTVM и TVM заключается в том, что некоторые переменные параметры могут быть определены в расписании, а затем, например, генетический алгоритм используется для настройка параметров. Например, если петля разделена на 2 сегмента, где делать сегментацию, можно оптимизировать. Второе поколение AutoScheduler (Ansor). Это поколение требует от пользователей только разработки оператора вычислений, а Ansor автоматически выполняет преобразования планирования в соответствии с некоторыми правилами. Поскольку разработка расписания должна быть знакома с механизмом выражения TVM и лежащими в основе аппаратными принципами одновременно, разработка расписания часто очень сложна. Поэтому Ansor может значительно снизить рабочую нагрузку и сложность разработки разработчиков. Недостатком является то, что настройка Ansor занимает много времени. долго, часто 1 час Можно настроить только одного оператора. На примере сверточной сети Ansor может превзойти производительность операторов TensorFlow в некоторых сценариях, и между реализацией TensorRT существует определенный разрыв. Мета-расписание третьего поколения (AutoTensorIR) находится только в зачаточном состоянии, и ожидается, что оно оптимизирует скорость настройки и производительность.Он пока недоступен, подождем и увидим.

Реализация TVM включает в себя инструмент разработки Huawei D-chip TBE, который добавляет поддержку генерации кода D-чипа на основе TVM. TVM использует маршрут расчета + планирования Halide, и есть еще один компилятор, который использует маршрут полиэдрального алгоритма, такой как Tensor Comprehensions, Tiramisu, AKG, разработанный Huawei, и т. д. Этот метод, как и Ansor, требует от пользователя только разработки вычислений оператора и не требует разработки расписания, поэтому он более удобен для пользователя. Среди них AKG использовалась в слиянии графовых вычислений MindSpore. Другие компиляторы глубокого обучения включают TensorFlow XLA, TensorRT и т. д., которые вы могли использовать.

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

Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~