Зачем нужен `torch.no_grad()` на inference
В PyTorch inference код часто оборачивают в torch.no_grad(). Что это дает и когда это важно?
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
no_grad() отключает построение autograd graph, снижает память и overhead на inference, где gradients не нужны.Полный разбор
Во время training PyTorch сохраняет промежуточные значения, чтобы потом посчитать gradients. На inference gradients не нужны, поэтому построение autograd graph только тратит память и время.
torch.no_grad() говорит PyTorch не отслеживать операции для autograd. Это особенно важно для больших моделей, batch inference и production service, где memory footprint влияет на throughput.
Для новых версий PyTorch есть еще torch.inference_mode(), который может быть еще эффективнее, но имеет более строгие ограничения.
Типичные ошибки
- Думать, что `no_grad()` меняет веса модели.
- Забывать `model.eval()` для dropout/batchnorm.
- Использовать `no_grad()` во время training step.
Как отвечать на собеседовании
- Свяжи no_grad с memory и autograd graph.
- Упомяни `model.eval()` как отдельную вещь.