Ко всем темам
Тематический маршрут

Глубокое обучение

Что посмотреть по PyTorch, обучению нейросетей и современным архитектурам?

Прикладной цикл обучения, устройство Transformer, использование памяти, распределённое обучение и ускорение вывода модели.

3 реальных собеседования15 вопросов6 подтем

Маршрут из трёх собеседований

Проходите по порядку: база → глубина → применение.

Начать отсюдаоктябрь 2025 г.

Собирает основу темы и задаёт правильную структуру ответа.

Diagnocat: Техническое собеседование

Diagnocat

Компактный и прикладной вход в DL через code review настоящего PyTorch train loop.

Middle Аудио · 57 мин 3 ключевых этапа 3 шага практики

После прохождения

  • Разобрать обязанности Dataset, collate_fn и DataLoader
  • Увидеть типовые ошибки nn.Module и device placement
Цикл обученияPyTorch на практике
Углубитьсямарт 2026 г.

Добавляет сложные follow-up и проверяет глубину понимания.

Sber / GigaChat: LLM подробный разбор, inference и distributed training

Sber / GigaChat

Глубокий блок по Transformer, attention, памяти обучения, long context и DDP.

Senior Аудио · 67 мин 6 ключевых этапов 10 шагов практики

После прохождения

  • Объяснять вычисления и память Transformer
  • Разбирать distributed training и архитектурные оптимизации
АрхитектурыОптимизацияРаспределённое обучение
Закрепить на практикемай 2026 г.

Переводит знания в coding или законченный прикладной кейс.

Huawei: Техническое собеседование

Huawei

Современная практика inference: prefill/decode, KV cache, GQA/MQA, MoE и speculative decoding.

Senior Аудио · 76 мин 7 ключевых этапов 13 шагов практики

После прохождения

  • Оценивать память и latency LLM inference
  • Решить прикладную задачу на размер KV cache
АрхитектурыВывод моделиPyTorch на практике

Что покрывает каждое интервью

Матрица построена по конкретным вопросам и этапам, а не по совпадению слов в заголовке.

ПодтемаНачать отсюдаУглубитьсяЗакрепить на практике
Цикл обученияDataset, DataLoader, прямой и обратный проходы.Глубоко
АрхитектурыTransformer, механизм внимания и обучение представлений.ГлубокоРабочее понимание
ОптимизацияФункции потерь, устойчивость обучения и работа с памятью.Глубоко
Распределённое обучениеDDP, all-reduce и совмещение вычислений с обменом данными.Глубоко
Вывод моделиKV-кеш, этапы prefill/decode, MoE и ускорение.Глубоко
PyTorch на практикеРазбор кода модулей, данных и размещения на устройстве.ГлубокоРабочее понимание

Отдельная практика по теме

Раскрывайте вопросы и сверяйте ответы прямо здесь. Задачи открываются отдельно в редакторе.

Ключевые вопросы маршрута

Короткий ответ

Check architecture, batching, labels, optimizer step/zero_grad, train/eval loops, loss inputs, device transfer, validation, batch size, epochs and metrics.

A code-review answer should separate correctness from style. Correctness issues include whether Dataset returns objects that the default collate function can batch, whether the model receives tensors rather than custom records, whether labels are passed to the loss, and whether the optimizer is created, zeroed, stepped and tied to model.parameters().

For multiclass classification with CrossEntropyLoss, the model should normally return raw logits, not softmax probabilities, because the loss applies log-softmax internally. Labels should be class indices with the right dtype and range. The training loop should run for multiple epochs, set model.train(), move the batch to the target device in the loop, and have a separate validation loop with model.eval() and no_grad().

Design issues include a weak linear-only image architecture, missing batch_size, no metrics/logging, no validation split, no seed/reproducibility strategy and unclear input-shape assumptions.

Полная карточка: теория, ошибки и прогресс

Формулировка

In PyTorch, what should Dataset do, what should collate_fn do, how do num_workers affect this, and where should .to(device) usually happen?

Короткий ответ

Dataset maps indices to CPU examples; collate_fn batches fetched examples; num_workers parallelize fetching/collation. Device transfer usually belongs in the training loop, after batching.

A Dataset should expose __len__ and __getitem__, and __getitem__ should return one example. It can read files and apply CPU transforms, but it should not usually know about training state or GPU device placement.

collate_fn receives a list of already-fetched examples and turns them into a batch. It is useful when examples are custom classes, variable-length sequences or nested structures that the default collate cannot stack. It should not fetch indices itself; that would mix responsibilities.

num_workers creates worker processes for data loading. If __getitem__ moves tensors to GPU, multiple workers can compete for GPU memory, prefetch GPU batches and make device ownership messy. The common pattern is CPU Dataset and collate, then in the train loop do batch = batch.to(device), optionally with pinned memory and non_blocking transfers.

Полная карточка: теория, ошибки и прогресс

Формулировка

Why does a custom nn.Module need super().__init__()? Separately, why is tags=[] as a default argument in Python dangerous?

Короткий ответ

nn.Module.__init__ initializes internal registries for parameters, buffers and submodules. A mutable default list is shared across calls, so mutations leak between instances.

A custom PyTorch module should call super().__init__() before assigning submodules. nn.Module.__init__ creates internal dictionaries and hooks used to register parameters, buffers and child modules. Without it, methods may exist through inheritance, but assigning Linear layers and later calling parameters(), state_dict(), train(), eval() or to(device) can break or behave incorrectly.

The Python default argument issue is separate. Default values are evaluated once when the function is defined, not each time it is called. If tags=[] is used and one call mutates that list, later calls without tags see the same mutated object. The usual pattern is tags: list[str] | None = None, then inside the function create a new empty list when tags is None.

The common theme is object lifecycle: initialization matters for framework objects, and defaults must not hide shared mutable state.

Полная карточка: теория, ошибки и прогресс

Формулировка

Объясните разницу между BERT-like encoder моделями и GPT-like decoder моделями, и почему они подходят для разных задач.

Короткий ответ

BERT - bidirectional encoder для представлений и понимания текста; GPT - causal decoder для autoregressive generation.

BERT использует encoder-style self-attention, где токен может смотреть на контекст слева и справа. Это удобно для классификации, retrieval embeddings, NER и задач понимания текста. Обучение обычно связано с masked language modeling или похожими self-supervised целями.

GPT использует causal mask: каждый токен видит только предыдущие. Такая модель учится предсказывать следующий токен и естественно подходит для генерации текста, диалога, completion и agentic reasoning.

На практике encoder модели часто дают компактные embeddings и быстрый scoring, а decoder модели лучше как генераторы и reasoning layer, но дороже на inference.

Полная карточка: теория, ошибки и прогресс

Формулировка

Какие бывают positional embeddings в Transformer и как работает RoPE?

Короткий ответ

RoPE кодирует позицию поворотом пар координат в Q/K; dot product после поворота зависит от относительного расстояния между токенами.

Позиционная информация нужна, потому что self-attention сам по себе permutation-invariant. Классические варианты: sinusoidal embeddings, learned absolute embeddings, relative position bias.

RoPE применяет rotation к query и key векторам по парам координат с углом, зависящим от позиции. Когда считаем QK dot product, фазовая разница несет информацию об относительном расстоянии. Это удобно для decoder LLM и long-context scaling, но требует аккуратной extrapolation настройки.

Полная карточка: теория, ошибки и прогресс

Формулировка

Объясните scaled dot-product attention, его сложность, и зачем нужны GQA/MQA и Sliding Window Attention.

Короткий ответ

Attention считает softmax(QK^T / sqrt(d_k))V и стоит примерно O(n^2 d). GQA/MQA уменьшают KV heads и KV cache, SWA ограничивает окно attention до W токенов.

Scaled dot-product attention строит Q, K, V, считает scores QK^T / sqrt(d_k), применяет softmax и взвешивает V. Квадратичная часть по длине последовательности возникает из attention matrix n x n.

GQA/MQA оптимизируют inference memory: query heads остаются многочисленными, но key/value heads шарятся между группами, поэтому KV cache уменьшается примерно пропорционально числу KV heads. Sliding Window Attention ограничивает каждому токену видимость последними W токенами, меняя cost с O(n^2) на примерно O(nW).

Полная карточка: теория, ошибки и прогресс

Формулировка

При обучении на сотнях тысяч токенов обычный/Flash Attention все равно не помещается в GPU. Что раздувает память и какие классы решений есть?

Короткий ответ

Главная проблема - активации и attention-related tensors, растущие с sequence length; помогают sparse/local attention, sequence parallelism и activation checkpointing.

Flash Attention снижает materialization n x n attention matrix и улучшает IO, но не отменяет фундаментальную стоимость очень длинной последовательности: Q/K/V, activations для backprop, MLP activations и коммуникация становятся огромными.

Решения зависят от цели: local/sparse/sliding attention меняет математическую структуру; sequence/context parallelism распределяет sequence dimension между GPU; activation checkpointing пересчитывает часть forward вместо хранения; tensor/pipeline/FSDP/ZeRO распределяют параметры, gradients и optimizer state. Важно не просто порезать sequence на независимые куски, иначе потеряется attention между сегментами.

Полная карточка: теория, ошибки и прогресс

Формулировка

На какие сущности уходит GPU memory при обучении LLM, и почему KV cache обычно используют на inference, а не на training?

Короткий ответ

Память уходит на weights, gradients, optimizer states и activations. KV cache полезен на autoregressive inference с фиксированными весами, а на training нужен backprop через parallel forward.

При обучении память занимают параметры модели, gradients, optimizer state вроде Adam moments, activations для backward, temporary buffers и batch/sequence-dependent tensors. Adam в mixed precision может добавлять кратный overhead к размеру параметров.

KV cache ускоряет decode на inference: прошлые K/V можно не пересчитывать, потому что веса фиксированы и токены генерируются по одному. На training вся последовательность обрабатывается параллельно с teacher forcing, нужно хранить или восстанавливать вычислительный граф для backprop, поэтому обычный inference-style KV cache не является базовой оптимизацией обучения.

Полная карточка: теория, ошибки и прогресс

Формулировка

Как работает Distributed Data Parallel training и почему overlap gradient all-reduce с backprop помогает ускорить обучение?

Короткий ответ

В DDP каждая GPU считает gradients на своем mini-batch, затем gradients синхронизируются all-reduce; overlap запускает коммуникацию для ранних слоев, пока backprop считает остальные.

В Distributed Data Parallel каждая replica модели получает свою часть batch, делает forward/backward и получает локальные gradients. Чтобы модели оставались одинаковыми, gradients усредняются между workers через all-reduce, после чего optimizer step одинаковый на всех replica.

Если ждать конца всего backward и только потом синхронизировать gradients, коммуникация добавляет отдельную задержку. DDP группирует gradients в buckets и может начинать all-reduce для bucket сразу, когда gradients в нем готовы. Пока сеть передает gradients ранних buckets, GPU продолжает считать backward для следующих слоев.

Эффект зависит от размера модели, bandwidth/latency interconnect, bucket size и баланса compute/communication.

Полная карточка: теория, ошибки и прогресс

Формулировка

Для чего нужны positional embeddings и какие виды positional embeddings используются в LLM?

Короткий ответ

Self-attention без позиционного сигнала permutation-equivariant: при перестановке токенов переставятся и выходы. Поэтому модели нужен явный сигнал о порядке: learned/sinusoidal positions, relative bias, RoPE или ALiBi.

Без позиционной информации Transformer сравнивает content-векторы, но не получает отдельного признака "первый", "следующий" или "далеко справа". Если одновременно переставить входные токены, attention переставит выходы тем же образом, поэтому одного content-attention недостаточно для языка.

Основные варианты: learned absolute positional embeddings, синусоидальные absolute embeddings, relative position bias, RoPE и ALiBi. В современных LLM часто встречается RoPE: позиция кодируется вращением query/key векторов, что удобно для relative distances и extrapolation к более длинному context при аккуратной настройке.

Важно отделять positional signal от causal mask. Causal mask задает видимость слева направо, но сам по себе не сообщает модели точную дистанцию и абсолютную/относительную позицию токенов.

Полная карточка: теория, ошибки и прогресс

На страницах собеседований есть ещё 5 связанных вопросов.

Задачи из этих интервью

Повторить теорию перед практикой