目录

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_ptrdata_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 属性的张量实际上包含两条数据。 在这种情况下,将返回属性 而梯度的存储可以通过 获得。graddatatensor.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[来源][来源]
bfloat16)[来源]

将此存储强制转换为 bfloat16 类型。

bool)[来源]

将此存储强制转换为 bool 类型。

byte[来源]

将此存储强制转换为 byte 类型。

byteswapdtype[来源]

交换基础数据中的字节。

char[来源]

将此存储强制转换为 char 类型。

clone)[来源]

返回此存储的副本。

complex_double[来源]

将此存储强制转换为复杂的 double 类型。

complex_float)[来源]

将此存储强制转换为复杂的 float 类型。

复制_()
cpu)[来源]

如果此存储尚未在 CPU 上,则返回该存储的 CPU 副本。

cudadevice=Nonenon_blocking=False[来源]

返回 CUDA 内存中此对象的副本。

如果此对象已在 CUDA 内存中并且位于正确的设备上,则 不执行复制,返回原始对象。

参数
  • deviceint) – 目标 GPU ID。默认为当前设备。

  • non_blockingbool) – 如果源位于固定内存中, 复制将相对于主机异步。否则 该参数无效。True

返回类型

Union[_StorageBaseTypedStorage]

data_ptr()
device设备
double[来源]

将此存储转换为 double 类型。

element_size()
property filename 可选[str]

返回与此存储关联的文件名。

如果存储位于 CPU 上,并且是通过 as 创建的,则文件名将是一个字符串。此属性则相反。sharedTrueNone

填补_()
float[来源]

将此存储强制转换为 float 类型。

float8_e4m3fn[来源]

将此存储强制转换为 float8_e4m3fn 类型

float8_e4m3fnuz[来源]

将此存储强制转换为 float8_e4m3fnuz 类型

float8_e5m2)[来源]

将此存储强制转换为 float8_e5m2 类型

float8_e5m2fnuz)[来源]

将此存储强制转换为 float8_e5m2fnuz 类型

静态from_buffer()
静态 from_file文件名shared=Falsesize=0 存储

创建由内存映射文件支持的 CPU 存储。

如果为 ,则内存在所有进程之间共享。 所有更改都将写入文件。如果为 ,则对 存储不会影响文件。sharedTruesharedFalse

size是存储中的元素数。如果 是 , 则文件必须至少包含 bytes ( 是存储类型,如果文件必须包含在 最少字节数)。如果是,则根据需要创建文件。sharedFalsesize * sizeof(Type)TypeUnTypedStoragesizesharedTrue

参数
  • filenamestr) – 要映射的文件名

  • sharedbool) – 是否共享内存(无论 还是传递给 底层 mmap(2) 调用MAP_SHAREDMAP_PRIVATE)

  • sizeint) – 存储空间中的元素数量

get_device[来源]
返回类型

int

half[来源]

将此存储强制转换为 half type。

hpudevice=Nonenon_blocking=False[来源]

返回 HPU 内存中此对象的副本。

如果此对象已在 HPU 内存中且位于正确的设备上,则 不执行复制,返回原始对象。

参数
  • deviceint) – 目标 HPU ID。默认为当前设备。

  • non_blockingbool) – 如果源位于固定内存中, 复制将相对于主机异步。否则 该参数无效。True

返回类型

Union[_StorageBaseTypedStorage]

int)[来源]

将此存储强制转换为 int 类型。

属性is_cuda
属性is_hpu
is_pinneddevice='cuda'[来源]

确定 CPU 存储是否已固定在设备上。

参数

devicestrtorch.device) – 要固定内存的设备。违约:。'cuda'

返回

布尔变量。

is_shared()
is_sparse: bool = False
is_sparse_csr: bool = False
long[来源]

将此存储强制转换为 long 类型。

mps)[来源]

如果此存储尚未在 MPS 上,请返回该存储的 MPS 副本。

n字节()
新增功能()
pin_memorydevice='cuda'[来源]

将 CPU 存储复制到固定内存(如果尚未固定)。

参数

devicestrtorch.device) – 要固定内存的设备。违约:。'cuda'

返回

固定的 CPU 存储。

可调整大小()
调整_()
share_memory_*args**kwargs[来源][来源]

将存储移动到共享内存。

对于共享内存中已有的存储和 CUDA,这是无操作 存储,无需移动即可跨进程共享。 共享内存中的存储无法调整大小。

请注意,为了缓解此类问题,从同一对象上的多个线程调用此函数是线程安全的。 但是,在没有适当的 同步。有关更多详细信息,请参阅 Multiprocessing 最佳实践

注意

删除对共享内存中存储的所有引用时,关联的共享内存 对象也将被删除。PyTorch 有一个特殊的清理过程来确保这种情况发生 即使当前进程意外退出。

值得注意的是 和 with 之间的区别shared = True

  1. share_memory_使用 shm_open(3) 创建一个 POSIX 共享内存对象 while 使用 open(2) 打开用户传递的文件名。

  2. 两者都使用 mmap(2) 调用 with 将文件/对象映射到当前的虚拟地址空间MAP_SHARED

  3. share_memory_将在映射对象后调用对象,以确保共享内存 当没有进程打开对象时,将释放对象。 不会取消链接 文件。此文件是永久性的,将一直保留,直到用户将其删除。shm_unlink(3)torch.from_file(shared=True)

返回

self

short)[来源]

将此存储转换为 short type。

size[来源]
返回类型

int

to*devicenon_blocking=False[来源]
tolist)[来源]

返回包含此存储元素的列表。

typedtype=Nonenon_blocking=False[来源]
返回类型

Union[_StorageBaseTypedStorage]

untyped)[来源]

传统类型存储

警告

对于历史上下文,PyTorch 以前使用类型化存储类,即 现已弃用,应避免使用。下面详细介绍了此 API,以防您 应该遇到它,尽管非常不鼓励使用它。 外的所有存储类都将被删除 将来,并将在所有情况下使用。

torch.Storage是存储类的别名,对应于 默认数据类型 ()。例如,如果 默认数据类型为 ,解析为 torch.floattorch.Storage

和 类, like 等不是 实际上曾经实例化。调用它们的构造函数会创建 a 与适当的 。 类具有所有 相同的类方法。torch.<type>Storagetorch.cuda.<type>Storagetorch.<type>Storage

A 是 特定 .它可以被赋予 any ,并且内部数据将被适当地解释。 包含一个 将数据保存为无类型的字节数组。

每个跨纹都包含一个 , 它存储了 views.

Torch 的 Torch 类TypedStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
bfloat16[来源][来源]

将此存储强制转换为 bfloat16 类型。

bool)[来源][来源]

将此存储强制转换为 bool 类型。

byte[来源][来源]

将此存储强制转换为 byte 类型。

char[来源][来源]

将此存储强制转换为 char 类型。

clone[来源][来源]

返回此存储的副本。

complex_double[来源][来源]

将此存储强制转换为复杂的 double 类型。

complex_float[来源][来源]

将此存储强制转换为复杂的 float 类型。

copy_来源non_blocking=[来源][来源]
cpu[源][源]

如果此存储尚未在 CPU 上,则返回该存储的 CPU 副本。

cudadevice=Nonenon_blocking=False[来源][来源]

返回 CUDA 内存中此对象的副本。

如果此对象已在 CUDA 内存中并且位于正确的设备上,则 不执行复制,返回原始对象。

参数
  • deviceint) – 目标 GPU ID。默认为当前设备。

  • non_blockingbool) – 如果源位于固定内存中, 复制将相对于主机异步。否则 该参数无效。True

返回类型

自我

data_ptr)[来源][来源]
property device (设备)
double[来源][来源]

将此存储转换为 double 类型。

dtypedtype
element_size[来源][来源]
property filename 可选[str]

如果存储是从文件映射的内存,则返回与此存储关联的文件名。 或者,如果存储不是通过内存映射文件创建的。None

fill_[来源][来源]
float[来源][来源]

将此存储强制转换为 float 类型。

float8_e4m3fn[来源][来源]

将此存储强制转换为 float8_e4m3fn 类型

float8_e4m3fnuz[来源][来源]

将此存储强制转换为 float8_e4m3fnuz 类型

float8_e5m2[来源][来源]

将此存储强制转换为 float8_e5m2 类型

float8_e5m2fnuz[来源][来源]

将此存储强制转换为 float8_e5m2fnuz 类型

类方法 from_buffer*args**kwargs[源][源]
类方法 from_filefilenameshared=Falsesize=0 Storage[源][源]

创建由内存映射文件支持的 CPU 存储。

如果为 ,则内存在所有进程之间共享。 所有更改都将写入文件。如果为 ,则对 存储不会影响文件。sharedTruesharedFalse

size是存储中的元素数。如果 是 , 则文件必须至少包含 bytes ( 是存储类型)。如果是,则根据需要创建文件。sharedFalsesize * sizeof(Type)TypesharedTrue

参数
  • filenamestr) – 要映射的文件名

  • 共享bool) –

    是否共享内存(无论 或 传递给 底层 mmap(2) 调用MAP_SHAREDMAP_PRIVATE)

  • sizeint) – 存储空间中的元素数量

get_device)[来源][来源]
返回类型

int

half[来源][来源]

将此存储强制转换为 half type。

hpudevice=Nonenon_blocking=False[来源][来源]

返回 HPU 内存中此对象的副本。

如果此对象已在 HPU 内存中且位于正确的设备上,则 不执行复制,返回原始对象。

参数
  • deviceint) – 目标 HPU ID。默认为当前设备。

  • non_blockingbool) – 如果源位于固定内存中, 复制将相对于主机异步。否则 该参数无效。True

返回类型

自我

int[来源][来源]

将此存储强制转换为 int 类型。

属性is_cuda
属性is_hpu
is_pinneddevice='cuda'[来源][来源]

确定 CPU TypedStorage 是否已固定在设备上。

参数

devicestrtorch.device) – 要固定内存的设备。违约:'cuda'

返回

布尔变量。

is_shared[来源][来源]
is_sparse: bool = False
long[来源][来源]

将此存储强制转换为 long 类型。

nbytes[来源][来源]
pickle_storage_type)[来源][来源]
pin_memorydevice='cuda'[来源][来源]

将 CPU TypedStorage 复制到固定内存(如果尚未固定)。

参数

devicestrtorch.device) – 要固定内存的设备。违约:。'cuda'

返回

固定的 CPU 存储。

resizable)[来源][来源]
resize_大小[来源][来源]
share_memory_)[来源][来源]

short[来源][来源]

将此存储转换为 short type。

size[来源][来源]
to*devicenon_blocking=False[来源][来源]

返回设备内存中此对象的副本。

如果此对象已位于正确的设备上,则不会执行复制 并返回原始对象。

参数
  • deviceint) – 目标设备。

  • non_blockingbool) – 如果源位于固定内存中, 复制将相对于主机异步。否则 该参数无效。True

返回类型

自我

tolist)[来源][来源]

返回包含此存储元素的列表。

typedtype=Nonenon_blocking=False[源][源]

如果未提供 dtype,则返回类型,否则将此对象强制转换为 指定的类型。

如果此类型已正确,则不会执行复制,并且 返回 original 对象。

参数
  • dtypetype or string) – 所需的类型

  • non_blockingbool) – 如果 ,并且源位于固定内存中 并且 destination 在 GPU 上,反之亦然,则执行复制 异步。否则,参数 没有效果。True

  • **kwargs – 为了兼容性,可以包含 key 来代替 参数。arg 已弃用。asyncnon_blockingasync

返回类型

Union[_StorageBaseTypedStoragestr]

untyped)[来源][来源]

返回内部 .

Torch 的 Torch 类DoubleStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.float64[来源]
Torch 的 Torch 类FloatStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.float32[来源]
Torch 的 Torch 类HalfStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.float16[来源]
Torch 的 Torch 类LongStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.int64[来源]
Torch 的 Torch 类IntStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.int32[来源]
Torch 的 Torch 类ShortStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.int16[来源]
Torch 的 Torch 类CharStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.int8[来源]
Torch 的 Torch 类ByteStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtypetorch.dtype = torch.uint8[来源]
Torch 的 Torch 类BoolStorage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.bool[来源]
Torch 的 Torch 类BFloat16Storage*argswrap_storage=dtype=device=_internal=[来源][来源]
dtype torch.dtype = torch.bfloat16[来源]
Torch 的 Torch 类ComplexDoubleStorage*argswrap_storage=dtype=device=_internal=[来源][来源]
dtype torch.dtype = torch.complex128[来源]
Torch 的 Torch 类ComplexFloatStorage*argswrap_storage=dtype=device=_internal=[来源][来源]
dtype torch.dtype = torch.complex64[来源]
Torch 的 Torch 类QUInt8Storage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.quint8[来源]
Torch 的 Torch 类QInt8Storage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.qint8[来源]
Torch 的 Torch 类QInt32Storage*argswrap_storage=dtype=device=_internal=False[来源][来源]
dtype torch.dtype = torch.qint32[来源]
Torch 的 Torch 类QUInt4x2Storage*argswrap_storage=dtype=device=_internal=[来源][来源]
dtype torch.dtype = torch.quint4x2[来源]
Torch 的 Torch 类QUInt2x4Storage*argswrap_storage=dtype=device=_internal=[来源][来源]
dtype torch.dtype = torch.quint2x4[来源]

文档

访问 PyTorch 的全面开发人员文档

查看文档

教程

获取面向初学者和高级开发人员的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源