Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 973новые вакансии за сутки·85 834вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании7 081
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python15 655
  • Облачные технологии11 901
  • QA вакансии3 405
  • Backend вакансии1 917
  • Инженер данных1 435
  • Продакт-менеджер891

Разработка

  • Android1 772
  • iOS1 646
  • AI вакансии901
  • Fullstack вакансии801
  • Frontend вакансии678
  • Mobile вакансии33

По стеку

  • Go8 449
  • Java5 599
  • Node.js1 779
  • Kotlin1 475
  • Rust1 398
  • .NET1 370
  • PHP574
  • C#436
  • C++424

DevOps и инфраструктура

  • Kubernetes6 670
  • DevOps вакансии5 099
  • Linux-инфраструктура4 926
  • Terraform / IaC3 701
  • CI/CD1 889
  • Мониторинг и Observability1 699
  • SRE516
  • Кибербезопасность262

Аналитика и данные

  • Data Scientist797
  • Аналитик данных764
  • Бизнес-аналитик738
  • Системный аналитик96

Другие направления

  • Проджект-менеджер360
  • UI/UX дизайн110
  • Ручное тестирование14

По регионам

  • Вакансии в США41 869
  • Вакансии в Европе17 422
  • Вакансии в Канаде4 056
  • Работа в России3 874

По формату

  • Удалённые вакансии67 491
  • Релокация в США42 199
  • Гибридная работа9 848
  • Офисная работа6 812

По уровню

  • Senior вакансии38 497
  • Middle вакансии18 722
  • Junior вакансии6 245

Сейчас нанимают

Все компании
  • Wise193 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Adyen29 вакансий
  • Infobip28 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме PyTorchВсе вопросы
PyTorchSeniorПроектирование систем

Чем DataParallel отличается от DistributedDataParallel (DDP)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

DataParallel работает в одном процессе и узкое место — rank 0 (gather/scatter); DistributedDataParallel запускает отдельный процесс на GPU и синхронизирует градиенты через NCCL AllReduce, что даёт линейный скейлинг на сотни GPU.

DataParallel — как работает

DP живёт в одном процессе: главный GPU (rank 0) получает весь батч, делит его на sub-батчи, рассылает на остальные GPU через scatter, собирает градиенты обратно через gather и обновляет веса. Это удобно, но создаёт узкое место на rank 0.

import torch
import torch.nn as nn

model = nn.Linear(1024, 512)
# Оборачиваем — только 1 строка изменений
model = nn.DataParallel(model, device_ids=[0, 1, 2, 3])
model = model.cuda()

x = torch.randn(128, 1024).cuda()  # DataParallel сам нарежет по 32 на GPU
out = model(x)  # out собирается на cuda:0
out.mean().backward()

DataParallel vs DistributedDataParallel

DataParallel (DP) и DistributedDataParallel (DDP) — два способа распределить обучение по нескольким GPU. Они существенно различаются архитектурой, производительностью и ограничениями.

DistributedDataParallel — как работает

DDP запускает отдельный процесс на каждый GPU. Каждый процесс держит полную копию модели и обрабатывает свой sub-батч независимо. После backward синхронизирует градиенты через AllReduce (NCCL backend). Нет главного процесса-узкого места.

import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
from torch.utils.data import DistributedSampler
import os

def train(rank: int, world_size: int):
    # Инициализация группы процессов
    dist.init_process_group(
        backend='nccl',          # NCCL для GPU-GPU, 'gloo' для CPU
        init_method='env://',    # MASTER_ADDR, MASTER_PORT из env
        world_size=world_size,
        rank=rank,
    )
    torch.cuda.set_device(rank)

    model = nn.Linear(1024, 512).cuda(rank)
    # find_unused_parameters=True только если часть параметров не участвует в forward
    ddp_model = DDP(model, device_ids=[rank], find_unused_parameters=False)

    # DistributedSampler гарантирует непересекающиеся sub-батчи
    sampler = DistributedSampler(dataset, num_replicas=world_size, rank=rank, shuffle=True)
    loader = DataLoader(dataset, batch_size=32, sampler=sampler, num_workers=4)

    optimizer = torch.optim.AdamW(ddp_model.parameters(), lr=1e-3)

    for epoch in range(10):
        sampler.set_epoch(epoch)  # ОБЯЗАТЕЛЬНО для корректного перемешивания
        for x, y in loader:
            x, y = x.cuda(rank), y.cuda(rank)
            loss = criterion(ddp_model(x), y)
            optimizer.zero_grad()
            loss.backward()       # AllReduce градиентов происходит здесь
            optimizer.step()

    dist.destroy_process_group()

# Запуск: torchrun --nproc_per_node=4 train.py
# или: torch.multiprocessing.spawn(train, args=(4,), nprocs=4)

Сравнение ключевых характеристик

  • Процессы: DP — 1 процесс, DDP — N процессов (по одному на GPU).
  • GIL: DP страдает от GIL Python при сборке градиентов; DDP обходит GIL, каждый процесс независим.
  • Масштабирование: DP эффективен до ~2-4 GPU на одной машине; DDP масштабируется на сотни GPU и несколько машин.
  • Memory overhead: оба держат полную копию модели на каждом GPU; для очень больших моделей нужен FSDP (Fully Sharded DDP).
  • Mixed precision: DDP нативно работает с torch.cuda.amp.GradScaler; DP тоже, но синхронизация scaler сложнее.
  • Скорость: DDP обычно на 20-40% быстрее DP при 4 GPU из-за отсутствия gather/scatter через rank 0.

Запуск DDP через torchrun

# 4 GPU на одной машине
torchrun --standalone --nproc_per_node=4 train.py

# Мульти-нодовый запуск (2 машины по 4 GPU)
# На node 0:
torchrun --nnodes=2 --nproc_per_node=4 --node_rank=0 \
    --master_addr=192.168.1.1 --master_port=29500 train.py
# На node 1:
torchrun --nnodes=2 --nproc_per_node=4 --node_rank=1 \
    --master_addr=192.168.1.1 --master_port=29500 train.py

Подводные камни

  • Забыть sampler.set_epoch(epoch): без этого DistributedSampler использует одинаковый порядок во всех эпохах, нарушая перемешивание.
  • Сохранение checkpoint в каждом rank: записывать state_dict нужно только на rank 0 (if dist.get_rank() == 0), иначе все процессы одновременно пишут в файл.
  • find_unused_parameters=True без нужды: этот флаг добавляет overhead на каждую итерацию; включать только если модель имеет условные ветви, где часть параметров не используется.
  • DP с batch_size не кратным числу GPU: если batch_size=65 и 4 GPU, sub-батчи будут [17, 17, 17, 14] — BatchNorm получит разные размеры и потенциально нестабильную статистику.
  • Доступ к параметрам DDP-модели: параметры находятся в ddp_model.module, не в ddp_model; ddp_model.weight выбросит AttributeError.
  • NCCL deadlock при исключении: если один процесс падает с исключением, остальные ждут AllReduce бесконечно; оборачивайте train loop в try/finally с dist.destroy_process_group().
  • Gradient accumulation с DDP: при накоплении градиентов нужно отключать синхронизацию на промежуточных шагах: with ddp_model.no_sync(): loss.backward(), и только на финальном шаге — обычный backward.

Типичные ошибки

  • Объяснять dataparallel vs ddp только синтаксисом без shape, dtype, состояния или режима выполнения.
  • Игнорировать leakage, воспроизводимость, пустые входы и скрытые копии данных.
  • Не проверять production-симптомы: latency, память, ретраи, дрейф качества и несовпадение версий.

Что проверяет интервьюер

  • Может ли связать dataparallel vs ddp с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.
  • Предлагает ли observability, rollback, ограничения стоимости и стратегию incident replay.

Как вы знаете этот вопрос?

Проверить себя по теме PyTorch →

Источники

  • https://docs.pytorch.org/docs/stable/notes/ddp.html

Связанные темы

PyTorchdata-aiobservabilityproduction-ml

Частые вопросы на собеседовании

  • Как сохранять и загружать веса модели в PyTorch (state_dict vs полная модель)?
  • Объясните разницу между режимами model.train() и model.eval().
  • Зачем нужен optimizer.zero_grad() и почему его необходимо вызывать перед каждым обратным проходом?
  • В каких data/AI-задачах PyTorch даёт реальный выигрыш, а где лучше выбрать другой инструмент или более простой pipeline?