Как разложить обучение на несколько : копиями модели по данным, шардами состояния или разрезанием самой модели.
Ключевые тезисы
- Data Parallel: на каждой карте полная копия модели и свой , усредняются AllReduce после каждого шага.
- FSDP и ZeRO шардируют веса, и состояния — модель перестаёт помещаться в одну карту, и это нормально.
- Tensor и pipeline parallelism режут саму сеть; их включают, только когда шардирования уже не хватает.
Какую задачу решает
Одна перестаёт справляться по двум разным причинам, и лечатся они по-разному. Первая: данных много, эпоха идёт неделю — модель помещается в память, не хватает скорости. Вторая: модель просто не влезает в память карты вместе с и состояниями .
Первая причина решается параллелизмом по данным: на каждой карте полная копия модели, каждая обрабатывает свой , после обратного прохода усредняются коллективной операцией AllReduce, и копии снова становятся идентичными. Вторая требует резать само состояние обучения: шардировать веса и состояния (ZeRO, FSDP), а в предельном случае — распределять по картам слои и сами весов.
Модель на 7 млрд параметров в : веса bf16 — 14 ГБ, bf16 — ещё 14 ГБ, состояния в fp32 (два плюс мастер-копия весов) — около 84 ГБ. Итого порядка 112 ГБ до единой , тогда как в карте 80 ГБ. Вывод прямой: обычный DDP здесь неприменим, нужен FSDP или ZeRO-3, шардирующий все три составляющие между картами.
Подробный разбор
| Стратегия | Что на каждой карте | Когда применяют |
|---|---|---|
| Data Parallel (DP/DDP) | полная копия модели, свой | модель помещается в память одной карты |
| ZeRO / FSDP | шард весов, и состояний | модель не помещается, но слой — да |
| Tensor parallel | часть каждой весов | очень широкие слои, быстрый интерконнект |
| Pipeline parallel | несколько слоёв целиком | очень глубокие модели, узкая сеть между узлами |
Data Parallel — база: каждый процесс считает прямой и обратный проход на своём мини-батче, после чего усредняются операцией AllReduce, и все копии модели снова совпадают. Эффективный равен батчу на карту, умноженному на число карт, поэтому обычно масштабируют вместе с ним.
# DDP: один процесс на карту — быстрее, чем старый DataParallel в один процесс
torchrun --nproc_per_node=8 train.py
# внутри train.py
dist.init_process_group("nccl")
model = DistributedDataParallel(model.to(rank), device_ids=[rank])
sampler = DistributedSampler(dataset) # каждому процессу свой кусок данныхСтарый torch.nn.DataParallel работает в одном процессе с несколькими потоками и упирается в GIL и в мастер-карту. В новом коде используют DDP, даже если карты стоят в одном узле.
- Веса — N параметров в рабочей точности.
- Градиенты — ещё столько же.
- Состояния оптимизатора — у два , то есть вдвое больше весов.
- Активации — зависят от и длины последовательности; на длинном контексте именно они и переполняют память.
Отсюда правило прикидки: обучение модели в с требует примерно 16 байт на параметр без учёта активаций. Для 7 млрд параметров это около 112 ГБ — то есть одной карты не хватит, и нужен FSDP или ZeRO.
Где применяется
- Сокращение времени экспериментаВосемь карт вместо одной превращают неделю обучения в день — цикл становится рабочим.
- Большие моделиЯзыковые и не помещаются в одну карту в принципе: без шардирования обучение невозможно.
- Большой Контрастное обучение и self-supervised методы требуют батчей в тысячи объектов.
- под задачуДаже 7B-модели на своих данных упирается в память одной карты.
Плюсы, минусы и альтернативы
Плюсы
- Ускорение близко к линейному, пока сеть не стала узким местом.
- Код меняется мало: DDP и FSDP оборачивают модель, обучение остаётся прежним.
- Шардирование снимает потолок размера модели, а не только ускоряет обучение.
Минусы
- Появляется сетевой обмен: на медленном интерконнекте ускорение упирается в полосу, а не в вычисления.
- Отладка усложняется: ошибки проявляются только на нескольких процессах и часто выглядят как зависание.
- Большой эффективный меняет режим обучения — нужны warmup и пересчёт .
- Один отвалившийся процесс останавливает весь запуск: нужны чекпойнты и устойчивость к сбоям.
Брать, если
- Обучение на одной карте занимает недопустимо много времени, а данные и код уже оптимизированы.
- Модель со всеми состояниями не помещается в память карты.
Не брать, если
- Узкое место — загрузчик данных или предобработка: добавление карт ничего не даст.
- Модель небольшая, а карт мало: накладные расходы на обмен съедят выигрыш.
Чем заменяют
Видеолекции
Тайм-кода именно на эту тему в записях нет. Но глава «Вычислительная инфраструктура» разобрана в курсах целиком — с той оговоркой, что место в записи придётся искать самому.
Связанные темы
Обучение на GPU
GPU Architecture85%
Архитектура GPU · Вычислительная инфраструктураТысячи простых ядер, сгруппированных в мультипроцессоры, и иерархия памяти, в которую упирается почти любое ускорение.
AI Accelerators85%
Ускорители: GPU, TPU, NPU · Вычислительная инфраструктураЧем специализированный чип отличается от универсальной видеокарты и когда эта разница окупается.
GPU in PyTorch85%
GPU в PyTorch · Вычислительная инфраструктураКак проверить доступность ускорителя, разложить тензоры по устройствам и понять, куда ушла видеопамять.
Collective Operations85%
Коллективные операции · Вычислительная инфраструктураAllReduce, Broadcast, AllGather — примитивы, которыми процессы обучения обмениваются тензорами.
Cluster Networking85%
Сеть кластера · Вычислительная инфраструктураТопология соединений и скорость обмена, которые определяют, доедет ли обучение до линейного ускорения.
Training Throughput85%
Ускорение обучения · Вычислительная инфраструктураЧто делать, когда число GPU фиксировано: снизить точность, накопить градиент, пересчитать активации, разгрузить загрузчик данных.
Mixed Precision85%
Смешанная точность · Оптимизация обученияОбучение в fp16 или bf16 при накоплении в fp32: двукратная экономия памяти и заметное ускорение.
Batch size85%
Размер батча · Оптимизация обученияЧисло объектов на одно обновление весов: влияет на скорость, память и качество обобщения.
Всё, что названо в описании, разобрано здесь же или в соседней теме — переходы под каждым определением.
Data Parallel
Полная копия модели на каждой карте, разные мини-батчи, усреднение после каждого шага.
Разбор ниже: Четыре стратегииAllReduce
Коллективная операция: сложить всех процессов и раздать результат каждому.
Отдельная тема: Collective Operations — Коллективные операцииDDP
Реализация в PyTorch: один процесс на карту, перекрытие обмена с обратным проходом.
Разбор ниже: Четыре стратегииFSDP / ZeRO
Шардирование весов, и состояний между картами вместо их дублирования.
Разбор ниже: Четыре стратегииЭффективный батч
на карту, умноженный на число карт: с ним обычно масштабируют и .
Разбор ниже: Четыре стратегииПамять обучения
Веса, , состояния и : около 16 байт на параметр без учёта активаций.
Разбор ниже: Куда уходит память при обученииПрофильная компетенция для роли: MLOps-инженер.
Усиливает профиль: Data Engineer, Исследователь.
Спрашивают на собеседовании: Arenadata — ML на платформе данных, YADRO — Инфраструктура обучения, Cloud.ru — Платформа обучения.
Разбор архитектуры, где эта тема — один из кирпичей: требования, развилки, цифры и режимы отказа.
Глава «Вычислительная инфраструктура» последний раз правилась . Нашли ошибку — напишите.