Методы обучения больших нейронных сетей PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Методы обучения больших нейронных сетей

Методы обучения больших нейронных сетей

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

Параллелизм данных

Методы обучения больших нейронных сетей

Конвейерный параллелизм

Методы обучения больших нейронных сетей

Тензорный параллелизм

Методы обучения больших нейронных сетей

Экспертный параллелизм

Методы обучения больших нейронных сетей

Параллелизм данных

Методы обучения больших нейронных сетей

Конвейерный параллелизм

Методы обучения больших нейронных сетей

Тензорный параллелизм

Методы обучения больших нейронных сетей

Экспертный параллелизм

Методы обучения больших нейронных сетей

Иллюстрация различных стратегий параллелизма на трехслойной модели. Каждый цвет относится к одному слою, а пунктирные линии отделяют разные графические процессоры.

Нет параллелизма

Обучение нейронной сети — это итеративный процесс. В каждой итерации мы делаем проход вперед через модель слоев для вычисления выходных данных для каждого обучающего примера в пакете данных. Затем следует еще один проход назад через слои, распространяя, насколько каждый параметр влияет на конечный результат, вычисляя градиент по каждому параметру. Средний градиент для партии, параметры и некоторое состояние оптимизации для каждого параметра передаются в алгоритм оптимизации, такой как Адам, который вычисляет параметры следующей итерации (которые должны иметь немного лучшую производительность для ваших данных) и новое состояние оптимизации для каждого параметра. По мере того, как обучение повторяет наборы данных, модель развивается, чтобы давать все более точные результаты.

Различные методы параллелизма разбивают этот учебный процесс по разным измерениям, в том числе:

  • Параллелизм данных — запуск разных подмножеств пакета на разных графических процессорах;
  • Конвейерный параллелизм — запуск разных слоев модели на разных графических процессорах;
  • Тензорный параллелизм — разбейте математику на отдельные операции, такие как умножение матриц, которые будут разделены между графическими процессорами;
  • Mixture-of-Experts — обработайте каждый пример только частью каждого слоя.

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

Параллелизм данных

Параллельные данные обучение означает копирование одних и тех же параметров на несколько графических процессоров (часто называемых «рабочими») и назначение каждому из них разных примеров для одновременной обработки. Сам по себе параллелизм данных по-прежнему требует, чтобы ваша модель помещалась в память одного графического процессора, но позволяет вам использовать вычислительные ресурсы многих графических процессоров за счет хранения множества повторяющихся копий ваших параметров. При этом существуют стратегии увеличения эффективной оперативной памяти, доступной для вашего графического процессора, например, временная выгрузка параметров в память ЦП между использованиями.

По мере того как каждый рабочий процесс, работающий параллельно с данными, обновляет свою копию параметров, им необходимо координировать свои действия, чтобы гарантировать, что каждый рабочий процесс по-прежнему будет иметь одинаковые параметры. Самый простой подход — ввести блокировку связи между воркерами: (1) независимо вычислять градиент на каждом воркере; (2) усреднить градиенты по рабочим; и (3) независимо вычислить одни и те же новые параметры для каждого работника. Шаг (2) — это усреднение по блокировке, которое требует передачи довольно большого количества данных (пропорционально количеству рабочих, умноженному на размер ваших параметров), что может снизить пропускную способность вашего обучения. Существуют различные схемы асинхронной синхронизации убрать эти накладные расходы, но они снижают эффективность обучения; на практике люди обычно придерживаются синхронного подхода.

Конвейерный параллелизм

Доступно Параллельный трубопровод обучения, мы разделяем последовательные фрагменты модели между графическими процессорами. Каждый GPU содержит только часть параметров, поэтому одна и та же модель потребляет пропорционально меньше памяти на GPU.

Разбить большую модель на части последовательных слоев несложно. Однако существует последовательная зависимость между входными и выходными данными слоев, поэтому наивная реализация может привести к большому количеству времени простоя, пока рабочий ждет, когда выходные данные предыдущей машины будут использованы в качестве его входных данных. Эти отрезки времени ожидания известны как «пузыри», тратя впустую вычисления, которые могли бы быть выполнены бездействующими машинами.

Методы обучения больших нейронных сетей вперед
Методы обучения больших нейронных сетей назад
Методы обучения больших нейронных сетей Обновление градиента
Методы обучения больших нейронных сетей Idle
Методы обучения больших нейронных сетей

Иллюстрация настройки простого параллелизма конвейера, в которой модель разделена по вертикали на 4 раздела по слоям. Рабочий процесс 1 содержит параметры модели первого слоя сети (ближайший к входу), а рабочий процесс 4 — слой 4 (ближайший к выходу). «F», «B» и «U» обозначают операции «вперед», «назад» и «обновление» соответственно. Нижние индексы указывают, на каком рабочем процессе выполняется операция. Данные обрабатываются одним работником за раз из-за последовательной зависимости, что приводит к большим «пузырям» простоя.

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

Количество рабочих, на которые разбита модель, обычно называют глубина трубопровода.

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

Методы обучения больших нейронных сетей вперед
Методы обучения больших нейронных сетей назад
Методы обучения больших нейронных сетей Обновление ПО
Методы обучения больших нейронных сетей Idle
GPipe

Методы обучения больших нейронных сетей

Несбыточная мечта

Методы обучения больших нейронных сетей

Сравнение схем конвейерной обработки GPipe и PipeDream с использованием 4 микропакетов на партию. Микропакеты 1-8 соответствуют двум последовательным пакетам данных. На изображении «(число)» указывает, на каком микропакете выполняется операция, а нижний индекс отмечает рабочий идентификатор. Обратите внимание, что PipeDream получает большую эффективность, выполняя некоторые вычисления с устаревшими параметрами.

Тензорный параллелизм

Конвейерный параллелизм разделяет модель «по вертикали» по слоям. Также возможно «горизонтально» разделить определенные операции внутри слоя, что обычно называется Тензорная параллель подготовка. Для многих современных моделей (таких как трансформатор), узким местом вычислений является умножение матрицы пакета активации на матрицу большого веса. Матричное умножение можно рассматривать как скалярные произведения между парами строк и столбцов; можно вычислять независимые скалярные произведения на разных графических процессорах или вычислять части каждого скалярного произведения на разных графических процессорах и суммировать результаты. При любой из этих стратегий мы можем разрезать матрицу весов на «осколки» одинакового размера, размещать каждый осколок на отдельном графическом процессоре и использовать этот осколок для вычисления соответствующей части общего произведения матрицы, а затем сообщать об этом для объединения результатов.

Одним из примеров является Мегатрон-ЛМ, который распараллеливает матричные умножения в слоях внутреннего внимания и MLP Transformer. ПТД-П использует тензор, данные и конвейерный параллелизм; его конвейерный график назначает несколько непоследовательных уровней каждому устройству, уменьшая накладные расходы за счет большего количества сетевых коммуникаций.

Иногда ввод в сеть может быть распараллелен по измерению с высокой степенью параллельных вычислений по сравнению с кросс-коммуникациями. Параллелизм последовательностей является одной из таких идей, когда входная последовательность разбивается во времени на несколько подпримеров, пропорционально уменьшая пиковое потребление памяти, позволяя выполнять вычисления с примерами более детального размера.

Смесь экспертов (МО)

Для Смесь экспертов (МО) подход, только часть сети используется для вычисления выходных данных для любого одного входа. Один пример подхода состоит в том, чтобы иметь много наборов весов, и сеть может выбирать, какой набор использовать, через механизм логического вывода во время вывода. Это позволяет использовать гораздо больше параметров без увеличения вычислительных затрат. Каждый набор весов называется «экспертами» в надежде, что сеть научится назначать специализированные вычисления и навыки каждому эксперту. Разные эксперты могут размещаться на разных графических процессорах, предоставляя четкий способ увеличения количества графических процессоров, используемых для модели.

Методы обучения больших нейронных сетей

Иллюстрация слоя смешанных экспертов (MoE). Только 2 из n эксперты выбираются шлюзовой сетью. (Изображение адаптировано из: Шазир и др., 2017 г.)

Гшард масштабирует MoE Transformer до 600 миллиардов параметров со схемой, в которой только уровни MoE разделены между несколькими устройствами TPU, а другие уровни полностью дублируются. Переключатель трансформатора масштабирует размер модели до триллионов параметров с еще большей разреженностью, направляя один вход одному эксперту.

Другие схемы экономии памяти

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

  • Чтобы вычислить градиент, вам нужно сохранить исходные активации, которые могут потреблять много оперативной памяти устройства. Контрольные точки (также известное как перерасчет активации) сохраняет любое подмножество активаций и повторно вычисляет промежуточные активации точно в момент во время обратного прохода. Это экономит много памяти за счет вычислительных затрат не более чем на один дополнительный полный прямой проход. Можно также постоянно искать компромисс между затратами на вычисления и память, выборочный активационный перерасчет, который устанавливает контрольные точки для подмножеств активаций, которые относительно дороже хранить, но дешевле вычислять.

  • Тренировка смешанной точности заключается в обучении моделей с использованием чисел с более низкой точностью (чаще всего FP16). Современные ускорители могут достигать гораздо большего количества FLOP с числами с более низкой точностью, и вы также экономите на оперативной памяти устройства. При должном уходе полученная модель практически не теряет точности.

  • Разгрузка заключается в том, чтобы временно выгрузить неиспользуемые данные в ЦП или между различными устройствами, а затем прочитать их обратно, когда это необходимо. Простые реализации сильно замедлят обучение, но сложные реализации будут предварительно извлекать данные, так что устройству никогда не придется ждать их. Одной из реализаций этой идеи является Нуль который разделяет параметры, градиенты и состояния оптимизатора на все доступное оборудование и материализует их по мере необходимости.

  • Оптимизаторы эффективного использования памяти были предложены для уменьшения объема памяти, занимаемого оптимизатором в рабочем состоянии., Такие, как Адафактор.

  • компрессия также может использоваться для хранения промежуточных результатов в сети. Например, Суть сжимает активации, сохраненные для обратного прохода; DALL · E сжимает градиенты перед их синхронизацией.


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


Благодарности
Спасибо Николасу Тезаку, Сэму Альтману, Даниэлю Гакле, Илье Суцкеверу и Стивену Адлеру за отзывы о черновиках. Спасибо Джастину Джею Вану, Бьянке Мартин и Стиву Доулингу за общение и дизайн.

Отметка времени:

Больше от OpenAI