Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как происходит параллельное обучение нейронной сети, например, на нескольких GPU?

Интересно, как при этом согласуются данные и веса сети. Слышал про возможность обучения сразу на нескольких gpu, но интересно узнать, что при этом происходит под капотом с данными и сетью.
ПрограммированиеData science+3
Анонимный вопрос
Data Science
  · 885
Openstack DevOps and IBM/Informix Certified DBA . Phd in Math (Duality of spaces of...  · 7 февр 2022
Мы можем разделить данные между несколькими графическими процессорами. Таким образом, все графические процессоры выполняют один и тот же тип работы, хотя и на разных наблюдениях. Градиенты объединяются между графическими процессорами после каждого мини-пакета обучающих данных. Это самый простой подход, и его можно применять в любой ситуации. Нам нужно только синхронизировать после каждого минипакета. При этом крайне желательно начать обмен параметрами градиентов уже тогда, когда остальные еще вычисляются. Кроме того, большее количество графических процессоров приводит к увеличению размера мини-пакетов, что повышает эффективность обучения. Однако добавление большего количества графических процессоров не позволяет нам обучать более крупные модели.
Сравнение различных способов распараллеливания на нескольких графических процессорах показано на рис. 12.5.2. По большому счету, параллелизм данных — самый удобный способ действовать, при условии, что у нас есть доступ к графическим процессорам с достаточно большим объемом памяти. Для подробного описания разделения для распределенного обучения. Память графического процессора была проблемой на заре глубокого обучения. К настоящему времени эта проблема решена для всех, кроме самых необычных случаев. Далее мы сосредоточимся на параллелизме данных.
====================
Параллелизм данных
====================
Предположим, что на машине имеется k графических процессоров. Учитывая обучаемую модель, каждый графический процессор будет независимо поддерживать полный набор параметров модели, хотя значения параметров на всех графических процессорах идентичны и синхронизированы. В качестве примера на рис. 12.5.3 показано обучение с параллелизмом данных при k=2.
В целом обучение проходит следующим образом:
В любой итерации обучения для случайного мини-пакета мы разбиваем примеры в пакете на k частей и равномерно распределяем их по графическим процессорам. Каждый графический процессор вычисляет потери и градиент параметров модели на основе назначенного ему подмножества мини-пакетов. Локальные градиенты каждого из k графических процессоров объединяются для получения текущего стохастического градиента мини-пакета. Совокупный градиент перераспределяется на каждый GPU. Каждый GPU использует этот минипакетный стохастический градиент для обновления полного набора поддерживаемых им параметров модели.
=======================
Обратите внимание, что на практике мы увеличиваем размер мини-пакета в k раз при обучении на k графических процессорах, чтобы каждый графический процессор выполнял такой же объем работы, как если бы мы обучались только на одном графическом процессоре. На сервере с 16 GPU это может значительно увеличить размер мини-пакета, и нам, возможно, придется соответственно увеличить скорость обучения. Также обратите внимание, что пакетную нормализацию необходимо скорректировать, например, путем сохранения отдельного коэффициента пакетной нормализации для каждого графического процессора.
========================
Резюме
Существует несколько способов разделить обучение глубокой сети на несколько графических процессоров. Мы могли бы разделить их между слоями, слоями или данными. Первые два требуют четко отлаженной передачи данных. Параллелизм данных — простейшая стратегия.
  1. Параллельное обучение данных является простым. Однако это увеличивает эффективный размер мини-пакета, чтобы быть эффективным.
  2. При параллелизме данных данные распределяются между несколькими графическими процессорами, где каждый графический процессор выполняет свою собственную прямую и обратную операцию, после чего градиенты агрегируются, а результаты передаются обратно на графические процессоры.
Мы можем использовать немного повышенную скорость обучения для больших мини-пакетов.