Подготовка к собеседованию — ML-инженер
Колода из 381+ карточек с вопросами для собеседования по направлению «ML-инженер» — по темам и уровню сложности, с возвратом ровно перед тем, как вы забудете. Посмотрите несколько карточек ниже, затем войдите, чтобы учить всё направление по расписанию в стиле Anki (SM-2).
Бесплатно · вход через GitHub · ваш прогресс остаётся с вами.
Что внутри
Все темы направления, сгруппированные так, как вы будете их учить.
Сервинг и ML-инфраструктура
12 карточекРаспределённое обучение и GPU
11 карточекИнференс LLM и оптимизация
12 карточекИнженерия ML-кода
9 карточекLive coding: реализуй с нуля
9 карточекОсновы ML и валидация
10 карточекКлассический ML и ансамбли
12 карточекМетрики и дисбаланс классов
11 карточекФичи, подготовка данных и утечки
10 карточекГлубокое обучение
12 карточекNLP и LLM
12 карточекML-системный дизайн
8 карточекMLOps и модель в проде
10 карточекPython
130 карточекОсновы CS
43 карточкиDevOps и инфраструктура
35 карточекПоведенческое интервью
35 карточекПримеры вопросов
Несколько карточек из колоды — откройте ответ, затем войдите, чтобы учить весь набор по расписанию.
Онлайн- vs батч-инференс: когда какой выбирать?
Онлайн- vs батч-инференс: когда какой выбирать?
Короткий ответ: Батч-инференс — предсказания считаются заранее по расписанию и складываются в хранилище; онлайн — модель отвечает на запрос в реальном времени. Выбор определяется двумя вопросами: известны ли входы заранее и как быстро предсказание устаревает.
Подробно:
| Батч | Онлайн | |
|---|---|---|
| Когда | входы известны заранее (ночные рекомендации всем юзерам) | фичи появляются только в момент запроса (поисковая строка, корзина) |
| Латентность | не критична; отдаём готовое из KV за миллисекунды | жёсткий SLA на p99 |
| Цена | дёшево: оффлайн-джоба, спотовые GPU | дорого: реплики 24/7 под пиковый трафик |
| Слабость | предсказания устаревают между запусками | сложность и хрупкость инфраструктуры |
Стандартный гибрид: батчем предрассчитываем кандидатов и эмбеддинги, а онлайн гоняем только лёгкий реранкер на свежих фичах запроса.
⚠️ Частая ошибка: тащить всё в онлайн «для свежести». Если предсказание можно посчитать заранее — батч почти всегда дешевле, проще и надёжнее.
Data, tensor и pipeline parallelism: когда использовать каждый?
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-масштаб | сложность оркестрации |
- Порядок выбора — начинаем с data parallelism; не влезает слой → tensor внутри узла; не влезает модель целиком → pipeline между узлами.
- Bubble — стадии простаивают в начале и конце шага; лечится нарезкой батча на микробатчи.
⚠️ Частая ошибка: смешивать tensor и pipeline parallelism: TP режет матрицы внутри слоя (все GPU считают один слой вместе), PP режет модель по слоям на последовательные стадии.
Что такое KV-cache и какую проблему он решает?
Что такое KV-cache и какую проблему он решает?
Короткий ответ: KV-cache — это сохранённые по слоям матрицы K и V всех уже обработанных токенов. Без него авторегрессионная генерация на каждом шаге пересчитывала бы K и V для всего префикса — O(n²) работы на последовательность; с кэшем каждый шаг декодирования считает K, V и Q только для одного нового токена — O(n) суммарно.
Подробно:
- Почему это работает — K и V прошлых токенов не зависят от будущих: посчитав их один раз, можно переиспользовать на всех следующих шагах.
- Что кэшируется — только K и V, отдельно для каждого слоя. Q текущего токена считается заново: он нужен ровно один раз — чтобы этот токен «посмотрел» на прошлое — и никогда не переиспользуется.
- Цена — память: кэш растёт линейно с длиной контекста и размером батча и на длинных контекстах спорит по объёму с самими весами.
Без кэша: шаг 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-код, если «правильный ответ» стохастический?
Как тестировать ML-код, если «правильный ответ» стохастический?
Короткий ответ: Разделить детерминированное и стохастическое. Трансформы, лоссы и метрики покрываются обычными юнит-тестами на просчитываемых вручную кейсах; обучение проверяется смоук-тестами (оверфит крошечного батча, shape- и градиент-чеки) и поведенческими тестами с допуском.
Подробно:
| Слой | Что проверяет | Пример |
|---|---|---|
| Юнит-тесты | трансформы, лоссы, метрики на ручных кейсах | loss(y, y) == 0 |
| Shape/dtype/градиенты | размерности, типы, градиент доходит до всех параметров | после backward() ни один param.grad не None |
| Оверфит одного батча | пайплайн способен выучить 10 примеров до ~100% | не может → сломана «проводка», а не данные |
| Поведенческие | инвариантность и направленность | синоним не меняет класс; «ужасно» понижает sentiment |
| Golden-предикты | эталонные предсказания с допуском, гоняются в CI | ловят молчаливые регрессии после рефакторинга |
- Тестируем код, а не модель — детерминированные куски (фичи, лоссы) обязаны иметь точные ассерты, стохастические — допуски и инварианты.
- Смоук в CI — короткий прогон на 2–3 шага: пайплайн собирается, лосс конечен и падает.
⚠️ Частая ошибка: «мы смотрим на test accuracy» — это оценка модели, а не тестирование кода. Баг в даталоадере может стоить пару пунктов метрики и никогда не всплыть.
Напиши численно стабильные softmax и cross-entropy. Почему нельзя считать softmax, а потом log?
Напиши численно стабильные softmax и cross-entropy. Почему нельзя считать softmax, а потом log?
Короткий ответ: Перед exp вычитаем максимум строки — уже exp(89) переполняет float32. Для лосса softmax и log не считаем по отдельности, а объединяем в log-sum-exp: CE = logsumexp(z) − z[y].
Подробно:
- Сдвиг на максимум — softmax инвариантен к сдвигу: exp(z − m)/Σexp(z − m) — та же величина, но без overflow.
- log-softmax одним куском — log(softmax(z)) = z − m − log Σ exp(z − m); нигде не берём log от почти-нуля.
- 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, лечат регуляризацией, упрощением модели, ранней остановкой и бóльшим объёмом данных.
Подробно:
- Обнаружение — сравнить ошибку на трейне и на валидации; learning curves: train-ошибка падает, validation-ошибка стоит или растёт → модель начала запоминать шум.
- Лечение — уменьшить ёмкость или добавить сигнала, а не «крутить» метрику.
| Обнаружить | Исправить | |
|---|---|---|
| Разрыв метрик | 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/год) поднимает дневной лимит и добавляет блиц-режим.