Какие преимущества и удобства у PyTorch
Что проверяют
Работали ли вы с фреймворком руками или знаете его по обзорам. Ответ «он удобный и питоничный» не говорит ничего, ждут конкретных механизмов, которые экономят время. Следом обычно спрашивают, чем PyTorch отличается от TensorFlow и что вы делали, когда обучение упиралось в скорость или память.
Как отвечать
Идите по слоям, от написания модели до продакшена:
- define-by-run: граф строится по ходу выполнения, поэтому модель это обычный питоновский код. Внутри
forwardработаютifи циклы, а отлаживать можноprintиpdbпрямо между слоями; - автоград:
requires_grad,loss.backward(),optimizer.step(),zero_grad(set_to_none=True). Свою функцию с ручным градиентом добавляют черезtorch.autograd.Function; torch.compile(доступен с версии 2.0): TorchDynamo снимает граф с байт-кода, Inductor компилирует его и склеивает операции, ускорение одной строкой без переписывания модели;- экосистема:
torchvision,torchaudio,timm, Hugging Face Transformers, Lightning. Веса и репозитории статей почти всегда выходят под PyTorch первыми, это экономит недели; - масштаб:
DistributedDataParallel, FSDP для шардирования параметров,torch.autocastсbfloat16, чекпоинтинг активаций черезtorch.utils.checkpoint; - данные и вывод:
Dataset/DataLoaderсnum_workersиpin_memory, а на выходеtorch.export, ONNX, ExecuTorch для мобильных, Triton или TorchServe на сервере.
Сильный ответ содержит и обратную сторону: динамика мешает статической оптимизации, поэтому за скорость отвечает отдельный компилятор со своими graph breaks, а часть удобства держится на экосистеме, а не на самом ядре.
Где спотыкаются
Отвечают общими словами про удобство и не могут назвать ни одного API. Интервьюер после этого переходит к вопросам попроще, и уровень уже зафиксирован.
Считают torch.compile бесплатным. Первый запуск тратит время на компиляцию, а смена формы входа вызывает перекомпиляцию, пока не поставлен dynamic=True.
Путают model.eval() и torch.no_grad(). Первый переключает режим слоёв вроде dropout и BatchNorm, второй отключает построение графа. На инференсе нужны оба, а лучше inference_mode().