Инженеры Graphcore объясняют, как они реализовали и оптимизировали BERT-Large для систем IPU, используя стандартные схемы машинного обучения.

Авторы: Чен Джин, руководитель подразделения China Engineering, и Фил Браун, директор по приложениям.

BERT - одна из наиболее широко используемых сегодня моделей обработки естественного языка благодаря своей точности и гибкости. Это также одна из самых востребованных моделей среди клиентов Graphcore.

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

Здесь мы подробно объясним методы оптимизации, которые инженеры из групп Graphcore Applications, Software и China Engineering использовали для предварительного обучения и точной настройки нашей реализации BERT-Large.

Подъем BERT

Двунаправленные представления кодировщика от преобразователей (BERT) - это основанная на преобразователе языковая модель представления, созданная Google. Его популярность резко выросла с момента его выпуска в конце 2018 года.

Первоначально опробованный примерно на 10% англоязычных поисковых запросов Google в США, BERT сегодня используется почти во всех англоязычных поисковых запросах Google.

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

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

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

Наряду с крупномасштабными задачами, такими как языковое моделирование, очень мелкомасштабные последующие задачи также могут извлечь выгоду из этих подходов. Например, Microsoft Research Paraphrase Corpus (MRPC) имеет всего 3600 обучающих выборок, но точность улучшена с 84,4 до 86,6% за счет увеличения размера модели с BERT-Base до BERT-Large. Варианты BERT сохраняют преимущество над MRPC и многими аналогичными тестами.

По мере того как исследователи и инженеры машинного обучения стремятся и дальше улучшать производительность задач этих моделей, размеры моделей становятся все больше и больше. Это можно увидеть как в вариантах модели BERT, так и в нескольких других более поздних моделях, таких как GPT-3 с его 175 миллиардами параметров.

Предварительная тренировка BERT на IPU-POD

Это стало возможным не только благодаря достижениям в области моделирования. Разработка нового оборудования и систем искусственного интеллекта, которые могут предложить более высокую эффективность, также позволит нам обучать эти крупномасштабные модели в разумные сроки, потенциально предварительно обучая миллиарды образцов за дни или даже часы. Система Graphcore IPU ‑ POD решает эту проблему производительности и значительно повышает производительность исследователей и инженеров. Система IPU-POD использует чрезвычайно высокопроизводительную внутрипроцессорную память для обеспечения превосходной вычислительной производительности и повышения энергоэффективности за счет минимизации перемещения данных. Высокоскоростное масштабируемое межсоединение и интеллектуальное управление памятью позволяют приложениям эффективно масштабироваться до сотен IPU.

Чтобы эффективно запустить BERT на IPU ‑ POD, мы загружаем все параметры модели в IPU. Для этого мы разделяем или «сегментируем» модель BERT на четыре IPU и выполняем модель как конвейер во время процесса обучения.

Ниже вы можете увидеть пример того, как мы разбиваем BERT-Large. IPU 0 содержит уровень внедрения и уровни проекции / потерь вместе с тремя уровнями кодировщика, а оставшийся 21 уровень равномерно распределен между тремя другими IPU. Поскольку уровни встраивания и проекции имеют общие параметры, мы можем снова разместить уровни проекции, маскированной языковой модели (MLM) и предсказания следующего предложения (NSP) на IPU 0.

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

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

Потоковая память - это то, как мы описываем память вне кристалла в Graphcore. Каждая из основных строительных блоков платформ IPU-M2000 в системе IPU-POD64 имеет до 450 ГБ памяти, к которой могут обращаться 4 IPU. Это делится на 900 МБ внутрипроцессорной памяти, включенной в каждый чип IPU, и до 112 ГБ на IPU внешней потоковой памяти. Эта потоковая память поддерживается модулями DDR4 DIMM на IPU-Machine.

Реализация BERT от Graphcore в TensorFlow, PyTorch и PopART

В Примеры Graphcore в наших примерах приложений GitHub вы можете найти реализации BERT для IPU в TensorFlow, PyTorch и PopART.

Наша реализация TensorFlow имеет общий код модели с исходной реализацией Google BERT с настройкой и расширением для использования API конвейерной обработки TensorFlow от Graphcore.

Наша реализация PyTorch основана на описании моделей и утилит из библиотеки преобразователей Hugging Face. Мы используем библиотеку Graphcore PopTorch для нацеливания на IPU, включая конвейерное выполнение, повторное вычисление и параллелизм нескольких реплик / данных.

Реализация BERT с использованием расширенной среды выполнения Poplar (PopART) также доступна на нашем Github. PopART позволяет импортировать или создавать модели из описания модели ONNX как для обучения, так и для вывода, и включает как C ++ API, так и Python API. PopART поддерживает оптимизатор, градиент и разделение параметров, как описано в этой статье. В совокупности мы называем это реплицированным тензорным сегментированием (RTS). Для нашей реплицированной системы BERT с параллельной моделью конвейера в PopART мы используем оптимизатор и градиентное разбиение.

Масштабирование BERT до IPU-POD

Неконтролируемое предварительное обучение позволяет BERT использовать миллиарды обучающих выборок в Википедии, BookCorpus и других источниках. Даже с IPU ‑ POD4 несколько проходов по этим большим наборам данных занимают значительное время. Чтобы сократить время обучения, мы используем обучение модели с параллельными данными для масштабирования процесса предварительного обучения до IPU ‑ POD16, IPU ‑ POD64 и выше.

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

Коллективное снижение градиента

Для уменьшения градиента используется Коммуникационная библиотека Graphcore (GCL), расширение нашего программного стека Poplar, предназначенное для обеспечения высокопроизводительного горизонтального масштабирования. GCL включает в себя высокоэффективный алгоритм All-Reduce на основе кольца, а также множество других общих примитивов связи. Градиенты усредняются по всем репликам, как показано на изображении ниже, и обновления веса применяются после того, как все градиенты с несколькими репликами полностью уменьшены.

Снижение градиента параллельно данным может быть добавлено автоматически с помощью функций оболочки оптимизатора или с более точным контролем в пользовательских определениях оптимизатора. Это сокращение может происходить плавно внутри IPU-POD или между разными IPU-POD.

Для получения дополнительной информации о том, как API работает в TensorFlow, вы можете прочитать о Реплицированных графах в руководстве пользователя TensorFlow.

Для PyTorch мы устанавливаем коэффициент репликации в параметрах модели PopTorch IPU.

Обучение BERT с большими партиями

Одним из основных факторов, влияющих на эффективность параллельного масштабирования модели, является то, как часто необходимо передавать градиенты. Мы используем градиентное накопление (GA), чтобы отделить размер вычислений или микропакетов от глобального размера пакета. Это также позволяет нам поддерживать постоянный глобальный размер пакета при изменении количества IPU и / или реплик, регулируя коэффициент накопления градиента: глобальный размер пакета = размер пакета реплик × количество реплик, где размер пакета реплик = размер пакета вычислений × коэффициент накопления градиента.

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

Однако, если GA слишком велик, например несколько тысяч, это может вызвать проблемы недостаточного заполнения с FP16. В случае небольшого GA это может привести к низкой эффективности конвейера из-за избыточных расходов, как описано здесь. Для поиска оптимального значения могут потребоваться некоторые эксперименты.

В следующих разделах мы рассмотрим скорость обучения, схемы разминки и оптимизатора, которые мы используем при обучении BERT.

Правило линейного масштабирования

В этой статье об обучении ImageNet с мини-пакетами SGD исследователи использовали правило линейного масштабирования при обучении больших глобальных пакетов для ResNet-50 и Mask R-CNN. Это правило определяет, что когда размер пакета реплик n умножается на k (где k - обычно количество реплик модели), базовая скорость обучения, η, следует умножить на k и установить на .

Увеличение размера глобального пакета с n до nk при использовании того же количества эпох обучения и сохранении точности тестирования может сократить общее время обучения в раз. k и значительно сократить время производства модели. Однако показано, что производительность задачи снижается с большими глобальными пакетами.

Стратегия постепенной разминки

Один из способов смягчить это - разминка, когда скорость обучения не инициализируется как сразу. Вместо этого процедура обучения начинается с нулевой или произвольно малой скорости обучения и линейно увеличивает ее в течение заранее определенного количества шагов разминки, пока не достигнет . Эта постепенная разминка позволяет обучать в больших глобальных пакетах с гораздо меньшим количеством шагов для достижения точности обучения, аналогичной меньшему размеру пакета. В статье Обучение ImageNet с мини-пакетами SGD это позволило провести обучение с глобальным размером пакета ~ 8000.

Предварительно определенные шаги разминки различны для фазы 1 и фазы 2 в предтренировочном кейсе BERT-Large. Как и в документе BERT, наша фаза 1 использует обучающие данные с максимальной длиной последовательности 128 и максимальной длиной последовательности 384 для фазы 2. Разминка для фазы 1 составляет 2000 шагов, что составляет около 30% от все шаги тренировки в фазе 1. Для сравнения, во время фазы 2 всего 2100 шагов, и примерно 13% этих шагов являются разминкой.

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

Оптимизатор AdamW

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

В своей статье ICLR 2019 исследователи Лощилов и Хаттер обнаружили, что регуляризация L2 неэффективна для Адама. Вместо этого они предложили AdamW, который применяет регуляризацию убывания веса на этапе обновления веса вместо регуляризации L2 в функции потерь. Это позволяет весам уменьшаться мультипликативно, а не на аддитивный постоянный множитель. Они продемонстрировали, что AdamW с теплыми перезапусками имеет лучшие потери при обучении и ошибку обобщения как для CIFAR-10, так и для ResNet32x32.

В рамках предварительного обучения BERT IPU ‑ POD16 мы экспериментировали с AdamW, используя предварительные размеры глобальных пакетов в диапазоне от 512 до 2560, и все они достигли сходимости с эталонной точностью при точной настройке на нисходящей задаче SQuAD.

Оптимизатор LAMB

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

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

где η - общая скорость обучения, ∥ x ∥ - норма параметров этого слоя, а ∥ g ∥ - норма обновления для того же оптимизатора AdamW.

Это означает, что LAMB нормализует обновление, а затем умножает его на ∥ x ∥, чтобы оно было того же порядка величины, что и параметры каждого слоя, гарантируя, что обновление внесет некоторые реальные изменения в каждый слой. . Затем результат умножается на общую скорость обучения η.

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

Для BERT LAMB обеспечивает глобальные размеры пакетов до 65 536 на этапе 1 и до 32 768 на этапе 2.

Низкая точность обучения

На раннем этапе развития глубокого обучения многие модели обучались с использованием 32-битной точной арифметики с плавающей запятой. Использование более низкой точности привлекательно, поскольку оно обеспечивает более высокую вычислительную производительность - для IPU пиковая производительность FP16 в четыре раза выше, чем FP32. При более низкой точности размер тензоров уменьшается в два раза, что снижает нагрузку на память и затраты на связь.

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

Мы реализуем масштабирование потерь аналогичным образом при обучении с активациями и градиентами в FP16.

IPU Graphcore могут использовать стохастическое округление, а также традиционные режимы округления IEEE. Стохастическое округление основано на вероятности, которая пропорциональна близости значения к верхней и нижней границам округления. Это дает объективный результат округления для большого количества выборок.

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

Моменты первого и второго порядка в оптимизаторе вычисляются и сохраняются в FP32, а нормализация также выполняется в FP32. Остальные операции в тренировочном процессе рассчитываются в FP16.

Результаты тренировок

Последняя горизонтально масштабируемая система Graphcore демонстрирует беспрецедентную эффективность для обучения BERT-Large: время обучения до 2,6 раз меньше, чем у сопоставимой системы на основе DGX A100.

Содержащий 16 наших последних ускорителей IPU-M2000, IPU-POD64 основан на инновациях в технологиях вычислений, связи и памяти, чтобы обеспечить ту же точность, что и ведущие платформы искусственного интеллекта на BERT-Large, в гораздо более короткие сроки. В приведенной ниже диаграмме мы предоставляем результаты с использованием стандартных высокоуровневых фреймворков TensorFlow и PyTorch, а также нашей собственной реализации на основе PopART. Они сравниваются с лучшими опубликованными результатами NVIDIA, которые были для PyTorch и с использованием аналогичной методологии для получения сопоставимого результата по времени обучения.

Предтренировочная точность

На диаграммах ниже показаны кривые потерь до обучения для наших реализаций TensorFlow, PyTorch и PopART, демонстрирующие сходимость к эквивалентным потерям при окончании обучения и очень похожие кривые обучения. Мы также включаем пропускную способность обучения для всех трех реализаций модели на IPU-POD16 и IPU-POD64.

Точность точной настройки

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

Эта двухфазная установка широко используется на практике, поскольку дает следующие преимущества:

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

На IPU ‑ POD4 или IPU ‑ POD16 тонкую настройку можно выполнить за минуты или часы, в зависимости от размера обучающего набора данных. Многие тренировки по тонкой настройке можно остановить после небольшого количества проходов по тренировочным сетам.

SQuAD v1.1

Стэнфордский набор данных ответов на вопросы (SQuAD) v1.1 - это большой набор данных для понимания прочитанного, который содержит более 100 000 пар вопросов и ответов в более чем 500 статьях.

В таблице ниже показана точность при точной настройке BERT-Large с задачей SQuAD v1.1 на IPU с использованием эталонных предварительно обученных и предварительно обученных весов IPU. Как было продемонстрировано, IPU могут превосходить эталонную точность для этой задачи.

ПОДСКАЗКА

Следующий набор данных, который мы рассмотрим, показывает точность, когда мы настраиваем BERT-Base с задачами оценки понимания китайского языка (CLUE) на IPU с использованием предварительно обученных весов Google.

Оценка CLUE - это среднее значение точности теста по всем задачам CLUE. Точность теста каждой задачи - это среднее значение пяти результатов эксперимента. Как показано в таблице ниже, IPU могут достигать той же точности, что и другие платформы AI, такие как DGX-1 V100.

С помощью всего лишь нескольких оптимизаций специалисты в области искусственного интеллекта могут использовать системы IPU-POD, чтобы значительно сократить время обучения BERT-Large без ущерба для точности. Как мы видели, гораздо проще, чем вы думаете, запустить большую модель, такую ​​как BERT, на нашей новой аппаратной архитектуре. Вы, вероятно, знакомы со многими методами оптимизации, которые мы здесь описали. Мы также сделали доступными наши реализации TensorFlow и PyTorch, чтобы любой специалист, занимающийся машинным обучением, мог посмотреть, как они будут использовать эти фреймворки для запуска BERT на IPU.

Поскольку исследователи и инженеры все чаще обращаются к более крупным моделям, таким как BERT, для достижения максимально возможной производительности задач, эффективность оборудования будет играть решающую роль. Здесь мы увидели, что, используя системы IPU-POD, новаторы могут не только воспользоваться преимуществами точности BERT-Large и аналогичных моделей, но и получить значительный прирост производительности. Уникальные характеристики процессорной архитектуры IPU позволяют ускорить работу самых передовых моделей сегодняшнего дня, одновременно позволяя нам переосмыслить, как должны разрабатываться самые современные модели завтрашнего дня, и все это в знакомой программной среде.

Спасибо нашим инженерам, которые вели эту работу:

Джеймс Бриггс, Оскар Буньян, Лоренцо Чеволани, Арджун Чандра, Ник Куронно, Лакшми Кришнан, Гоин Ли, Вису Логанатан, Сэм Мэддрелл-Мандер, Чживэй Тиан, Сильвен Вигуер, Сиань Ван, Сихуай Вэнь Ся, Чэн Чжаун Шо

Помимо названий выше, благодарим разработчиков приложений BERT, PopART, TensorFlow, PyTorch, GCL и Poplar в Graphcore за их поддержку при внедрении и оптимизации BERT для систем IPU.