Выбор ответа Middle PyTorch на практике спрашивают часто обновлено

Утечка памяти через loss

Вопрос

В цикле обучения пишут total_loss += loss и через сотни шагов кончается память GPU. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: loss это тензор с графом; накапливая его, мы держим графы всех шагов. Нужно loss.item(). Сумма тензоров с requiresgrad продолжает граф, и каждый шаг привязывает к нему свои активации. .item() возвращает обычное число Python (и синхронизирует GPU, поэтому в очень горячих циклах копят detach() и вызывают item реже). - Значение…

Варианты ответа

  1. Потому что loss слишком большой по значению и хранится в float64 на GPU
  2. Нужно вызывать torch.cuda.empty_cache() каждый шаг, иначе аллокатор не возвращает память
  3. loss это тензор с графом; накапливая его, мы держим графы всех шагов. Нужно loss.item()правильный ответ
  4. Сложение тензоров на GPU создаёт новую копию в памяти, и старые копии не освобождаются

Разбор

Сумма тензоров с requires_grad продолжает граф, и каждый шаг привязывает к нему свои активации. .item() возвращает обычное число Python (и синхронизирует GPU, поэтому в очень горячих циклах копят detach() и вызывают item реже).

  • Значение loss на память не влияет.
  • empty_cache не освобождает память, на которую есть ссылки.
  • Сложение разрешено, проблема в графе.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.