RecallDeck
Направление

Подготовка к собеседованию — ML-инженер

Колода из 381+ карточек с вопросами для собеседования по направлению «ML-инженер» — по темам и уровню сложности, с возвратом ровно перед тем, как вы забудете. Посмотрите несколько карточек ниже, затем войдите, чтобы учить всё направление по расписанию в стиле Anki (SM-2).

381 карточка20 тем

Бесплатно · вход через GitHub · ваш прогресс остаётся с вами.

Что внутри

Все темы направления, сгруппированные так, как вы будете их учить.

Сервинг и ML-инфраструктура

12 карточек
Сервинг и инфраструктура

Распределённое обучение и GPU

11 карточек
Распределённое обучение

Инференс LLM и оптимизация

12 карточек
Инференс LLM

Инженерия ML-кода

9 карточек
Инженерия ML-кода

Live coding: реализуй с нуля

9 карточек
Реализуй с нуля

Основы ML и валидация

10 карточек
Основы ML

Классический ML и ансамбли

12 карточек
Классический ML

Метрики и дисбаланс классов

11 карточек
Метрики

Фичи, подготовка данных и утечки

10 карточек
Фичи и утечки

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

12 карточек
Глубокое обучение

NLP и LLM

12 карточек
NLP и LLM

ML-системный дизайн

8 карточек
ML system design

MLOps и модель в проде

10 карточек
MLOps и прод

Python

130 карточек
Ядро языкаМодель данных и внутренностиКонкурентность и asyncStdlib, типизация и тесты

Основы CS

43 карточки
Структуры данных и алгоритмы

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

35 карточек
Docker, CI/CD и Linux

Поведенческое интервью

35 карточек
Поведенческое интервью

Примеры вопросов

Несколько карточек из колоды — откройте ответ, затем войдите, чтобы учить весь набор по расписанию.

Онлайн- vs батч-инференс: когда какой выбирать?

Короткий ответ: Батч-инференс — предсказания считаются заранее по расписанию и складываются в хранилище; онлайн — модель отвечает на запрос в реальном времени. Выбор определяется двумя вопросами: известны ли входы заранее и как быстро предсказание устаревает.

Подробно:

Батч Онлайн
Когда входы известны заранее (ночные рекомендации всем юзерам) фичи появляются только в момент запроса (поисковая строка, корзина)
Латентность не критична; отдаём готовое из KV за миллисекунды жёсткий SLA на p99
Цена дёшево: оффлайн-джоба, спотовые GPU дорого: реплики 24/7 под пиковый трафик
Слабость предсказания устаревают между запусками сложность и хрупкость инфраструктуры

Стандартный гибрид: батчем предрассчитываем кандидатов и эмбеддинги, а онлайн гоняем только лёгкий реранкер на свежих фичах запроса.

⚠️ Частая ошибка: тащить всё в онлайн «для свежести». Если предсказание можно посчитать заранее — батч почти всегда дешевле, проще и надёжнее.

Data, tensor и pipeline parallelism: когда использовать каждый?

Короткий ответ: Data parallelism — когда модель влезает на один GPU: реплика на каждом устройстве, батч делится, градиенты сводятся all-reduce. Tensor parallelism режет отдельные matmul между GPU — нужны линки класса NVLink, внутри узла. Pipeline parallelism делит слои на стадии, микробатчи борются с bubble. Крупнейшие модели комбинируют все три — 3D-параллелизм.

Подробно:

Вид Что делим Когда применять Цена
Data (DDP) батч модель влезает на 1 GPU all-reduce градиентов каждый шаг
Tensor matmul внутри слоя слой/модель не влезает; быстрые линки внутри узла коммуникация в каждом слое, forward и backward
Pipeline слои → стадии модель не влезает, межузловые линки медленные pipeline bubble — простой стадий
3D всё сразу LLM-масштаб сложность оркестрации
  1. Порядок выбора — начинаем с data parallelism; не влезает слой → tensor внутри узла; не влезает модель целиком → pipeline между узлами.
  2. Bubble — стадии простаивают в начале и конце шага; лечится нарезкой батча на микробатчи.

⚠️ Частая ошибка: смешивать tensor и pipeline parallelism: TP режет матрицы внутри слоя (все GPU считают один слой вместе), PP режет модель по слоям на последовательные стадии.

Что такое KV-cache и какую проблему он решает?

Короткий ответ: KV-cache — это сохранённые по слоям матрицы K и V всех уже обработанных токенов. Без него авторегрессионная генерация на каждом шаге пересчитывала бы K и V для всего префикса — O(n²) работы на последовательность; с кэшем каждый шаг декодирования считает K, V и Q только для одного нового токена — O(n) суммарно.

Подробно:

  1. Почему это работает — K и V прошлых токенов не зависят от будущих: посчитав их один раз, можно переиспользовать на всех следующих шагах.
  2. Что кэшируется — только K и V, отдельно для каждого слоя. Q текущего токена считается заново: он нужен ровно один раз — чтобы этот токен «посмотрел» на прошлое — и никогда не переиспользуется.
  3. Цена — память: кэш растёт линейно с длиной контекста и размером батча и на длинных контекстах спорит по объёму с самими весами.
Без кэша:  шаг t → пересчитать K,V токенов 1..t   (O(t) на шаг, O(n²) всего)
С кэшем:   шаг t → K,V только токена t + чтение
           кэша токенов 1..t-1 из HBM             (O(1) вычислений, O(n) всего)

⚠️ Частая ошибка: сказать «кэшируются Q, K и V». Q не кэшируется — запрос токена используется ровно один раз, в момент его генерации.

Как тестировать ML-код, если «правильный ответ» стохастический?

Короткий ответ: Разделить детерминированное и стохастическое. Трансформы, лоссы и метрики покрываются обычными юнит-тестами на просчитываемых вручную кейсах; обучение проверяется смоук-тестами (оверфит крошечного батча, shape- и градиент-чеки) и поведенческими тестами с допуском.

Подробно:

Слой Что проверяет Пример
Юнит-тесты трансформы, лоссы, метрики на ручных кейсах loss(y, y) == 0
Shape/dtype/градиенты размерности, типы, градиент доходит до всех параметров после backward() ни один param.grad не None
Оверфит одного батча пайплайн способен выучить 10 примеров до ~100% не может → сломана «проводка», а не данные
Поведенческие инвариантность и направленность синоним не меняет класс; «ужасно» понижает sentiment
Golden-предикты эталонные предсказания с допуском, гоняются в CI ловят молчаливые регрессии после рефакторинга
  1. Тестируем код, а не модель — детерминированные куски (фичи, лоссы) обязаны иметь точные ассерты, стохастические — допуски и инварианты.
  2. Смоук в CI — короткий прогон на 2–3 шага: пайплайн собирается, лосс конечен и падает.

⚠️ Частая ошибка: «мы смотрим на test accuracy» — это оценка модели, а не тестирование кода. Баг в даталоадере может стоить пару пунктов метрики и никогда не всплыть.

Напиши численно стабильные softmax и cross-entropy. Почему нельзя считать softmax, а потом log?

Короткий ответ: Перед exp вычитаем максимум строки — уже exp(89) переполняет float32. Для лосса softmax и log не считаем по отдельности, а объединяем в log-sum-exp: CE = logsumexp(z) − z[y].

Подробно:

  1. Сдвиг на максимум — softmax инвариантен к сдвигу: exp(z − m)/Σexp(z − m) — та же величина, но без overflow.
  2. log-softmax одним куском — log(softmax(z)) = z − m − log Σ exp(z − m); нигде не берём log от почти-нуля.
  3. CE как индексирование — минус log-softmax в позиции правильного класса, среднее по батчу.
import numpy as np

def log_softmax(z):
    z = z - z.max(axis=1, keepdims=True)  # exp(89) переполняет fp32
    return z - np.log(np.exp(z).sum(axis=1, keepdims=True))

def cross_entropy(z, y):
    # CE = logsumexp(z) - z[y]; никакого softmax -> log по отдельности
    n = len(y)
    return -log_softmax(z)[np.arange(n), y].mean()

⚠️ Частая ошибка: посчитать softmax, потом взять log — при насыщении вероятность округляется до 0 и log даёт −inf. Именно поэтому F.cross_entropy в PyTorch принимает логиты, а не вероятности.

Что такое переобучение, как его обнаружить и как с ним бороться?

Короткий ответ: Переобучение — модель выучила шум трейна вместо закономерности: на трейне ошибка низкая, на новых данных — высокая. Обнаруживают по разрыву train/validation, лечат регуляризацией, упрощением модели, ранней остановкой и бóльшим объёмом данных.

Подробно:

  1. Обнаружение — сравнить ошибку на трейне и на валидации; learning curves: train-ошибка падает, validation-ошибка стоит или растёт → модель начала запоминать шум.
  2. Лечение — уменьшить ёмкость или добавить сигнала, а не «крутить» метрику.
Обнаружить Исправить
Разрыв метрик train ≈ 0, валидация заметно хуже регуляризация (L1/L2), проще модель
Learning curves кривые расходятся с ростом эпох early stopping
Кросс-валидация нестабильные метрики по фолдам больше данных, аугментация
Сложность модели глубокие деревья, миллионы весов ограничить глубину, срезать фичи

⚠️ Частая ошибка: сказать «кросс-валидация предотвращает переобучение». CV его лишь обнаруживает — честно оценивает качество. Предотвращают регуляризация, упрощение модели и данные.

Готовы закрепить навсегда?

Первая сессия — меньше минуты. Ваше будущее «я» на собеседовании скажет спасибо.

Вопросы об этом направлении

Как готовиться к собеседованию на «ML-инженер»?

Учите концепции, которые придётся объяснять, а не только те, что умеете кодить. Направление «ML-инженер» в RecallDeck даёт 381+ отобранных вопросов и возвращает каждый по расписанию в стиле Anki (SM-2) ровно перед тем, как вы забудете — чтобы на собеседовании ответы были под рукой.

Какие темы охватывает направление «ML-инженер»?

Направление «ML-инженер» разбито на ключевые области, которые реально проверяют на таких собеседованиях, — по темам и уровню сложности (Concept, Junior, Middle, Senior). Полный план и примеры вопросов можно посмотреть выше до входа.

Помогает ли интервальное повторение в подготовке к «ML-инженер»?

Да. Активно вспоминать ответ и честно себя оценивать — куда прочнее для памяти, чем перечитывать заметки. RecallDeck планирует каждую карту «ML-инженер» так, чтобы она вернулась перед моментом забывания: ежедневных повторений становится меньше, а знания держатся.

Направление «ML-инженер» бесплатное?

Да — направление «ML-инженер» и полный планировщик SM-2 бесплатны, с 20 новыми картами в день. Войдите через GitHub, и прогресс синхронизируется с аккаунтом. RecallDeck Pro ($5/мес или $29/год) поднимает дневной лимит и добавляет блиц-режим.

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

RecallDeckПодготовка к собеседованию на интервальных повторениях