С pytorch / python лучше перезаписывать переменные или определять новые? - PullRequest
1 голос
/ 29 января 2020

Предположим, у меня есть алгоритм, который делает следующее в python с pytorch. Пожалуйста, игнорируйте, эффективны ли шаги. Это просто пример глупой игрушки.

 def foo(input_list):
      # input_list is a list of N 2-D pytorch tensors of shape (h,w)
      tensor = torch.stack(input_list) # convert to tensor.shape(h,w,N)
      tensor1 = torch.transpose(tensor,0,2).unsqueeze(1) # convert to tensor.shape(N,1,h,w)
      tensor2 = torch.interpolate(tensor1,size=(500,500) # upsample to new shape (N,1,500,500)

 def bar(input_list):
      tensor = torch.stack(input_list) # convert to tensor.shape(h,w,N)
      tensor = torch.transpose(tensor,0,2).unsqueeze(1) # convert to tensor.shape(N,1,h,w)
      tensor = torch.interpolate(tensor,size=(500,500) # upsample to new shape (N,1,500,500)

Мой вопрос заключается в том, имеет ли смысл использовать метод foo() или bar() или он не имеет значения. Я думал, что я сохраняю память, перезаписывая то же имя переменной (bar), поскольку на самом деле мне никогда не понадобятся эти промежуточные шаги. Но если интерфейс CUDA создает новые области памяти для каждой функции, то я трачу одинаковое количество памяти на оба метода.

1 Ответ

0 голосов
/ 29 января 2020

tensor и tensor1 в вашем примере - это просто разные представления одних и тех же данных в памяти, поэтому разница в памяти, связанная с возможным сохранением двух немного разных ссылок на них, должна быть незначительной. Соответствующая часть будет только tensor1 против tensor2.

. Возможно, вы захотите увидеть похожий вопрос: Python: свободна ли «старая» память при назначении переменной новое содержимое?

Поскольку переназначение тензора, который фактически выделяет новую память, также является последним вызовом в bar, я подозреваю, что в этом конкретном примере общая память не будет затронута (tensor1 не будет ссылаться, как только функция все равно вернется).

С более длинной цепочкой операций я не думаю, что G C гарантированно будет вызываться при любом из этих переназначений, хотя это может дать python немного больше гибкости. Вероятно, я бы предпочел стиль в foo только потому, что позже будет проще изменить порядок операций в цепочке. Отслеживание различных имен добавляет издержки для программиста, а не только для переводчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...