Sobes.tech
Назад к вопросам
Middle — Senior
10

Что такое FSDP и как он отличается от DDP?

Компании, где спрашивали
SberDevices

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

FSDP — это способ обучать большие модели, распределяя не только вычисления, но и сами параметры модели по нескольким GPU. В отличие от DDP, где на каждой GPU хранится полная копия модели, FSDP экономит память за счёт шардирования весов, градиентов и состояний оптимизатора. Это особенно важно для fine-tuning и обучения LLM, когда модель не помещается в память одной карты.

Определение:

FSDP (Fully Sharded Data Parallel) — это стратегия распределённого обучения, при которой модель разбивается на части между несколькими устройствами. Во время прямого и обратного прохода нужные параметры временно собираются, а затем снова шардируются.

DDP (Distributed Data Parallel) работает иначе: на каждом процессе/GPU хранится полная копия модели, а синхронизация происходит в основном через градиенты после backward. Поэтому DDP проще и часто быстрее в сценариях, где модель уже помещается в память, но FSDP лучше масштабируется по памяти для крупных моделей.

Пример использования:

FSDP используют, когда нужно дообучить LLM на нескольких GPU, но полная копия модели, оптимизатора и градиентов не помещается ни на одну карту. Например, модель на 7B–13B параметров может не влезать в DDP-схему, а FSDP позволит обучать её за счёт разбиения весов между GPU.

import torch
from torch.distributed.fsdp import FullyShardedDataParallel as FSDP

model = MyLargeModel().cuda()
model = FSDP(model)

for batch in dataloader:
    loss = model(batch).loss
    loss.backward()
    optimizer.step()
    optimizer.zero_grad()

Пояснение кода:

  1. Создаётся обычная модель и переносится на GPU.
  2. Модель оборачивается в FSDP, после чего её параметры шардируются между устройствами.
  3. На прямом проходе FSDP подгружает нужные части параметров только на время вычисления.
  4. На обратном проходе градиенты также обрабатываются в распределённом виде.
  5. optimizer.step() обновляет параметры, не требуя полной копии модели на каждой GPU.

Ключевые моменты:

  • DDP хранит полную копию модели на каждом GPU, FSDP — нет.
  • Главное преимущество FSDP — экономия памяти для больших моделей.
  • FSDP шардирует параметры, градиенты и состояния оптимизатора.
  • DDP обычно проще в настройке и часто предпочтителен, если модель помещается в память.
  • FSDP особенно полезен для fine-tuning LLM и обучения моделей, близких к пределу памяти GPU.