torch.Storage¶
在 PyTorch 中,常规张量是一个多维数组,由以下组件定义:
存储:张量的实际数据,存储为连续的一维字节数组。
dtype
:张量中元素的数据类型,例如 torch.float32 或 torch.int64。shape
:一个元组,指示每个维度中张量的大小。步幅:在每个维度中从一个元素移动到下一个元素所需的步长。
偏移量:张量数据从存储开始的起点。对于新 created 张量。
这些组件共同定义了张量的结构和数据,其中存储保存了 实际数据,其余部分用作元数据。
无类型存储 API¶
A 是连续的一维元素数组。它的长度等于
字节。该存储用作张量的底层数据容器。
通常,在 PyTorch 中使用常规构造函数(如
)
创建的张量将生成张量,其中
张量之间存在一一对应的张量
storage 和 Tensor 本身。
但是,一个 storage 可以由多个 Tensor 共享。
例如,张量的任何视图(通过或部分(但不是全部)类型的索引获得
(如 Integers 和 Slices)将指向与原始张量相同的底层存储。
在序列化和反序列化共享公共存储的张量时,将保留这种关系,并且张量
continue 指向同一存储。有趣的是,反序列化指向单个存储的多个张量
可能比反序列化多个独立张量更快。
可以通过该方法访问张量存储。这将返回一个
键入
。
幸运的是,存储有一个称为 accessed 的唯一标识符 via the
method.
在常规设置中,具有相同数据存储的两个张量将具有相同的 storage 。
但是,张量本身可以指向两个单独的存储,一个用于其 data 属性,另一个用于其 grad
属性。每个都需要自己的 a。通常,不能保证 a
和
match ,这不应假定为 true。
data_ptr
data_ptr()
非类型化存储在某种程度上独立于在其上构建的张量。实际上,这意味着张量 具有不同的 dtype 或 shape 可以指向同一个存储。 它还意味着可以更改张量存储,如下例所示:
>>> t = torch.ones(3)
>>> s0 = t.untyped_storage()
>>> s0
0
0
128
63
0
0
128
63
0
0
128
63
[torch.storage.UntypedStorage(device=cpu) of size 12]
>>> s1 = s0.clone()
>>> s1.fill_(0)
0
0
0
0
0
0
0
0
0
0
0
0
[torch.storage.UntypedStorage(device=cpu) of size 12]
>>> # Fill the tensor with a zeroed storage
>>> t.set_(s1, storage_offset=t.storage_offset(), stride=t.stride(), size=t.size())
tensor([0., 0., 0.])
警告
请注意,不建议直接修改张量的存储,如本示例所示。
这种低级操作仅用于教育目的,以演示
Tensor 及其底层存储。通常,使用标准方法(如 和
)来获得相同的结果会更高效、更安全。
torch.Tensor
除了 , untyped storage 还具有其他属性,例如(如果 storage 指向磁盘上的文件)
或
用于设备检查。也可以就地操作存储或
与
、
或
.有关更多信息,请查看 API
参考文献。请记住,修改存储是一个低级 API,并且存在风险!
这些 API 中的大多数也存在于张量级别:如果存在,则应优先考虑它们而不是其存储
同行。
data_ptr
特殊情况¶
我们提到过,具有非 None 属性的张量实际上包含两条数据。
在这种情况下,将返回属性
而梯度的存储可以通过 获得。
grad
data
tensor.grad.untyped_storage()
>>> t = torch.zeros(3, requires_grad=True)
>>> t.sum().backward()
>>> assert list(t.untyped_storage()) == [0] * 12 # the storage of the tensor is just 0s
>>> assert list(t.grad.untyped_storage()) != [0] * 12 # the storage of the gradient isn't
- 在一些特殊情况下,张量没有典型的存储,或者根本没有存储:
设备上的 Tensors:设备上的 Tensor 用于形状推理 并且不保存实际数据。
"meta"
"meta"
Fake Tensors:PyTorch 编译器使用的另一个内部工具是 FakeTensor,它基于类似的想法。
Tensor 子类或类似 Tensor 的对象也可以显示异常行为。一般来说,我们不会 预计许多使用案例需要在 Storage 级别运行!
- 类 Torch 的 Torch 类UntypedStorage(*args, **kwargs)[来源][来源]¶
-
- 复制_()¶
- cuda(device=None, non_blocking=False)[来源]¶
返回 CUDA 内存中此对象的副本。
如果此对象已在 CUDA 内存中并且位于正确的设备上,则 不执行复制,返回原始对象。
- 参数
- 返回类型
Union[_StorageBase, TypedStorage]
- data_ptr()¶
- element_size()¶
- 填补_()¶
- 静态from_buffer()¶
- 静态 from_file(文件名, shared=False, size=0) 存储 ¶
创建由内存映射文件支持的 CPU 存储。
如果为 ,则内存在所有进程之间共享。 所有更改都将写入文件。如果为 ,则对 存储不会影响文件。
shared
True
shared
False
size
是存储中的元素数。如果 是 , 则文件必须至少包含 bytes ( 是存储类型,如果文件必须包含在 最少字节数)。如果是,则根据需要创建文件。shared
False
size * sizeof(Type)
Type
UnTypedStorage
size
shared
True
- 参数
filename (str) – 要映射的文件名
shared (bool) – 是否共享内存(无论 还是传递给 底层 mmap(2) 调用
MAP_SHARED
MAP_PRIVATE
)size (int) – 存储空间中的元素数量
- hpu(device=None, non_blocking=False)[来源]¶
返回 HPU 内存中此对象的副本。
如果此对象已在 HPU 内存中且位于正确的设备上,则 不执行复制,返回原始对象。
- 参数
- 返回类型
Union[_StorageBase, TypedStorage]
- 属性is_cuda¶
- 属性is_hpu¶
- is_pinned(device='cuda')[来源]¶
确定 CPU 存储是否已固定在设备上。
- 参数
device (str 或 torch.device) – 要固定内存的设备。违约:。
'cuda'
- 返回
布尔变量。
- n字节()¶
- 新增功能()¶
- pin_memory(device='cuda')[来源]¶
将 CPU 存储复制到固定内存(如果尚未固定)。
- 参数
device (str 或 torch.device) – 要固定内存的设备。违约:。
'cuda'
- 返回
固定的 CPU 存储。
- 可调整大小()¶
- 调整_()¶
将存储移动到共享内存。
对于共享内存中已有的存储和 CUDA,这是无操作 存储,无需移动即可跨进程共享。 共享内存中的存储无法调整大小。
请注意,为了缓解此类问题,从同一对象上的多个线程调用此函数是线程安全的。 但是,在没有适当的 同步。有关更多详细信息,请参阅 Multiprocessing 最佳实践。
注意
删除对共享内存中存储的所有引用时,关联的共享内存 对象也将被删除。PyTorch 有一个特殊的清理过程来确保这种情况发生 即使当前进程意外退出。
值得注意的是 和
with 之间的区别
shared = True
share_memory_
使用 shm_open(3) 创建一个 POSIX 共享内存对象 while使用 open(2) 打开用户传递的文件名。
两者都使用 mmap(2) 调用 with 将文件/对象映射到当前的虚拟地址空间
MAP_SHARED
share_memory_
将在映射对象后调用对象,以确保共享内存 当没有进程打开对象时,将释放对象。 不会取消链接 文件。此文件是永久性的,将一直保留,直到用户将其删除。shm_unlink(3)
torch.from_file(shared=True)
- 返回
self
- type(dtype=None, non_blocking=False)[来源]¶
- 返回类型
Union[_StorageBase, TypedStorage]
传统类型存储¶
警告
对于历史上下文,PyTorch 以前使用类型化存储类,即
现已弃用,应避免使用。下面详细介绍了此 API,以防您
应该遇到它,尽管非常不鼓励使用它。
除 外的所有存储类都将被删除
将来,
并将在所有情况下使用。
torch.Storage
是存储类的别名,对应于
默认数据类型 ()。例如,如果
默认数据类型为 ,解析为
。
torch.float
torch.Storage
和 类,
like 、
等不是
实际上曾经实例化。调用它们的构造函数会创建
a
与适当的
和
。 类具有所有
相同的类方法。
torch.<type>Storage
torch.cuda.<type>Storage
torch.<type>Storage
A 是
特定
.它可以被赋予 any
,并且内部数据将被适当地解释。
包含一个
将数据保存为无类型的字节数组。
- 类 Torch 的 Torch 类TypedStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- cuda(device=None, non_blocking=False)[来源][来源]¶
返回 CUDA 内存中此对象的副本。
如果此对象已在 CUDA 内存中并且位于正确的设备上,则 不执行复制,返回原始对象。
- property device (设备) ¶
- 类方法 from_file(filename, shared=False, size=0) Storage [源][源]¶
创建由内存映射文件支持的 CPU 存储。
如果为 ,则内存在所有进程之间共享。 所有更改都将写入文件。如果为 ,则对 存储不会影响文件。
shared
True
shared
False
size
是存储中的元素数。如果 是 , 则文件必须至少包含 bytes ( 是存储类型)。如果是,则根据需要创建文件。shared
False
size * sizeof(Type)
Type
shared
True
- 参数
filename (str) – 要映射的文件名
共享 (bool) –
是否共享内存(无论 或 传递给 底层 mmap(2) 调用
MAP_SHARED
MAP_PRIVATE
)size (int) – 存储空间中的元素数量
- hpu(device=None, non_blocking=False)[来源][来源]¶
返回 HPU 内存中此对象的副本。
如果此对象已在 HPU 内存中且位于正确的设备上,则 不执行复制,返回原始对象。
- 属性is_cuda¶
- 属性is_hpu¶
- is_pinned(device='cuda')[来源][来源]¶
确定 CPU TypedStorage 是否已固定在设备上。
- 参数
device (str 或 torch.device) – 要固定内存的设备。违约:
'cuda'
- 返回
布尔变量。
- pin_memory(device='cuda')[来源][来源]¶
将 CPU TypedStorage 复制到固定内存(如果尚未固定)。
- 参数
device (str 或 torch.device) – 要固定内存的设备。违约:。
'cuda'
- 返回
固定的 CPU 存储。
- 类 Torch 的 Torch 类DoubleStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.float64[来源]¶
- 类 Torch 的 Torch 类FloatStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.float32[来源]¶
- 类 Torch 的 Torch 类HalfStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.float16[来源]¶
- 类 Torch 的 Torch 类LongStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.int64[来源]¶
- 类 Torch 的 Torch 类IntStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.int32[来源]¶
- 类 Torch 的 Torch 类ShortStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.int16[来源]¶
- 类 Torch 的 Torch 类CharStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.int8[来源]¶
- 类 Torch 的 Torch 类ByteStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype:torch.dtype = torch.uint8[来源]¶
- 类 Torch 的 Torch 类BoolStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.bool[来源]¶
- 类 Torch 的 Torch 类BFloat16Storage(*args, wrap_storage=无, dtype=无, device=无, _internal=假)[来源][来源]¶
- dtype: torch.dtype = torch.bfloat16[来源]¶
- 类 Torch 的 Torch 类ComplexDoubleStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=假)[来源][来源]¶
- dtype: torch.dtype = torch.complex128[来源]¶
- 类 Torch 的 Torch 类ComplexFloatStorage(*args, wrap_storage=无, dtype=无, device=无, _internal=假)[来源][来源]¶
- dtype: torch.dtype = torch.complex64[来源]¶
- 类 Torch 的 Torch 类QUInt8Storage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.quint8[来源]¶
- 类 Torch 的 Torch 类QInt8Storage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.qint8[来源]¶
- 类 Torch 的 Torch 类QInt32Storage(*args, wrap_storage=无, dtype=无, device=无, _internal=False)[来源][来源]¶
- dtype: torch.dtype = torch.qint32[来源]¶