Какое-то время работая с распределенными вычислениями (😄 Big Data), мне интересно, как алгоритмы глубокого обучения масштабируются на несколько узлов. Facebook AI Research (FAIR) недавно опубликовал статью о том, как они успешно запустили модель слоя resnet-50 в наборе данных ImageNet с размером мини-пакета из 8192 изображений в час с использованием 256 графических процессоров. Я считаю, что большая часть информации, представленной в документе, применима ко всем, кто пытается быстро создавать модели на установке с несколькими графическими процессорами. В этой статье я суммирую основные выводы из статьи, которые будут полезны при попытке масштабировать свои реализации глубокого обучения.

Ключевые выводы:

  1. Распределенный синхронный SGD обеспечивает решение проблемы разделения мини-пакетов SGD на группу узлов, которые могут состоять из нескольких графических процессоров.
  2. Большие размеры мини-пакетов вызывают трудности с оптимизацией, и существуют методы их решения.
  3. Используйте правило линейного масштабирования для настройки скорости обучения, которая является функцией размера мини-пакета и схемы разминки.

Почему важен масштаб?

В последнее время доказано, что алгоритм глубокого обучения работает лучше, когда ему предоставляются огромные объемы данных. Получив больше данных, он показал огромные улучшения в области компьютерного зрения, обработки естественного языка и речи. Но использование такой архитектуры, как Resnet -50, в масштабе 256 узлов сопряжено со своими проблемами.

Что такое распределенный синхронный SGD?

Ниже приводится формулировка SGD.

Где X - общий набор данных, x - выборка из набора данных, l (x, w) - потеря (перекрестная потеря энтропии), вычисленная для каждой выборки относительно метки.

Но на практике мы используем SGD для мини-партии, где мы рассчитываем потери и градиенты для каждой партии и соответственно изменяем веса. Как сформулировано ниже.

Где β представляет собой мини-партию, которая является подмножеством X.

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

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

Почему так важны уловки?

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

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

  1. Правило линейного масштабирования
  2. Стратегии разминки
  3. Пакетная нормализация с большими мини-пакетами

Что такое правило линейного масштабирования?

Возможность использовать пакеты больших размеров чрезвычайно полезна для распараллеливания обработки изображений на нескольких рабочих узлах. Правило линейного масштабирования говорит только об увеличении скорости обучения в «k» раз. Где «k» - это количество раз, когда размер вашей партии увеличивается. Хотя правило простое, оно оказывается действенным.

Изображение с (а) показывает, как модель работает, когда применяется только правило линейного масштабирования. Глядя на результаты, очевидно, что модель с размером пакета 8 КБ работала почти так же хорошо, как модель, обученная с обычными пакетами. Стратегия разминки помогает модели работать так же хорошо, как и модель, обученная с небольшими партиями.

Что такое стратегии разминки?

Обсуждаются две стратегии разметки. Один из них - постоянная разминка и постепенная разминка.

Постоянная разминка: в постоянной разминке вы тренируете модель с небольшой скоростью обучения в течение нескольких эпох (5 эпох в статье), а затем увеличиваете скорость обучения до «k-кратной скорости обучения». подход вызывает всплеск ошибки обучения при изменении скорости обучения. Наблюдение видно на изображении (b) выше. Ошибка обучения модели также выше по сравнению с простым правилом линейного масштабирования.

Постепенная разминка: Как следует из названия, вы начинаете с небольшой скорости обучения, а затем постепенно увеличиваете ее на постоянную величину для каждой эпохи, пока она не достигнет «k-кратной скорости обучения». Такой подход помогает модели работать лучше с большими партиями (8k в этом примере), что соответствует ошибке обучения модели, обученной с меньшими партиями.

В чем особенность пакетной нормализации при использовании больших партий?

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

Следовательно, рекомендуется поддерживать размер мини-пакета одинаковым для всех рабочих узлов, в документе это 32 образца для каждого рабочего, а количество рабочих - 256. Нормализация пакета должна быть рассчитана на уровне узла (размером 32), а не чем на уровне партии (размером 8k).

Тонкости и подводные камни распределенного SGD:

  1. Масштабирование потерь кросс-энтропии не эквивалентно масштабированию скорости обучения.
  2. Есть два популярных способа применения импульса: один рассчитывается до использования скорости обучения (уравнение 9), а другой - скорости обучения (уравнение 10).

Замечено, что применение коррекции импульса после изменения скорости обучения обеспечивает большую стабильность обучения.

3. При выполнении агрегации градиентов нормализуйте градиенты в каждом рабочем процессе на kn, а не на n. «N» указывает количество выборок, обработанных на рабочий узел, а «k» представляет общее количество рабочих.

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

Скоро встретимся с другим постом 😃