В этой серии блогов, состоящей из двух частей, мы демонстрируем, как ускорить обучение модели глубокого обучения НЛП на нескольких графических процессорах, сократив время обучения модели BERT для SQuAD¹ с почти 7 часов до 30 минут. сильный>!

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

Семена глубокого обучения для НЛП

Модели нейронного языка, такие как BERT, XLNet и GPT-3, за последние пару лет набрали популярность. Почему это?

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

Значительное количество исследований, проведенных за последнее десятилетие, продемонстрировало важность языкового моделирования как движущей силы для максимального качества последующих моделей задач НЛП.³ Статистические языковые модели прошлого века, такие как мешок слов и idf» эффективно ограничил уровень техники намного ниже потрясающего уровня для многих задач НЛП, особенно задач НЛП сложный искусственный интеллект, которые нас увлекают. Я помню, как впервые поиграл с движком машинного перевода Babel Fish в конце 1990-х и пришел к выводу, что до Skynet еще далеко. ИИ.

Вышеупомянутое ограничение с тех пор было снято (возможно, исчезло) для многих задач НЛП, и мы постоянно ощущаем преимущества на собственном опыте, когда ищем в Интернете или разговариваем с Alexa. Успехи НЛП резко возросли в 2018 году, когда появился новый класс языковых моделей: ELMo, основанный на LSTM, за которым последовал BERT, основанный на архитектуре преобразователя. Новая идея этих языковых моделей заключается в их зависимости от контекста слова; в то время как предыдущие неконтекстные вложения слов, такие как word2vec и GloVe, кодируют заданное слово ровно в один вектор, модели Улицы Сезам предназначены для фиксации языковых нюансов способами, которые неконтекстные вложения слов не могут по определению. (Можете ли вы найти пример в этом предложении, который был бы проблематичным для word2vec, или вы видите пятна?)

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

Современные языковые модели могут быть астрономически дорогими в обучении. Такие модели, как BERT и XLNet, изучают сотни миллионов параметров, а стоимость вычислений для обучения многих моделей нейронного языка с нуля непомерно высока для большинства организаций. Например, для XLNet требовалось обучение в течение 5,5 дней на 512 TPU v3. Стоимость повторения этого на GCP составит более 500 000 долларов США. ⁵ Сложность языковой модели и стоимость обучения только растут — модель OpenAI GPT-3, представленная в мае 2020 года, изучает 175 миллиардов параметров, и, по оценкам, ее обучение стоит более 12 миллионов долларов. ».

Благодаря исследовательскому сообществу и организациям, поддерживающим исследования языковых моделей, высококачественные предварительно обученные модели доступны для всех бесплатно. фреймворк с помощью всего нескольких строк кода. В результате вышеупомянутый подход последовательного обучения к задачам НЛП легко реализовать при разумном бюджете. В нашем случае мы обучили BERT для SQuAD создавать модель, которая может извлекать ответы на вопросы о заданном отрывке. Каждый эксперимент требует менее 20 долларов США вычислительных затрат для обучения на GCP, и мы достигаем высоких показателей качества F1 в диапазоне 87–89 %. Для сравнения, производительность человека составляет 86,8%, а уровень техники — 93%.⁷

Базовое обучение с одним GPU

Начнем с обучения модели BERT для SQuAD на одном графическом процессоре. В этом примере PyTorch мы используем предварительно обученную модель библиотеки Hugging Face Transformers, методы определения характеристик и загрузки данных, а также эталонные гиперпараметры. Обучение в течение примерно 2 эпох на одном графическом процессоре дает оценку F1 88,4% в наборе данных проверки. Совсем неплохо… но на тренировку ушло более 7 часов! Это долгое время ожидания результатов, и это только одна проторенная задача НЛП с фиксированными гиперпараметрами. Если вам или вашей команде нужно тренироваться на большем количестве данных, настраивать гиперпараметры, обучать модели для других задач НЛП или разрабатывать и отлаживать модели для пользовательских последующих задач, потратив день или больше на обучение каждой модели, вы сведете все на нет.

Разделяй и властвуй

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

Благодаря парадигме стандартизированной модели в Definitiond обучение модели на нескольких графических процессорах не требует изменений кода. Каждый последующий результат, будь то тренировка с 2 графическими процессорами на одной машине или с 16 графическими процессорами на нескольких машинах, требовал только изменения конфигурации.

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

Первоначальные результаты

На следующем графике и в таблице показано время обучения настенных часов при масштабировании от 1 до 8 графических процессоров NVIDIA K80⁹ на одном компьютере с GCP. Для этих экспериментов мы зафиксировали как размер пакета для каждого графического процессора, так и общее количество эпох для обучения.

Это достойный первоначальный результат — мы не достигаем линейного масштабирования, но наша эффективность масштабирования остается выше 80%, а также нам удалось сократить время обучения настенных часов для модели BERT SQuAD до часа. Мы достигли оценки F1 87–88% в наборе данных проверки для всех четырех экспериментов.

Делаем лучше: агрегация градиентов и RAdam

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

Естественная теория того, что может происходить, состоит в том, что обучение связано с общением. Чтобы распределить обучение по 8 графическим процессорам, Definated делит набор обучающих данных на 8 сегментов, независимо обучает 8 моделей (по одной на каждый GPU) для мини-пакета, а затем объединяет и передает обновления градиента, чтобы все 8 копий модели имели одинаковые веса. Затем мы повторяем этот процесс прямого и обратного прохода с последующим агрегированием градиентов для каждой партии. время тренировки настенных часов. Такие методы особенно перспективны, когда графические процессоры подключаются через PCI-E, а не через NVLink с более высокой пропускной способностью (но и более дорогой).¹¹

Давайте посмотрим, применима ли эта теория к нашей модели. С помощью Defined вы можете настроить размер пакета для каждого слота с помощью изменения конфигурации, но имейте в виду, что даже небольшое увеличение может быстро исчерпать память графического процессора, поскольку промежуточное состояние, необходимое для прямого и обратного прохода, масштабируется с размером модели и линейно зависит от размера партии. Вместо этого мы сохранили умеренные требования к памяти графического процессора, чтобы работать с более дешевыми NVIDIA K80. Мы достигли этого, используя оптимизацию распределенного обучения, которая снижает как обмен данными между графическими процессорами, так и требования к памяти для каждого графического процессора. Этот параметр конфигурации частота агрегации указывает количество прямых и обратных проходов, которые необходимо выполнить перед передачей обновлений градиента между графическими процессорами. В следующей таблице мы видим, что увеличение частоты агрегации определенно помогает во время выполнения:

Это здорово — если мы сможем сократить время обучения на 31 минуту, наша эффективность масштабирования для каждого графического процессора повысится с 0,93 до идеальной 1. Однако я кое-что упустил — для трех строк выше наш набор данных проверки F1 составляет 87,3%, 85 % и (глоток) 52,1% соответственно.

Так близко и в то же время так далеко. Что здесь происходит? Стохастический градиентный спуск больших партий не всегда «просто работает»; в частности, в этой настройке трудно найти золотую середину скорости обучения. Иногда срабатывает правило линейного масштабирования: если мы умножаем размер пакета на k, мы также умножаем (ранее настроенную) скорость обучения на k. В нашем случае при использовании оптимизатора AdamW линейное масштабирование вообще не помогло; на самом деле, наши результаты F1 были даже хуже, когда применялось правило линейного масштабирования. Стратегии разогрева скорости обучения также могут помочь, когда меньшие скорости обучения используются в начале крупносерийного обучения. Однако, по нашему опыту, оптимизатор RAdam — лучший выбор, который надежно работает для обучения больших пакетов без необходимости обширной настройки скорости обучения. Когда мы заменяем эту реализацию RAdam, наши результаты выглядят намного лучше:

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

Тренировка на нескольких машинах с наддувом

Мы проделали долгий путь, используя возможности распределенного обучения, реализованные в Definated, чтобы сократить время обучения BERT для SQuAD с почти 7 часов на одном графическом процессоре до менее часа на 8 графических процессорах, подключенных к одной машине.

Что мы можем сделать, чтобы еще больше сократить время обучения, особенно учитывая тот факт, что 8 графических процессоров являются максимально допустимым для одного экземпляра на GCP? С помощью Defined разработчики моделей могут перейти к обучению на нескольких компьютерах так же легко, как и к обучению с использованием нескольких графических процессоров на одном компьютере. Это особенно ценно, когда базовое время обучения с одним графическим процессором занимает от нескольких дней до нескольких недель.

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

Стоит отметить, что по мере того, как мы масштабировались до нескольких машин, мы стали еще более привязанными к связи, до такой степени, что время обучения на 16 графических процессорах фактически было бы больше, чем время обучения на 8 графических процессорах на одной машине, если бы мы удержали константа эффективного размера партии. Увеличив частоту агрегирования всего до 2 и используя оптимизатор RAdam, мы значительно лучше масштабируемся и по-прежнему достигаем 87 баллов F1 в наборе данных проверки.

Что дальше?

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

Надеемся, что эта статья показала, что распределенное обучение с помощью программы Definded в реальном случае использования трансферного обучения НЛП является одновременно простым и очень ценным. Если вы готовы выполнять задания по обучению за обедом, а не за ночь, попробуйте и крикните мне, чтобы сообщить, как все идет. Удачной тренировки!

Написано: Дэйв Тройано, инженер по решениям в Defined AI.

Примечания:

  1. Стэнфордский набор данных для ответов на вопросы (SQuAD) — это популярный эталонный набор данных для задачи понимания прочитанного, заключающейся в извлечении ответов на вопросы из заданного отрывка.
  2. Это парадигма последовательного трансферного обучения (STL), в которой (обычно дорогостоящая) задача предварительного обучения выполняется один раз, а получающаяся в результате предварительно обученная модель является отправной точкой, с которой мы обучаем модели для последующих задач адаптации. Этот блог предлагает отличное объяснение STL и других разновидностей трансферного обучения в НЛП.
  3. Обзор современных языковых моделей на начало 2020 года
  4. С тех пор к партии НЛП присоединились и другие персонажи Улицы Сезам, а совсем недавно Большая птица была представлена ​​со специализацией на длинных последовательностях слов.
  5. 132 часа, умножить на $8 за час TPU (стоимость на момент написания), умножить на 512
  6. Например, модели XLNet доступны здесь.
  7. Современное состояние использует другую модель: SA-Net на Альберте (ансамбль).
  8. В частности, чтобы сообщить об эффективности модели, мы запускаем только один проход проверки в конце обучения. Время обучения, указанное в этом блоге, — это продолжительность, наблюдаемая с момента обучения нашей первой партии до момента начала проверки.
  9. Графические процессоры были подключены через PCI-E. GCP предлагает NVIDIA Tesla V100, подключенные через NVLink, хотя на момент написания этого блога стоимость одного GPU была более чем в 5 раз выше.
  10. Это небольшое упрощение. Реализация распределенного обучения в Defined выполняет обратное распространение без ожидания, что означает, что обновления градиента передаются слой за слоем. Это позволяет осуществлять обмен данными параллельно с обратным проходом.
  11. Это сравнение сообщает о пропускной способности NVLink примерно в 3 раза больше, чем PCI-E.

Первоначально опубликовано на https://determined.ai 3 сентября 2020 г.