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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 807
  • Облачные технологии6 651
  • QA вакансии2 171
  • Android1 317
  • Инженер данных867
  • Продакт-менеджер313

Разработка

  • iOS1 229
  • Backend вакансии1 199
  • AI вакансии548
  • Fullstack вакансии496
  • Frontend вакансии424
  • Mobile вакансии28

По стеку

  • Go5 239
  • Java3 132
  • Kotlin1 122
  • Node.js1 007
  • Rust852
  • .NET662
  • PHP319
  • C++268
  • C#207

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

  • Kubernetes3 912
  • Linux-инфраструктура2 845
  • DevOps вакансии2 680
  • Terraform / IaC2 177
  • Мониторинг и Observability1 072
  • CI/CD913
  • SRE307
  • Кибербезопасность34

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

  • Аналитик данных528
  • Data Scientist433
  • Бизнес-аналитик399
  • Системный аналитик67

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

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

По регионам

  • Вакансии в США25 774
  • Вакансии в Европе10 284
  • Работа в России3 616
  • Вакансии в Канаде2 260

По формату

  • Удалённые вакансии42 533
  • Релокация в США25 774
  • Гибридная работа5 661
  • Офисная работа4 440

По уровню

  • Senior вакансии22 599
  • Middle вакансии11 490
  • Junior вакансии3 852

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

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Как реализовать gradient accumulation в PyTorch и зачем это нужно?

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

Gradient accumulation накапливает градиенты за N итераций перед optimizer.step(), эмулируя большой batch size. Главное: делить loss на accumulation_steps и обнулять градиенты только после step(), а не после каждого мини-батча.

Базовая реализация

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset

model = nn.Linear(128, 10).cuda()
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-3)
criterion = nn.CrossEntropyLoss()

dataset = TensorDataset(
    torch.randn(1024, 128),
    torch.randint(0, 10, (1024,))
)
loader = DataLoader(dataset, batch_size=16, shuffle=True)

accumulation_steps = 4   # логический batch = 16 * 4 = 64

model.train()
optimizer.zero_grad()    # обнуляем один раз перед первым шагом

for step, (x, y) in enumerate(loader):
    x, y = x.cuda(), y.cuda()

    output = model(x)
    # Делим loss на число шагов накопления для правильного масштаба
    loss = criterion(output, y) / accumulation_steps
    loss.backward()

    if (step + 1) % accumulation_steps == 0:
        optimizer.step()
        optimizer.zero_grad()

# Обрабатываем оставшиеся градиенты в конце эпохи
remainder = len(loader) % accumulation_steps
if remainder != 0:
    optimizer.step()
    optimizer.zero_grad()

Gradient Accumulation в PyTorch: реализация и назначение

Gradient accumulation — техника, при которой градиенты не обнуляются и не применяются после каждого батча, а накапливаются в течение нескольких шагов. Шаг оптимизатора делается только раз в N итераций. Это позволяет эффективно обучать с большим логическим batch size, когда весь батч не помещается в GPU-память.

Зачем это нужно

  • Ограниченная GPU-память: современные большие модели (LLM, ViT) не помещаются в память при batch size 32+ — накопление позволяет эмулировать большие батчи.
  • Стабильность обучения: SGD и Adam стабильнее при больших батчах — оценка градиента более точна.
  • Multi-GPU эмуляция без DDP: на одной GPU можно воспроизвести поведение multi-GPU обучения по градиентам.

Реализация с Mixed Precision

from torch.cuda.amp import autocast, GradScaler

scaler = GradScaler()
optimizer.zero_grad()

for step, (x, y) in enumerate(loader):
    x, y = x.cuda(), y.cuda()

    with autocast(dtype=torch.float16):
        output = model(x)
        loss = criterion(output, y) / accumulation_steps

    scaler.scale(loss).backward()

    if (step + 1) % accumulation_steps == 0:
        # Unscale перед gradient clipping
        scaler.unscale_(optimizer)
        torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
        scaler.step(optimizer)
        scaler.update()
        optimizer.zero_grad()

Использование через Hugging Face Accelerate

Библиотека Accelerate автоматизирует gradient accumulation и устраняет типичные ошибки ручной реализации.

from accelerate import Accelerator

accelerator = Accelerator(gradient_accumulation_steps=4)
model, optimizer, loader = accelerator.prepare(model, optimizer, loader)

for x, y in loader:
    with accelerator.accumulate(model):
        output = model(x)
        loss = criterion(output, y)
        accelerator.backward(loss)
        optimizer.step()
        optimizer.zero_grad()

Проверка корректности

Убедитесь, что gradient accumulation даёт те же градиенты, что и полный батч:

# Метод 1: один большой батч
big_x = torch.randn(64, 128).cuda()
big_y = torch.randint(0, 10, (64,)).cuda()
optimizer.zero_grad()
loss_full = criterion(model(big_x), big_y)
loss_full.backward()
full_grad = model.weight.grad.clone()

# Метод 2: 4 малых батча с накоплением
optimizer.zero_grad()
for i in range(4):
    mini_x = big_x[i*16:(i+1)*16]
    mini_y = big_y[i*16:(i+1)*16]
    loss_mini = criterion(model(mini_x), mini_y) / 4
    loss_mini.backward()
accum_grad = model.weight.grad.clone()

print(torch.allclose(full_grad, accum_grad, atol=1e-5))  # True

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

  • Отсутствие деления loss на accumulation_steps: без него каждый мини-батч вносит полный вклад, и суммарный градиент будет в N раз больше, чем должен — эффективный LR возрастает в N раз.
  • zero_grad() после каждого мини-батча: аннулирует всё накопленное. Обнулять нужно только после optimizer.step().
  • BatchNorm и маленькие мини-батчи: BatchNorm вычисляет статистики по текущему мини-батчу, а не по логическому. При batch_size=4 статистики нестабильны — лучше использовать LayerNorm или GroupNorm с accumulation.
  • Gradient clipping до unscale при AMP: при использовании GradScaler нужно вызвать scaler.unscale_(optimizer) перед clip_grad_norm_, иначе clipping применяется к масштабированным градиентам.
  • Остаток батчей в конце эпохи: если длина датасета не делится на accumulation_steps, последние градиенты не применяются без явной обработки остатка.
  • Scheduler шаги: LR scheduler нужно шагать только при реальном шаге оптимизатора, а не каждую итерацию.
  • Несинхронизированный Dropout: при использовании gradient accumulation с DDP каждый мини-батч получает свою маску Dropout — поведение отличается от полного батча.

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

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

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

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

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

  • Может ли связать gradient accumulation с реальным контрактом входов и выходов.
  • Упоминает ли тесты, метрики, reproducibility и диагностику ошибок.
  • Видит ли различие между demo-кодом в ноутбуке и production-пайплайном.

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

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

Источники

  • https://docs.pytorch.org/docs/stable/index.html
←Предыдущий вопросЧто такое gradient clipping и почему это важно при обучении RNN/трансформеров?Следующий вопрос→Представьте, pipeline на PyTorch даёт хорошие результаты в dev, но плохо работает на новых данных. Как вы будете разбираться?

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

PyTorchdata-aievaluationmodel-training