Распределенное обучение глубокому обучению

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

1. Зачем нужно распределенное обучение?

С развитием искусственного интеллекта и глубокого обучения крупномасштабные и сверхкрупномасштабные модели пользуются все большим уважением в отрасли. Возьмем в качестве примера индустрию НЛП, начиная с начальной базы Bert, имеющей всего около 100 миллионов параметров, до GPT-3 уровня 100 миллиардов и до самой большой в мире предтренировочной модели Enlightenment 2.0, выпущенной в июне этого года. Шкала параметров Достигнув ошеломляющих 1,75 трлн, вся отрасль движется в сторону более крупных моделей. В условиях такой огромной модели для обучения необходим огромный объем данных, и если нет больших вычислительных мощностей для распределенного обучения, Эпоха может обучаться до конца дня. Помимо отраслевого сценария закалки сверхбольших моделей, для обычного инженера-алгоритма в индустрии ИИ перед лицом повседневной работы распределенное обучение также может значительно ускорить обучение модели, ритм настройки параметров и итеративность. обновление версий.В этот драгоценный момент я верю, что ни один инженер не устоит перед преимуществами распределенного обучения. Поэтому сегодня мы поговорим о тех вещах, которые касаются распределенного обучения глубокому обучению.图片1.png

2. Стратегия распределенного обучения

Распределенные стратегии обучения можно просто разделить на параллелизм данных и параллелизм моделей в соответствии с различными методами параллелизма.图片2.png

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

Параллелизм данных заключается в копировании и сохранении копии модели на разных графических процессорах, последующем назначении разных данных на разные графические процессоры для расчета и, наконец, объединении результатов всех вычислений графического процессора для достижения цели ускорения обучения модели. Поскольку параллелизм данных предполагает объединение результатов вычислений разных графических процессоров и последующее обновление модели, его можно разделить на синхронное обновление и асинхронное обновление в соответствии с новым методом. При параллелизме данных каждый графический процессор вычисляет только часть данных в пакете. Синхронное обновление означает, что после ожидания завершения расчета всеми графическими процессорами веса сети объединяются и обновляются единообразно и передаются на все графические процессоры. выполняется раунд расчета. Асинхронный отличается от нового.При асинхронном обновлении каждому GPU не нужно ждать других GPU после завершения независимого расчета.Общий вес можно обновить сразу, а затем транслировать на другие GPU, а затем сразу же войти в следующий раунд расчет. Видно, что при синхронном обновлении необходимо дождаться завершения вычислений всеми графическими процессорами перед обновлением.Если графический процессор в кластере медленно обучается или связь в кластере дрожит, это повлияет на скорость обучения всей сети. , Подобно эффекту бочки, самая короткая доска определяет максимальную вместимость. Асинхронному обновлению не нужно ждать других узлов GPU, поэтому общая скорость обучения будет выше, но возникнет серьезная проблема сбоя градиента. То есть в случае асинхронности каждый узел будет обновляться сразу после завершения обучения, что приведет к тому, что текущие параметры модели других узлов и параметры модели, используемые до этого раунда обучения, могут быть несогласованными, что приведет к истечению срока действия. градиент в это время. Поэтому, хотя асинхронные обновления выполняются быстро, модель имеет тенденцию к неоптимальному решению из-за проблемы сбоя градиента.图片3.png

2.2 Параллелизм модели

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

3. Распределенный метод обучения на основе Pytorch

В Pytorch для нас предусмотрены две схемы распределенного обучения с несколькими графическими процессорами: torch.nn.DataParallel (DP) и torch.nn.parallel.Distributed Data Parallel (DDP).

3.1 Data Parallel

Режим DP очень прост. Его нужно изменить только код одного графического процессора. Это может быть запущено. Поскольку режим DP использует архитектуру PS, существует проблема дисбаланса нагрузки, главная карта имеет тенденцию стать обучением узкого места, Таким образом, скорость тренировки замедляется, чем режим DDP. Кроме того, DP поддерживает только многоквартирный Multi-Card, обычно одна машина может установить только до 8 карт. Когда мы хотим тренировать специальные большие задачи, 8 карт будут особенно жесткими, поэтому существует определенный предел.

# use DataParallel
if torch.cuda.device_count() > 1:
    print("Let's use", torch.cuda.device_count(), "GPUs!")
    model = torch.nn.DataParallel(model)
model.to(device)

3.2 DistributedDataParallel

В отличие от режима DP, режим DDP сам по себе предназначен для нескольких машин и нескольких карт, конечно, его также можно использовать в случае одной машины и нескольких карт. DDP использует архитектуру all-reduce, которая в основном решает проблему, заключающуюся в том, что стоимость связи в архитектуре PS линейно связана с количеством графических процессоров. Хотя режим DP можно использовать в случае одной машины с несколькими картами, использование DDP обычно быстрее, чем режим DP, поэтому режим DDP также официально рекомендуется для всех. Также очень удобно преобразовать существующий код для использования DDP, что можно легко сделать, выполнив следующие шаги.

# 1. init backend nccl
torch.distributed.init_process_group(backend='nccl')
# 2. config gpu
local_rank = torch.distributed.get_rank()
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)
# 3. use DistributedSampler
training_loader = DataLoader(training_set, batch_size=TRAIN_BATCH_SIZE, sampler=DistributedSampler(training_set))
# 4. move model to gpu
model.to(device)
# 5. use DistributedDataParallel
if torch.cuda.device_count() > 1:
    print("Let's use", torch.cuda.device_count(), "GPUs!")
    model = DistributedDataParallel(model, device_ids=[local_rank], output_device=local_rank)

3.3 Horovod

В дополнение к методам DP и DDP, изначально предоставляемым Pytorch, существует также множество отличных распределенных обучающих инструментов, предоставляемых третьими сторонами, из которых чаще используется Horovod. Хоровод — кроссплатформенная распределенная обучающая среда Uber с открытым исходным кодом (название хоровод происходит от русского народного танца, танцоры стоят в кругу, взявшись за руки, и танцуют в кругу, что аналогично режиму связи между GPU-устройствами, если платформа является китайским или китайским. Для разработки, я думаю, его можно назвать «Гочжуан» ^-^).Из названия видно, что Horovod использует архитектуру all-reduce для повышения эффективности связи распределенных устройств. В то же время Horovod поддерживает не только Pytorch, но и другие фреймворки глубокого обучения, такие как TensorFlow. Если вы хотите использовать Horovod во время обучения, на самом деле в код вносится меньше изменений, как показано ниже.

import horovod.torch as hvd
# 1. init horovod
hvd.init()
# 2. Pin GPU to be used to process local rank (one GPU per process)
torch.cuda.set_device(hvd.local_rank())
# 3. Partition dataset among workers using DistributedSampler
train_sampler = DistributedSampler(training_set, num_replicas=hvd.size(), rank=hvd.rank())
training_loader = DataLoader(training_set, batch_size=TRAIN_BATCH_SIZE, sampler=train_sampler)
# 4. Add Horovod Distributed Optimizer
optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())
# 5. Horovod: broadcast parameters from rank 0 to all other processes.
hvd.broadcast_parameters(model.state_dict(), root_rank=0)

Кроме того, ByteDance также открыла высокопроизводительную распределенную среду обучения глубокому обучению BytePS (адрес проекта на github:GitHub.com/byte dance/no…Сервер и другие меры улучшили производительность связи, и говорят, что эффект может быть лучше, чем Хоровод. Несколько дней назад Kuaishou и ETH Zurich также объявили об открытом исходном коде Bagua (сплетни), распределенной обучающей среде.Багуа разработала специальный алгоритм оптимизации для распределенных сценариев и реализовала совместную оптимизацию алгоритма и системного уровня с лучшим производительность Аналогичное увеличение на 60%. Заинтересованные студенты также могут обратить внимание. Адрес проекта на гитхабе:GitHub.com/BA повесить систему/ положить…

4. Экспериментальное сравнение

Здесь мы сравниваем нативные режимы DP и DDP Pytorch, а также выбираем для сравнения сторонний плагин Horovod. В эксперименте выбрана задача классификации текстов на основе предварительно обученной языковой модели bert-base. Конкретные экспериментальные параметры следующие: модель графического процессора: V100, скорость обучения: 2e-5, размер_пакета: 128, макс_лен: 128, эпохи: 1, размер_поезда: 48 Вт.图片4.pngПоскольку и DDP, и Horovod используют архитектуру all-reduce, производительность сравнима.Можно видеть, что собственный режим DDP Pytorch также проделал очень хорошую работу. Производительность DP будет хуже, чем в других режимах. Поэтому на практике для распределенного обучения рекомендуется использовать DDP или Horovod.

Суммировать

В этом документе обсуждается распределенная стратегия параллелизма моделей и параллелизма данных в глубоком обучении, а также представлены собственные режимы DP и DDP, основанные на платформе Pytorch, а также на сторонней платформе распределенного обучения Horovod. Из следующего экспериментального сравнения видно, что для нормальной работы рекомендуется использовать DDP или Horovod. Распределенное обучение является очень важной частью глубокого обучения.Помимо Horovod, другие крупные производители также открыли свои собственные распределенные обучающие фреймворки, такие как BytePS, DeepSpeed, Bagua и т. д. Открытый исходный код этих фреймворков также будет способствовать этому. Разработка , предоставляет лучшие инструменты для глубокого обучения.

об авторе

Hongyu OPPO Старший инженер по алгоритмам НЛП

В основном занимается НЛП, графом знаний и смежными областями.

Для получения более интересного контента отсканируйте код, чтобы подписаться на общедоступную учетную запись [OPPO Digital Intelligence Technology].qrcode_for_gh_7bc48466f080_258.jpg