Transformers documentation
Методы параллелизма
Методы параллелизма
Множественные GPU-конфигурации эффективны для ускорения обучения и размещения в памяти больших моделей, которые иначе не поместились бы на одном GPU. Это достигается за счёт параллелизации нагрузки между GPU. Существует несколько типов параллелизма, таких как параллелизм данных, тензорный параллелизм, конвейерный параллелизм и параллелизм модели. Каждый тип параллелизма распределяет нагрузку по-разному, будь то данные или модель.
В этом руководстве рассматриваются различные методы параллелизма, их комбинация и выбор подходящей стратегии для вашей конфигурации. Более подробную информацию о распределённом обучении см. в документации Accelerate.
Для комплексного руководства по масштабированию больших языковых моделей обратитесь к Ultrascale Playbook, где представлены подробные стратегии и лучшие практики для обучения в масштабе.
Стратегия масштабируемости
Используйте Model Memory Calculator, чтобы рассчитать, сколько памяти требуется модели. Затем обратитесь к таблице ниже, чтобы выбрать стратегию в соответствии с вашей конфигурацией.
| настройка | сценарий | стратегия |
|---|---|---|
| один узел/несколько GPU | влезает на один GPU | DistributedDataParallel или ZeRO |
| не помещается на одном GPU | PipelineParallel, ZeRO или TensorParallel | |
| самый крупный слой модели не помещается | TensorParallel или ZeRO | |
| multi-node/multi-GPU | высокоскоростная межпроцессорная связь (NVLink или NVSwitch) | ZeRO или 3D-параллелизм (PipelineParallel, TensorParallel, DataParallel) |
| медленная межузловая связь | ZeRO или 3D-параллелизм (PipelineParallel, TensorParallel, DataParallel) |
Параллелизм данных
Параллелизм данных равномерно распределяет данные между несколькими GPU. На каждом GPU хранится копия модели, и каждый из них параллельно обрабатывает свою часть данных. В конце результаты с каждого GPU синхронизируются и объединяются.
Параллелизм данных значительно сокращает время обучения за счёт параллельной обработки данных и масштабируется в зависимости от количества доступных GPU. Однако синхронизация результатов с каждого GPU может добавлять накладные расходы.
Существует два типа параллелизма данных: DataParallel (DP) и DistributedDataParallel (DDP).
DataParallel
DataParallel поддерживает распределённое обучение на одном компьютере с несколькими GPU.
- По умолчанию GPU
GPU 0считывает пакет данных и отправляет мини-пакет на другие GPU. - Актуальная модель реплицируется с
GPU 0на остальные GPU. - На каждом GPU выполняется прямой проход
forward, а их выходные данные отправляются наGPU 0для вычисления функции потерь. - Потери распределяются с
GPU 0на остальные GPU дляbackward-прохода. - Градиенты с каждого GPU отправляются обратно на
GPU 0и усредняются.
DistributedDataParallel
DistributedDataParallel поддерживает распределённое обучение на нескольких машинах с несколькими GPU.
- Основной процесс копирует модель с GPU по умолчанию,
GPU 0, на каждый GPU. - Каждая GPU напрямую обрабатывает мини-батч данных.
- Локальные градиенты усредняются по всем GPU во время
backward-прохода.
DDP рекомендуется, поскольку он снижает накладные расходы на коммуникацию между GPU, эффективно использует каждый GPU и масштабируется на несколько машин.
Параллелизм данных ZeRO
Zero Redundancy Optimizer — это более эффективный с точки зрения памяти тип параллелизма данных. Он значительно повышает эффективность использования памяти, распределяя параметры, градиенты и состояния оптимизатора между процессами параллелизма данных, что снижает потребление памяти. Существует три этапа ZeRO:
- На этапе 1 состояния оптимизатора распределяются по частям
- На этапе 2 разбиваются состояния оптимизатора и градиентов
- Stage 3 разделяет оптимизатор, градиенты и параметры

Параллелизм моделей
Модельный параллелизм распределяет модель по нескольким GPU. Существует несколько способов разбить модель, но типичный метод распределяет слои модели по GPU. На этапе forward первый GPU обрабатывает пакет данных и передаёт его следующей группе слоёв на следующем GPU. На этапе backward данные передаются в обратном направлении от последнего слоя к первому.
Модельный параллелизм — полезная стратегия для обучения моделей, которые слишком велики, чтобы поместиться в память одного GPU. Однако загрузка GPU распределяется неравномерно, так как в каждый момент времени активен только один GPU. Передача результатов между GPU также добавляет накладные расходы на коммуникацию, что может стать узким местом.
Пайплайнная параллельность
Пайплайн-параллелизм концептуально очень похож на модельный параллелизм, но он более эффективен, поскольку сокращает время простоя GPU. Вместо того чтобы ждать, пока каждый GPU завершит обработку батча данных, пайплайн-параллелизм создает микробатчи данных. Как только обработка одного микробатча завершается, он передается на следующий GPU. Таким образом, каждый GPU может параллельно обрабатывать часть данных, не дожидаясь, пока другой GPU полностью завершит обработку мини-батча данных.
Пайплайн-параллелизм обладает теми же преимуществами, что и модельное параллелизм, но он оптимизирует использование GPU и сокращает время простоя. Однако пайплайн-параллелизм может быть более сложным, поскольку модели может потребоваться переписать как последовательность модулей nn.Sequential, и, кроме того, полностью исключить время простоя невозможно, так как последний проход forward также должен ждать завершения прохода backward.
Параллелизм тензоров
Параллелизм тензоров распределяет вычисления с большими тензорами между несколькими GPU. Тензоры разрезаются по горизонтали или по вертикали, и каждый срез обрабатывается отдельным GPU. Каждый GPU выполняет свои вычисления на своём срезе тензора, а результаты синхронизируются в конце для восстановления итогового результата.
Тензорный параллелизм эффективен для обучения больших моделей, которые не помещаются в память одного GPU. Он также быстрее и эффективнее, поскольку каждый GPU может обрабатывать свой тензорный срез параллельно, и его можно комбинировать с другими методами параллелизма. Однако, как и другие методы параллелизма, тензорный параллелизм добавляет накладные расходы на коммуникацию между GPU.
См. руководство Tensor parallelism, чтобы узнать, как использовать его для инференса.
Гибридная параллельность
Методы параллелизма можно комбинировать, чтобы добиться еще большей экономии памяти и более эффективно обучать модели с миллиардами параметров.
Параллелизм данных и конвейерное параллелизм
Параллелизм данных и конвейерный параллелизм распределяют данные по GPU и делят каждый мини-батч данных на микробатчи для реализации конвейерного параллелизма.
Каждый ранг data parallel рассматривает процесс так, как будто в системе есть только один GPU вместо двух, однако GPU 0 и 1 могут передавать микропакеты данных на GPU 2 и 3, сокращая время простоя.
Этот подход оптимизирует параллельную обработку данных за счёт снижения простоя GPU.

Параллелизм данных ZeRO, конвейерный параллелизм и параллелизм модели (3D-параллелизм)
Параллелизм данных, конвейерное и модельное параллелирование объединяются в 3D-параллелирование для оптимизации эффективности использования памяти и вычислительных ресурсов.
Эффективность использования памяти достигается за счёт распределения модели по нескольким GPU и разделения её на этапы для создания конвейера. Это позволяет GPU работать параллельно над микропакетами данных, снижая потребление памяти моделью, оптимизатором и активациями.
Высокая вычислительная эффективность обеспечивается за счёт ZeRO data parallelism, при котором на каждой GPU хранится только часть модели, оптимизатора и активаций. Это позволяет увеличить пропускную способность каналов связи между узлами data parallel, поскольку обмен данными может происходить независимо или параллельно с другими этапами pipeline.
Этот подход масштабируется на чрезвычайно большие модели с триллионами параметров.
