Pytorch:为啥`tensor`变量占用的内存这么小?

Posted

技术标签:

【中文标题】Pytorch:为啥`tensor`变量占用的内存这么小?【英文标题】:Pytorch: Why is the memory occupied by the `tensor` variable so small?Pytorch:为什么`tensor`变量占用的内存这么小? 【发布时间】:2019-06-19 01:56:39 【问题描述】:

在 Pytorch 1.0.0 中,我发现一个 tensor 变量占用的内存非常小。我想知道它是如何存储这么多数据的。 这是代码。

a = np.random.randn(1, 1, 128, 256)
b = torch.tensor(a, device=torch.device('cpu'))

a_size = sys.getsizeof(a)
b_size = sys.getsizeof(b)

a_size 是 262288。b_size 是 72。

【问题讨论】:

【参考方案1】:

答案分为两部分。来自sys.getsizeof的文档,首先

所有内置对象都将返回正确的结果,但这对于第三方扩展不一定成立,因为它是特定于实现的。

因此,对于张量 __sizeof__ 而言,可能未定义或定义与您预期的不同 - 此函数不是您可以依赖的。其次

只考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。

这意味着如果torch.Tensor 对象仅包含对实际内存的引用,则不会在sys.getsizeof 中显示。确实如此,如果您改为检查底层storage 的大小,您将看到预期的数字

import torch, sys
b = torch.randn(1, 1, 128, 256, dtype=torch.float64)
sys.getsizeof(b)
>> 72
sys.getsizeof(b.storage())
>> 262208

注意:我将dtype 明确设置为float64,因为这是numpy 中的默认dtype,而torch 默认使用float32

【讨论】:

真的很棒的答案,会给指向storage 的指针再+1。非常有帮助!

以上是关于Pytorch:为啥`tensor`变量占用的内存这么小?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch中的tensor常用操作

『PyTorch』第五弹_深入理解Tensor对象_下:从内存看Tensor

[Pytorch系列-19]:Pytorch基础 - Variable变量的使用方法与 Tensor变量的比较

PyTorch内存模型:“torch.from_numpy()”vs“torch.Tensor()”

pytorch笔记:contiguous &tensor 存储知识

《动手学深度学习》PyTorch: 数据操作