Повторение тензора пироха без копирования памяти - PullRequest
3 голосов
/ 15 января 2020

Поддерживает ли pytorch повторение тензора без выделения значительно большего объема памяти ?

Предположим, у нас есть тензор

t = torch.ones((1,1000,1000))
t10 = t.repeat(10,1,1)

Повтор t 10 раз будет требуется взять 10x памяти. Есть ли способ, как я могу создать тензор t10, не выделяя значительно больше памяти?

Здесь это связанный вопрос, но без ответов.

1 Ответ

4 голосов
/ 15 января 2020

Вы можете использовать torch.expand

t = torch.ones((1, 1000, 1000))
t10 = t.expand(10, 1000, 1000)

Имейте в виду, что t10 является просто ссылкой на t. Так, например, изменение t10[0,0,0] приведет к тому же изменению в t[0,0,0], и каждый член t10[:,0,0].

За исключением прямого доступа, большинство операций, выполняемых на t10, приведут к тому, что память быть скопирован, что нарушит ссылку и приведет к увеличению памяти. Например: изменение устройства (.cpu(), .to(device=...), .cuda()), изменение типа данных (.float(), .long(), .to(dtype=...)) или использование .contiguous().

...