gpt4 book ai didi

python - PyTorch 张量切片和内存使用情况

转载 作者:行者123 更新时间:2023-12-02 02:51:09 27 4
gpt4 key购买 nike

import torch
T = torch.FloatTensor(range(0,10 ** 6)) # 1M

#case 1:
torch.save(T, 'junk.pt')
# results in a 4 MB file size

#case 2:
torch.save(T[-20:], 'junk2.pt')
# results in a 4 MB file size

#case 3:
torch.save(torch.FloatTensor(T[-20:]), 'junk3.pt')
# results in a 4 MB file size

#case 4:
torch.save(torch.FloatTensor(T[-20:].tolist()), 'junk4.pt')
# results in a 405 Bytes file size

我的问题是:

  1. 在情况 3 中,当我们创建一个新的张量时,生成的文件大小似乎令人惊讶。为什么这个新张量不仅仅是切片?

  2. 情况 4 是仅保存张量的一部分(切片)的最佳方法吗?

  3. 更一般地说,如果我想通过删除其值的前半部分来“修剪”一个非常大的一维张量以节省内存,我是否必须按照情况 4 进行操作,或者是否有一种更直接、计算成本更低的方法,不涉及创建 python 列表。

最佳答案

(i) In case 3 the resulting file size seems surprising as we are creating a new tensor. Why is this new tensor not just the slice?

切片创建张量的 View ,该 View 共享底层数据,但包含有关用于可见数据的内存偏移量的信息。这避免了频繁复制数据,从而使许多操作更加高效。请参阅PyTorch - Tensor Views获取受影响操作的列表。

您正在处理少数情况之一,其中基础数据很重要。为了保存张量,需要保存底层数据,否则偏移量将不再有效。

如果没有必要,

torch.FloatTensor不会创建张量的副本。您可以验证它们的底层数据是否仍然相同(它们具有完全相同的内存位置):

torch.FloatTensor(T[-20:]).storage().data_ptr() == T.storage().data_ptr()
# => True

(ii) Is case 4, the optimal method for saving just part (slice) of a tensor?

(iii) More generally, if I want to 'trim' a very large 1-dimensional tensor by removing the first half of its values in order to save memory, do I have to proceed as in case 4, or is there a more direct and less computationally costly way that does not involve creating a python list.

您很可能无法复制切片的数据,但至少您可以通过使用 torch.Tensor.clone 避免从中创建 Python 列表并从列表中创建新的张量。相反:

torch.save(T[-20:].clone(), 'junk5.pt')

关于python - PyTorch 张量切片和内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61964164/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com