Выбор ответа Middle PyTorch на практике спрашивают часто обновлено
Утечка памяти через loss
Вопрос
В цикле обучения пишут total_loss += loss и через сотни шагов кончается память GPU. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: loss это тензор с графом; накапливая его, мы держим графы всех шагов. Нужно loss.item(). Сумма тензоров с requiresgrad продолжает граф, и каждый шаг привязывает к нему свои активации. .item() возвращает обычное число Python (и синхронизирует GPU, поэтому в очень горячих циклах копят detach() и вызывают item реже). - Значение…
Варианты ответа
- Потому что loss слишком большой по значению и хранится в float64 на GPU
- Нужно вызывать torch.cuda.empty_cache() каждый шаг, иначе аллокатор не возвращает память
- loss это тензор с графом; накапливая его, мы держим графы всех шагов. Нужно loss.item()правильный ответ
- Сложение тензоров на GPU создаёт новую копию в памяти, и старые копии не освобождаются
Разбор
Сумма тензоров с requires_grad продолжает граф, и каждый шаг привязывает к нему свои активации. .item() возвращает обычное число Python (и синхронизирует GPU, поэтому в очень горячих циклах копят detach() и вызывают item реже).
- Значение loss на память не влияет.
- empty_cache не освобождает память, на которую есть ссылки.
- Сложение разрешено, проблема в графе.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.