• 文档 >
  • 模块代码 >
  • torch >
  • torch.storage
快捷键

PyTorch 存储源代码

# mypy: 允许未类型化定义

from 未来 导入 注释

导入 集合
导入 复制
导入 functools
导入 io
导入 线程
导入 警告
from 打字 导入 任何, 角色, 可选 as 可选, 类型检查, 类型变量, 联合
from typing_extensions 导入 自身

导入 火炬
from torch._utils 导入 _to, _类型
from torch 的类型 导入 _布尔, 内部, 存储


如果 类型检查:
    from torch._prims_common 导入 DeviceLikeType


全部 = ["类型存储", "无类型存储"]


尝试:
    导入 numpy as np

    HAS_NUMPY = 真实
除了 模块未找到错误:
    HAS_NUMPY = 
    np =   # 类型:忽略[赋值]


_share_memory_lock = 线程.()
_share_memory_map: 字典[int, 线程.RLock] = {}

T = 类型变量(T, 绑定=Union[_StorageBase, TypedStorage])


 _StorageBase:
    _cdata: 任何
    is_sparse: _bool = 
    is_sparse_csr: _bool = 
    设备: 火炬.设备
    # 用于
    # (1) 将 FakeTensor 设备存储到 torch.serialization.skip_data 中
    将设备存入存储以在 FakeTensorMode 下 torch.load 时传播到 FakeTensor
    _假设备: 可选[火炬.设备] = 
    在使用 FakeTensorMode 加载时使用,以提供 torch.saved-file 中存储的偏移信息
    _检查点偏移: 可选[int] = 

    定义 __init__(self, *参数, **关键字参数):
        通过

    定义 __len__(self) -> 内部翻译:
        抛出 NotImplementedError

    定义 __getitem__(self, 索引):
        抛出 NotImplementedError

    定义 __setitem__(self, *参数, **关键字参数):
        抛出 NotImplementedError

    定义 复制_(self, : T, 非阻塞: 可选[布尔] = ) -> T:
        抛出 未实现异常

    定义 (self) -> 联合[_StorageBase, 类型化存储]
        抛出 未实现异常

    定义 字节数(self) -> 整数:
        抛出 未实现异常

    定义 尺寸(self) -> 整数:
        返回 self.字节数()

    定义 类型(
        self, 数据类型: 可选[str] = , 非阻塞: _bool = 
    ) -> 联合[_StorageBase, 类型化存储]
        返回 _type(self, 数据类型, 非阻塞)

    定义 cuda(
        self, 设备=, 非阻塞=
    ) -> 联合[_StorageBase, 类型化存储]
        返回此对象在 CUDA 内存中的副本。

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

参数:
设备(int):目标 GPU ID。默认为当前设备。
non_blocking (布尔值): 如果为 ``True`` 且源数据位于固定内存中,
那么复制操作将与主机异步。否则,
该参数将没有效果。
        """
        device2 = 火炬.设备(cuda, 设备) 如果 设备 否则 火炬.设备(cuda)
        返回 self.(设备=device2, 非阻塞=非阻塞)

    定义 硬件加速处理器(self, 设备=, 非阻塞=False) -> 联合[_StorageBase, 类型化存储]
        返回此对象在 HPU 内存中的副本。

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

参数:
设备(int):目标 HPU ID。默认为当前设备。
non_blocking (布尔值): 如果为 ``True`` 且源数据位于固定内存中,
那么复制操作将与主机异步。否则,
该参数将没有效果。
        """
        device2 = 火炬.设备(hpu, 设备) 如果 设备 否则 火炬.设备(hpu)
        返回 self.(设备=device2, 非阻塞=非阻塞)

    定义 元素大小(self) -> 内部翻译:
        抛出 未实现异常

    定义 get_device(self) -> _int:
        返回 self.设备.索引

    定义 数据指针(self) -> 内部翻译:
        抛出 未实现异常

    定义 可调整大小的(self) -> 布尔值:
        抛出 未实现异常

    定义在 torch/csrc/generic/StorageSharing.cpp 中
    定义 _share_filename_cpu_(self, *参数, **关键字参数):
        抛出 不支持异常

    定义 _share_fd_cpu_(self, *参数, **关键字参数):
        抛出 不支持异常

    @classmethod
    定义 _new_using_filename_cpu(cls, 尺寸: 内联) -> 自身:
        抛出 未实现异常

    @classmethod
    定义 _new_using_fd_cpu(cls, 尺寸: 内联) -> 自身:
        抛出 不支持的操作异常

    @classmethod
    定义 from_buffer(cls, *参数, **关键字参数) -> 自身:
        抛出 不支持异常

    @classmethod
    定义 _new_shared_filename_cpu(
        cls,
        经理,
        对象,
        尺寸,
        *,
        设备=,
        数据类型=,
    ) -> 自身:
        抛出 未实现异常

    @classmethod
    定义 _发布 ipc 计数器_cuda(cls, *参数, **关键字参数) -> 自身:
        抛出 未实现异常

    @classmethod
    定义 _new_with_weak_ptr(cls, *参数, **关键字参数) -> 自身:
        抛出 不支持异常

    定义 _共享解引用(self) -> 联合[_StorageBase, 类型化存储]
        抛出 不支持异常

    定义 _写入文件(self, *参数, **关键字参数):
        抛出 不支持异常

    定义 调整大小(self, 尺寸: _整型):
        抛出 未实现异常

    定义 弱引用(self, *参数, **关键字参数) -> 联合[_StorageBase, 类型化存储]
        抛出 未实现异常

    定义 从文件设置(self, *参数, **关键字参数):
        抛出 未实现异常

    定义 _设置_cdata(self, *参数, **关键字参数):
        抛出 未实现异常

    定义 _共享_cuda_(self, *参数, **关键字参数):
        抛出 未实现异常

    定义 是否共享(self) -> _布尔:
        抛出 未实现异常

    @classmethod
    定义 _new_shared_cuda(cls, *参数, **关键字参数) -> 自身:
        抛出 未实现异常

    定义 _共享增加引用(self, *参数, **关键字参数):
        抛出 未实现异常

    @classmethod
    定义 _释放弱引用(cls, *参数, **关键字参数):
        抛出 不支持异常

    @property
    定义 是 CUDA(self):
        抛出 不支持的操作异常

    @property
    定义 is_hpu(self):
        抛出 不支持的操作异常

    @classmethod
    定义 从文件(cls, 文件名, 共享, 字节数) -> 联合[_StorageBase, 类型化存储]
        抛出 不支持的操作异常

    @classmethod
    定义 已过期(cls, *参数, **关键字参数) -> 联合[_StorageBase, 类型化存储]
        抛出 未实现异常

    定义 _byteswap(self, *参数, **关键字参数):
        抛出 未实现异常

    定义 获取文件名(self, *参数, **关键字参数) -> 可选[str]
        抛出 未实现异常

    定义 __repr__(self):
        info_str = f"[{火炬.类型名(self)}(设备={self.设备}) 尺寸为{长度(self)}]"
        如果 self.设备.类型 == 元数据:
            返回 "..."输入文本翻译为简体中文为:\n" + info_str
        data_str = 输入文本为空,请提供需要翻译的文本 + "输入文本翻译为简体中文为:\n ".连接(str(self[i]) 对于 i  范围(self.尺寸()))
        返回 data_str + "输入文本翻译为简体中文为:\n" + info_str

    定义 __iter__(self):
        返回 迭代(self[i] 对于 i  范围(self.尺寸()))

    定义 复制(self):
        返回 self.克隆()

    定义 深拷贝(self, 描述):
        备忘录 = 描述.setdefault(torch, {})
        如果 self._cdata  描述:
            返回 描述[self._cdata]
        新存储 = self.克隆()
        描述[self._cdata] = 新存储
        返回 新存储

    定义 __reduce__(self):
        b = 输入/输出.BytesIO()
        火炬.保存(self, b, 使用新的 zip 文件序列化=False)
        返回 (从字节加载, (b.获取值(),))

    定义 __sizeof__(self):
        返回 超级().__sizeof__() + self.尺寸()

    定义 克隆(self):
        返回此存储的副本。
        返回 类型(self)(self.字节数(), 设备=self.设备).复制_(self)

    定义 转列表(self):
        "返回包含此存储元素列表。"
        返回 列表(self)

    定义 cpu(self):
        "如果此存储尚未在 CPU 上,则返回其 CPU 副本。"
        如果 self.设备.类型 != "cpu":
            返回 火炬.未类型化存储(self.尺寸()).复制_(self, False)
        返回 self

    定义 会员(self):
        返回此存储的 MPS 复制件,如果它尚未在 MPS 上。
        如果 self.设备.类型 != 国会议员:
            返回 火炬.未类型化存储(self.尺寸(), 设备=国会议员).复制_(self, False)
        返回 self

    定义 _到(self, 数据类型):
        如果  isinstance(数据类型, 火炬.数据类型):
            抛出 类型错误(f"参数 'dtype' 必须是 torch.dtype 类型,而不是 "{类型(数据类型)}")
        存储 = (
            火炬.张量[] 数据类型=火炬.uint8, 设备=self.设备)
            .集合(角色(存储, self))
            .(数据类型)
            ._typed_storage()
        )
        如果 存储.数据指针() == self.数据指针():
            存储 = 存储.克隆()
        返回 存储

    定义 (self, *, 设备: 设备类型, 非阻塞: _布尔 = False):
        如果  isinstance(设备, 火炬.设备):
            设备 = 火炬.设备(设备)
        返回 _to(self, 设备, 非阻塞)

    定义 double(self):
        将此存储转换为双精度浮点类型。
        返回 self._to(火炬.double)

    定义 float(self):
        将此存储转换为浮点类型。
        返回 self.(火炬.float)

    定义 (self):
        将此存储转换为半类型。
        返回 self._to(火炬.)

    定义 (self):
        将此存储转换为长类型。
        返回 self._to(火炬.)

    定义 int(self):
        将此存储转换为 int 类型。
        返回 self._to(火炬.int)

    定义 短整型(self):
        将此存储转换为短类型。
        返回 self._转(火炬.短整型)

    定义 字符(self):
        将此存储转换为 char 类型。
        返回 self._to(火炬.int8)

    定义 byte(self):
        将此存储转换为字节类型。
        返回 self._to(火炬.uint8)

    定义 bool(self):
        将此存储转换为布尔类型。
        返回 self._to(火炬.bool)

    定义 bfloat16(self):
        将此存储转换为 bfloat16 类型。
        返回 self._to(火炬.bfloat16)

    定义 complex_double(self):
        将此存储转换为复双精度类型。
        返回 self._to(火炬.cdouble)

    定义 complex_float(self):
        将此存储转换为复浮点类型。
        返回 self._to(火炬.cfloat)

    定义 float8_e5m2(self):
        将此存储转换为 float8_e5m2 类型
        返回 self._到(火炬.float8_e5m2)

    定义 float8_e4m3fn(self):
        将此存储转换为 float8_e4m3fn 类型
        返回 self._to(火炬.float8_e4m3fn)

    定义 float8_e5m2fnuz(self):
        将此存储转换为 float8_e5m2fnuz 类型
        返回 self._to(火炬.float8_e5m2fnuz)

    定义 float8_e4m3fnuz(self):
        将此存储转换为 float8_e4m3fnuz 类型
        返回 self._到(火炬.float8_e4m3fnuz)

    定义 是否已固定(self, 设备: 联合[str, 火炬.设备] = cuda):
        r确定 CPU 存储是否已经固定在设备上。

参数:
设备(str 或 torch.device):指定内存挂载的设备(默认:`'cuda'`)。
此参数不建议使用,并可能被弃用。

返回值:
一个布尔变量。
        """
        返回 (
            火炬.张量([], 数据类型=火炬.uint8, 设备=self.设备)
            .集合(角色(存储, self))
            .is_pinned(设备)
        )

    定义 显存(self, 设备: 联合[str, 火炬.设备] = cuda):
        r将 CPU 存储复制到已固定内存中,如果它尚未固定。

参数:
device (str 或 torch.device): 要固定内存的设备(默认:'cuda')。
此参数不建议使用,并可能被弃用。

返回值:
固定 CPU 存储。
        """
        如果 self.设备.类型 != "cpu":
            抛出 类型错误(f"无法固定 '"{self.类型()}只有 CPU 内存可以被固定)

        固定张量 = (
            火炬.张量([], 数据类型=火炬.uint8, 设备=self.设备)
            .集合(角色(存储, self))
            .显存(设备)
        )
        返回 固定张量.未类型化存储()

    定义 共享内存_(self):
        请参阅 :meth:`torch.UntypedStorage.share_memory_`
        from torch.multiprocessing 导入 获取共享策略

        如果 self.设备.类型  [cuda, 火炬._C._get_privateuse1_backend_name()]:
            通过  CUDA 或 PrivateUse1 不使用 POSIX 共享内存
        elif 获取共享策略() == "文件系统":
            self._share_filename_cpu_()
        否则:
            self._share_fd_cpu_()
        返回 self

    @classmethod
    定义 新共享(cls, 尺寸, *, 设备="cpu"):
        在共享内存中创建具有相同数据类型的新存储。
        from torch.multiprocessing 导入 获取共享策略

        设备 = 火炬.设备(设备)
        如果 设备.类型  [cuda, 火炬._C._get_privateuse1_backend_name(), hpu]
            返回 cls(尺寸, 设备=设备)
        elif 获取共享策略() == "文件系统":
            返回 cls._new_using_filename_cpu(尺寸)
        否则:
            返回 cls.使用_fd_cpu 新版本(尺寸)

    定义 未指定类型(self):
        返回 self

    定义 字节交换(self, 数据类型):
        在底层数据中交换字节。
        元素大小 = 火炬._utils.元素大小(数据类型)
        对于复杂类型,不要交换第一和第二个数字
        如果 数据类型.是复杂的:
            元素大小 = 最大值(int(元素大小 / 2), 1)
        self.字节交换(元素大小)


定义 _共享内存锁保护(fn):
    @functools.包装(fn)
    定义 包装器(self, *参数, **关键字参数):
        解放 = 
        等待 = 
        替换为 共享内存锁:
             = self._cdata
            如果   共享内存映射:
                等待中 = 共享内存映射[]
            否则:
                共享内存映射[] = 线程.RLock()
                _共享内存映射[].获取()
                待释放 = 

        如果我们已经在共享存储的过程中,请等待
        等待它完成。
        如果 等待   :
            替换为 等待:
                通过

        尝试:
            返回 fn(self, *参数, **关键字参数)
        最后:
            如果我们在这里获得了存储锁并且完成了对该存储的工作
            现在我们可以释放它并释放条目。
            如果 to_free   :
                确保存储中的 cdata 没有改变,只有
                数据指针发生了变化。
                断言 self._cdata == to_free
                替换为 _共享内存锁:
                    共享内存映射[释放].释放()
                    删除 共享内存映射[解放]

    返回 包装器


[文档] 未类型化存储(火炬._C.存储基础, _StorageBase): 定义 __getitem__(self, *参数, **关键字参数): 如果 self.设备.类型 == 元数据: 抛出 不支持的操作异常("不适用于'meta'设备类型") 返回 超级().__getitem__(*参数, **关键字参数) @property 定义 是 cuda(self): 返回 self.设备.类型 == "cuda" @property 定义 是 hpu(self): 返回 self.设备.类型 == hpu @property 定义 文件名(self) -> 可选[str] 返回与此存储关联的文件名。 如果存储在 CPU 上并且通过 `:meth:`~torch.from_file()` 以 `shared` 为 `True` 创建,则文件名将是一个字符串。否则,此属性为 `None`。 meth:`~torch.from_file()` 以 `shared` 为 `True` 创建。否则,此属性为 `None`。 """ 返回 self._获取文件名()
[文档] @保护共享内存锁 def share_memory_(self, *args, **kwargs): """ 将存储移动到共享内存。 对于已经位于共享内存中的存储和 CUDA 存储,这是一个无操作。 共享内存中的存储无法调整大小。 共享内存中的存储无法调整大小。 注意,为了减轻像这样的问题 `this `_ 的影响 从多个线程中调用此函数是线程安全的。 但是,如果没有适当的同步,调用 self 上的任何其他函数则不是线程安全的。 请参阅 :doc:`/notes/multiprocessing` 获取更多详细信息。 .. 注意:: 当删除对共享内存中存储的所有引用时,相关的共享内存对象也将被删除。PyTorch 有一个特殊的清理过程来确保即使当前进程意外退出,也会发生这种情况。 对象将被删除。PyTorch 有一个特殊的清理过程来确保即使当前进程意外退出,也会发生这种情况。 即使当前进程意外退出,也会发生这种情况。 值得注意的是 :meth:`share_memory_` 和 :meth:`from_file` 与 `shared = True` 之间的区别 #. ``share_memory_`` 使用 `shm_open(3) `_ 创建 POSIX 共享内存对象,而 :meth:`from_file` 使用 `open(2) `_ 打开用户传递的文件名。 `open(2) `_ 打开用户传递的文件名。 #. 两者都使用 `mmap(2) 调用 `_ 并带有 ``MAP_SHARED`` 将文件/对象映射到当前虚拟地址空间 #. ``share_memory_`` 将在将其映射到对象后调用 ``shm_unlink(3)`` 以确保共享内存 对象在没有任何进程打开对象时被释放。`torch.from_file(shared=True)`不会解除链接。 该文件是持久的,并且将保留直到用户将其删除。 返回值: self """ return super().share_memory_(*args, **kwargs)
@_share_memory_lock_protected 定义
_share_fd_cpu_(self, *参数, **关键字参数): 返回 超级()._share_fd_cpu_(*参数, **关键字参数) @_share_memory_lock_protected 定义 _share_filename_cpu_(self, *参数, **关键字参数): 返回 超级()._share_filename_cpu_(*参数, **关键字参数)
定义 _load_from_bytes(b): 返回 火炬.加载(输入/输出.BytesIO(b), 仅权重=False) @functools.缓存 定义 _new_dtypes(): # 这些是序列化为 UntypedStorage 的 dtypes,与那些在 dtype_to_storage_type_map 返回 { 火炬.float8_e5m2, 火炬.float8_e4m3fn, 火炬.float8_e5m2fnuz, 火炬.float8_e4m3fnuz, 火炬.float8_e8m0fnu, 火炬.bits8, 火炬.bits16, 火炬.位 1x8, 火炬.位 2x4, 火炬.位 4x2, 火炬.complex32, 火炬.uint16, 火炬.uint32, 火炬.uint64, } @functools.缓存 定义 _dtype_to_storage_type_map(): # 我们不再向此映射中添加数据类型。此映射 # 仅用于与旧版本的 PyTorch 进行 BC/FC。从现在开始, # TypedStorage 的新数据类型不应翻译为遗留的 # Storage 类。相反,TypedStorage 的新数据类型 # 被序列化为与 torch.dtype 配对的 UntypedStorage 返回 { 火炬.double: "双精度存储", 火炬.float: "浮点存储", 火炬.: 半精度存储, 火炬.: 长存储, 火炬.int: 整数存储, 火炬.int16: 短存储, 火炬.int8: 字符存储, 火炬.uint8: 字节存储, 火炬.bool: "布尔存储", 火炬.bfloat16: "BFloat16 存储", 火炬.cdouble: "复杂数值存储", 火炬.cfloat: "复杂数值浮点存储", 火炬.qint8: QInt8Storage, 火炬.qint32: QInt32Storage, 火炬.quint8: "QUInt8Storage", 火炬.quint4x2: "QUInt4x2Storage", 火炬.quint2x4: "QUInt2x4 存储", } @functools.缓存 定义 _存储类型到数据类型映射(): 数据类型映射 = {val: 对于 , val dtype_to_storage_type_map().项目()} 返回 dtype_map 定义 _get_storage_from_sequence(sequence, 数据类型, 设备): 如果 dtype [ 火炬.quint8, 火炬.quint4x2, 火炬.quint2x4, 火炬.qint32, 火炬.qint8, ] interpret_dtypes = { 火炬.quint8: 火炬.uint8, 火炬.quint4x2: 火炬.uint8, 火炬.quint2x4: 火炬.uint8, 火炬.qint32: 火炬.int32, 火炬.qint8: 火炬.int8, } tmp_tensor = 火炬.张量( sequence, 数据类型=interpret_dtypes[数据类型] 设备=设备 ) 否则: tmp_tensor = 火炬.张量(sequence, 数据类型=数据类型, 设备=设备) 返回 tmp_tensor._typed_storage()._未指定存储 定义 _isint(x): 如果 HAS_NUMPY: 返回 isinstance(x, (int, numpy.整数)) 否则: 返回 isinstance(x, int) _always_warn_typed_storage_removal = 定义 _获取始终警告类型存储删除(): 返回 _始终警告类型存储删除 定义 _设置始终警告类型存储删除(always_warn): 全局 总是警告类型存储移除 断言 isinstance(总是警告, bool) 总是警告类型存储移除 = 总是警告 定义 警告:类型化存储移除(栈级别=2): 全局 总是警告已输入存储的移除 定义 是否是第一次(): 如果 有属性(警告:类型化存储移除, 已警告): 返回 真实 否则: 返回 警告:类型化存储移除.字典["已警告"] 如果 _总是警告获取_always_warn_typed_storage_removal() 或者 是否是第一次(): 消息 = ( "TypedStorage 已弃用。它将在未来被移除," 未类型化存储将是唯一的存储类。这应该只关乎 如果您直接使用存储。要访问 UntypedStorage 直接,使用 tensor.untyped_storage() 而不是 tensor.storage() ) 警告.警告(消息, 用户警告, 栈级别=栈级别 + 1) 警告:类型化存储移除.字典[已警告] = 真实 定义 重置警告_已输入存储删除(): 警告:类型化存储移除.字典[已警告] = 定义 从模块获取设备(模块: str): 最后部分 = 模块.右分割(“。”, 1)]-1] 如果 最后部分 [cuda, 火炬._C._get_privateuse1_backend_name(), hpu] 返回 最后部分 否则: 返回 cpu
[文档] 类型化存储: 是否稀疏: _布尔 = 用于在 torch.save 中,将 FakeTensor 设备存储到存储中时使用(metadata_only=True) _假设备: 可选[火炬.设备] = 数据类型: 火炬.dtype @property 定义 数据类型(self): 返回 self.dtype @property 定义 文件名(self) -> 可选[str] 返回与此存储关联的文件名,如果存储是从文件内存映射创建的。 或者 `None`,如果存储不是通过内存映射文件创建的。 返回 self.未类型化存储.文件名
[文档] def fill_(self, value): _warn_typed_storage_removal() self._setitem(slice(0, self._size()), value) return self
定义 __new__( cls, *参数, 包装存储
=, 数据类型=, 设备=, 内部=False, ): 如果 内部: 警告:类型化存储移除() 如果 cls == 火炬.存储._LegacyStorage: 抛出 运行时错误( "只有 _LegacyStorage 的子类才能实例化" ) 如果 cls == 类型化存储: 返回 超级().__new__(cls) 否则: 程序错误信息 = ( f"{cls}__new__ 方法接收了无效的组合 f"的参数。期望以下之一:"输入文本翻译为简体中文为:\n" " * 无参数"输入文本翻译为简体中文为:\n" " * (int 大小)"输入文本翻译为简体中文为:\n" " * (数据序列)"输入文本翻译为简体中文为:\n" " * (*, 未类型存储 wrap_storage)" ) 如果 设备 : 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n不能指定关键字参数 'device' ) 如果 dtype : 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n不能指定关键字参数 'dtype' ) 如果 包装存储 : 如果 长度(参数) > 1: 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n参数位置过多 ) 如果 ( 长度(参数) == 1 _isint(参数[0]) isinstance(参数[0] 集合.abc.序列) ): 抛出 类型错误( 参数错误信息 + f"输入文本翻译为简体中文为:\n参数类型未识别{类型(参数[0])}" ) 返回 类型化存储( *参数, 数据类型=cls.数据类型, 设备=获取模块中的设备(cls.__模块__), 内部=True, ) 否则: 如果 长度(参数) != 0: 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n使用 " " 时不应提供位置参数 "'wrap_storage'" ) 如果 isinstance(包装存储, 火炬.未类型化存储): 抛出 类型错误( 参数错误信息 + f"输入文本翻译为简体中文为:\n'参数 'wrap_storage' 必须是 UntypedStorage 类型,但得到了'{类型(包装存储)}" ) cls_device = _从模块获取设备(cls.__模块__) 如果 包装存储.设备.类型 != cls_device: 抛出 运行时错误( 参数错误信息 + f"输入文本翻译为简体中文为:\n'wrap_storage'的设备必须是{cls_device}" f", 但得到{包装存储.设备.类型}" ) 返回 类型化存储( *参数, 包装存储=包装存储, 数据类型=cls.数据类型, 内部=True, ) 定义 __init__( self, *参数, 设备=, 数据类型=, 包装存储=, 内部=False, ): 如果 内部: 警告:类型化存储移除() 程序错误信息 = ( "TypedStorage.__init__ 接收到了一个无效的参数组合 " "期望以下之一:"输入文本翻译为简体中文为:\n" " * (*, torch.device 设备, torch.dtype 数据类型)"输入文本翻译为简体中文为:\n" " * (int 大小, *, torch.device 设备, torch.dtype 数据类型)"输入文本翻译为简体中文为:\n" " * (Sequence 数据序列, *, torch.device 设备, torch.dtype 数据类型)"输入文本翻译为简体中文为:\n" " * (*, UntypedStorage 包装存储, torch.dtype 数据类型)" ) 如果 包装存储 : 如果 长度(参数) != 0: 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n使用 " " 时不应提供位置参数 "'包装存储'" ) 如果 dtype : 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n必须指定 'dtype' 参数 ) 如果 isinstance(数据类型, 火炬.数据类型): 抛出 类型错误( 参数错误信息 + f"输入文本翻译为简体中文为:\n'参数 'dtype' 必须是 torch.dtype 类型,而不是 '{类型(数据类型)}" ) 如果 设备 : 抛出 运行时错误( 参数错误信息 + "输入文本翻译为简体中文为:\n当 'wrap_storage' 被提供时,不应指定 'device' ) self.dtype = dtype 如果 isinstance(包装存储, 火炬.未类型化存储): 抛出 类型错误( 程序错误信息 + f"输入文本翻译为简体中文为:\n参数 'wrap_storage' 必须是 UntypedStorage 类型,但得到了{类型(包装存储)}" ) self._未指定存储 = wrap_storage 否则: self.dtype = 火炬.获取默认数据类型() 如果 dtype 否则 dtype 设备 = 火炬.设备(cpu 如果 设备 否则 设备) 如果 self.dtype [ 火炬.quint8, 火炬.quint4x2, 火炬.quint2x4, 火炬.qint32, 火炬.qint8, ] 如果 设备.类型 == cuda: 抛出 运行时错误( "无法创建具有量化数据类型的 CUDA 存储" ) 如果 长度(参数) == 0: self._未指定存储 = 火炬.未类型化存储(设备=设备) elif 长度(参数) == 1: 如果 _isint(参数[0)] self._未指定存储 = 火炬.未类型化存储( int(参数[0]) * self.元素大小(), 设备=设备 ) elif isinstance(参数[0] 集合.abc.序列): self._未指定存储 = 从序列获取存储( 参数[0] self.数据类型, 设备 ) 否则: 抛出 类型错误( 参数错误信息 + f"输入文本翻译为简体中文为:\n识别到的参数类型不正确:{类型(参数[0])}" ) 否则: 抛出 运行时错误(参数错误信息 + "输入文本翻译为简体中文为:\n位置参数过多") @property 定义 是否为 CUDA(self): 警告:类型化存储移除() 返回 self.未类型化存储.设备.类型 == "cuda" @property 定义 is_hpu(self): 警告:类型化存储移除() 返回 self.未类型化存储.设备.类型 == "hpu"
[文档] def 无类型(self): """返回内部 :class:`torch.UntypedStorage`。” _warn_typed_storage_removal() 返回 self._untyped_storage
定义
_new_wrapped_storage(self, 未类型化存储) -> 自身: 断言 类型(未类型化存储) == 火炬.未类型存储 如果 类型(self) == 类型化存储: 返回 角色( 自身, 类型化存储( 包装存储=未类型化存储, 数据类型=self.数据类型, 内部=真实 ), ) 否则: 返回 类型(self)(包装存储=未类型化存储) 定义 __len__(self): 警告:类型化存储移除() 返回 self.尺寸() 定义 可能包裹索引(self, 索引, 是停止=False): 如果 索引 : 如果 是停止: 返回 self.尺寸() 否则: 返回 0 否则: 如果 类型(索引) != int: 抛出 类型错误(f"无法索引一个"{类型(self)}{类型(索引)}") 如果 是停止: 如果 (索引 > self.尺寸()) 或者 (索引 < -self.尺寸()): 抛出 索引错误( f"索引"{索引}超出存储大小的范围{self.尺寸()}" ) 如果 索引 > 0: 返回 索引 否则: 返回 索引 % self.尺寸() 否则: 如果 (索引 self.尺寸()) 或者 (索引 < -self.尺寸()): 抛出 索引错误( f"索引"{索引}超出存储大小的范围{self.尺寸()}" ) 返回 索引 % self.尺寸() 定义 __setitem__(self, 索引, value): 警告:类型化存储移除() 返回 self._setitem(索引, value) 定义 _setitem(self, 索引, value): 如果 isinstance(索引, (int, 切片)): 抛出 运行时错误(f"无法索引"{类型(self)}{类型(索引)}") 如果 火炬.存储空间(value): 抛出 运行时错误(f"无法设置具有值类型的项"{类型(value)}") 如果 self.dtype [ 火炬.quint8, 火炬.五倍四乘二, 火炬.五倍二乘四, 火炬.整型 32 位, 火炬.整型 8 位, ] 解释数据类型 = { 火炬.quint8: 火炬.uint8, 火炬.五倍四乘二: 火炬.uint8, 火炬.五倍二乘四: 火炬.uint8, 火炬.整型 32 位: 火炬.整型 32 位, 火炬.qint8: 火炬.int8, } tmp_dtype = interpret_dtypes[self.数据类型] tmp_tensor = 火炬.张量( [] 数据类型=临时数据类型, 设备=self.未类型化存储.设备 ) 临时张量.集合( 类型化存储( 包装存储=self.未类型化存储, 数据类型=tmp_dtype, 内部=真实 ) ) 否则: tmp_tensor = 火炬.张量( [] 数据类型=self.数据类型, 设备=self.未类型化存储.设备 ).集合(self) tmp_tensor[索引] = 定义 __getitem__(self, 索引): 警告:类型化存储移除() 返回 self._getitem(索引) 定义 _getitem(self, 索引): 如果 self.未类型化存储.设备.类型 == 元数据: 抛出 不支持的操作异常("不适用于'meta'设备类型") # 在 TypedStorage 存在之前,使用切片进行索引 # 对于Storage 对象是可能的。然而,它会返回 # 一个存储视图,这在 TypedStorage 中实现起来会有些麻烦 因此它已被禁用 如果 isinstance(索引, 切片): 抛出 运行时错误( "切片仅在 UntypedStorage.__getitem__ 中受支持" ) elif isinstance(索引, int): 抛出 运行时错误(f"无法索引一个"{类型(self)}{类型(索引)}") 如果 self.dtype [ 火炬.quint8, 火炬.quint4x2, 火炬.quint2x4, 火炬.qint32, 火炬.qint8, ] interpret_dtypes = { 火炬.quint8: 火炬.uint8, 火炬.quint4x2: 火炬.uint8, 火炬.quint2x4: 火炬.uint8, 火炬.qint32: 火炬.int32, 火炬.qint8: 火炬.int8, } 返回 类型化存储( 包装存储=self.未类型化存储, 数据类型=interpret_dtypes[self.数据类型] 内部=True, )._getitem(索引) idx_wrapped = self.可能包裹索引(索引) from torch._subclasses.fake_tensor 导入 临时取消 fake 设置 替换为 临时取消 fake 设置(): tmp_tensor = 火炬.张量( [] 数据类型=self.数据类型, 设备=self.未类型化存储.设备 ).集合(self) 返回 tmp_tensor[idx_wrapped].项目()
[文档] def copy_(self, source: T, non_blocking: _Optional[bool] = None): _warn_typed_storage_removal() 如果 source 是 TypedStorage 类型 self._untyped_storage.copy_(source._untyped_storage, non_blocking) 否则: self._untyped_storage.copy_(source, non_blocking) 返回 self
[文档] def nbytes(self): _warn_typed_storage_removal() return self._nbytes()
# 仅限内部使用,避免弃用警告 定义 _nbytes(self): 返回
self.未类型化存储.字节数()
[文档] def 类型( self, 数据类型: _Optional[str] = None, non_blocking: 布尔类型 = False, ) -> 联合体[_StorageBase, TypedStorage, str]: _warn_typed_storage_removal() if dtype is None: legacy_class = self._get_legacy_storage_class() if legacy_class is not None: 返回 legacy_class.__module__ + "." + legacy_class.__name__ 返回 ".".join([self.__module__, type(self).__name__]) else: 返回 self._untyped_storage.type(dtype, non_blocking)
[文档] def cuda(self, device=None, non_blocking=False) -> Self: _warn_typed_storage_removal() if self.dtype in [ torch.quint8, torch.quint4x2, torch.quint2x4, torch.qint32, torch.qint8, ] raise RuntimeError("无法创建具有量化数据类型的 CUDA 存储") cuda_storage = self._untyped_storage.cuda(device, non_blocking) return self._new_wrapped_storage(cuda_storage)
[文档] def hpu(self, device=None, non_blocking=False) -> Self: _warn_typed_storage_removal() if self.dtype in [ torch.quint8, torch.quint4x2, torch.quint2x4, torch.qint32, torch.qint8, ] 抛出运行时错误("无法使用量化数据类型创建 HPU 存储") hpu_storage = self._untyped_storage.hpu(device, non_blocking) 返回 self._new_wrapped_storage(hpu_storage)
[文档] def to(self, *, device: DeviceLikeType, non_blocking: bool = False) -> Self: _warn_typed_storage_removal() if not isinstance(device, torch.device): device = torch.device(device) if self.dtype in [ torch.quint8, torch.quint4x2, torch.quint2x4, torch.qint32, torch.qint8, ] raise RuntimeError( 无法创建具有量化数据类型的 {device.type.upper()} 存储空间 ) to_storage = self._untyped_storage.to(device=device, non_blocking=non_blocking) 返回 self._new_wrapped_storage(to_storage)
[文档] def 元素大小(self): _warn_typed_storage_removal() return self._element_size()
仅内部使用,避免弃用警告 定义
元素大小(self): 返回 火炬._utils.元素大小(self.数据类型)
[文档] def get_device(self) -> _int: _warn_typed_storage_removal() return self._untyped_storage.get_device()
定义 __str__(self): 警告:类型化存储移除() info_str = ( f"[{火炬
.类型名(self)}(dtype={self.数据类型}," f"device={self.设备}) 尺寸为{长度(self)}]" ) 如果 self.设备.类型 == 元数据: 返回 "..."输入文本翻译为简体中文为:\n" + info_str 否则: data_str = " " + "\n ".连接(str(self[i]) 对于 i 范围(self.尺寸())) 返回 数据字符串 + "输入文本翻译为简体中文为:\n" + info_str 定义 __repr__(self): 警告:类型化存储移除() 返回 str(self) 定义 __iter__(self): 警告:类型化存储移除() 返回 迭代(self[i] 对于 i 范围(self.尺寸())) 定义 复制(self): 警告:类型化存储移除() 返回 self.新封装存储(复制.复制(self.未类型化存储)) 定义 深拷贝(self, 描述): 警告:类型化存储移除() 返回 self.深拷贝(描述) 仅限内部使用,避免弃用警告 定义 深拷贝(self, 描述): 返回 self._新封装存储(复制.深拷贝(self.未类型化存储, 描述)) 定义 __sizeof__(self): 警告:类型化存储移除() 返回 超级().__sizeof__() + self.字节数()
[文档] def 克隆(self): """返回此存储的副本。""" _warn_typed_storage_removal() return self._new_wrapped_storage(self._untyped_storage.clone())
[文档] def tolist(self): """返回包含此存储元素列表。""" _warn_typed_storage_removal() return list(self)
[文档] def cpu(self): """返回一个 CPU 副本,如果该存储已经在 CPU 上则不返回。""" _warn_typed_storage_removal() return self._new_wrapped_storage(self._untyped_storage.cpu())
[文档] def is_pinned(self, device: Union[str, torch.device] = "cuda"): r"""确定 CPU TypedStorage 是否已经固定在设备上。""" Args: 参数(str 或 torch.device):指定内存挂载的设备(默认:`'cuda'`)。 该参数不建议使用,并可能被弃用。 返回值: 一个布尔变量。 """ _warn_typed_storage_removal() 返回 self._untyped_storage.is_pinned(device)
[文档] def pin_memory(self, device: Union[str, torch.device] = "cuda"): 将 CPU TypedStorage 复制到固定内存中,如果它尚未固定。 参数: device (str 或 torch.device): 将内存固定在的设备(默认:``'cuda'``)。 此参数不建议使用,并可能被弃用。 返回: 固定的 CPU 存储。 """ _warn_typed_storage_removal() return self._new_wrapped_storage( self._untyped_storage.pin_memory(device=device) )
[文档] def share_memory_(self): """参见 :meth:`torch.UntypedStorage.share_memory_`""" _warn_typed_storage_removal() return self._share_memory_()
仅内部使用,避免弃用警告 定义
共享内存(self): self.未类型化存储.共享内存_() 返回 self 定义 _new_shared(self, 尺寸, *, 设备=): 在共享内存中创建具有相同数据类型的新存储。 如果 设备 : 设备 = cpu 设备 = 火炬.设备(设备) 未类型化存储 = 火炬.未类型化存储.新共享( 大小 * self.元素大小(), 设备=设备 ) 返回 类型化存储( 包装存储=未类型化存储, 数据类型=self.数据类型, 内部=真实 ) @property 定义 _cdata(self): 返回 self.未类型化存储._cdata @property 定义 设备(self): 警告:类型化存储移除() 返回 self.未类型化存储.设备
[文档] def size(self): _warn_typed_storage_removal() return self._size()
# 仅限内部使用,避免弃用警告 定义
尺寸(self): # NB: 不要通过 __len__ 间接,因为这需要 # 一个整数来返回 返回 self.未类型化存储.字节数() // self.元素大小()
[文档] def pickle_storage_type(self): _warn_typed_storage_removal() return self._pickle_storage_type()
# 仅限内部使用,避免弃用警告 定义
_pickle 存储类型(self): 尝试: 返回 _dtype_to_storage_type_map()[self.数据类型] 除了 KeyError as e: 抛出 键错误(f"dtype"{self.数据类型}未识别的类型) from e 定义 __reduce__(self): b = 输入/输出.BytesIO() 火炬.保存(self, b, 使用新的 zip 文件序列化=False) 返回 (_load_from_bytes, (b.获取值(),))
[文档] def data_ptr(self): _warn_typed_storage_removal() return self._data_ptr()
# 仅限内部使用,避免弃用警告 定义
_数据指针(self): 返回 self.未类型化存储.数据指针()
[文档] def resizable(self): _warn_typed_storage_removal() return self._untyped_storage.resizable()
[文档] def resize_(self, size): _warn_typed_storage_removal() self._resize_(size)
仅限内部使用,避免弃用警告 定义
_resize_()(self, 尺寸): self.未类型化存储.调整大小(大小 * self.元素大小()) @classmethod 定义 _释放弱引用(cls, *参数, **关键字参数): 返回 未类型化存储._释放弱引用(*参数, **关键字参数) 定义 弱引用(self, *参数, **关键字参数): 返回 self.未类型化存储.弱引用(*参数, **关键字参数)
[文档] @类方法 def from_buffer(cls, *args, **kwargs): _warn_typed_storage_removal() return cls._from_buffer(*args, **kwargs)
@classmethod 定义
从缓冲区读取(cls, *参数, 数据类型=, 设备=, **关键字参数): 如果 == 类型化存储: dtype = 火炬.获取默认数据类型() 如果 dtype 否则 dtype 设备 = 火炬.设备(cpu 如果 设备 否则 设备) 如果 设备.类型 != "cpu": 抛出 运行时错误( f"TypedStorage.from_buffer: 不适用于设备"{设备.类型}" ) 未类型化存储: 火炬.未类型存储 = 火炬.未类型化存储.from_buffer( *参数, 数据类型=数据类型, **kwargs ) 否则: 如果 dtype 或者 长度(参数) == 5: 抛出 运行时错误( "from_buffer: 'dtype' 只能在 " "UntypedStorage.from_buffer 和 TypedStorage.from_buffer" ) 如果 设备 : 抛出 运行时错误( "from_buffer: 'device' 只能在 " "UntypedStorage.from_buffer 和 TypedStorage.from_buffer" ) dtype = cls._dtype 未类型化存储 = 火炬.未类型化存储.from_buffer( *参数, 数据类型=数据类型, **kwargs ) 返回 类型化存储(包装存储=未类型化存储, 数据类型=数据类型, 内部=True) 定义 _到(self, 数据类型): 如果 isinstance(数据类型, 火炬.数据类型): 抛出 类型错误(f"参数 'dtype' 必须是 torch.dtype 类型,而不是 "{类型(数据类型)}") 存储 = ( 火炬.张量([], 数据类型=self.数据类型, 设备=self.设备) .集合(self) .(数据类型) ._typed_storage() ) 如果 存储.数据指针() == self.数据指针(): 存储 = 存储.克隆() 返回 存储
[文档] def double(self): 将此存储转换为双精度类型。 _warn_typed_storage_removal() return self._to(torch.double)
[文档] def float(self): 将此存储转换为浮点类型。 _warn_typed_storage_removal() return self._to(torch.float)
[文档] def half(self): 将此存储转换为半精度类型。 _warn_typed_storage_removal() return self._to(torch.half)
[文档] def long(self): 将此存储转换为长整型。 _warn_typed_storage_removal() return self._to(torch.long)
[文档] def int(self): 将此存储转换为 int 类型。 _warn_typed_storage_removal() return self._to(torch.int)
[文档] def short(self): 将此存储转换为 short 类型。 _warn_typed_storage_removal() return self._to(torch.short)
[文档] def char(self): 将此存储转换为 char 类型。 _warn_typed_storage_removal() return self._to(torch.int8)
[文档] def byte(self): 将此存储转换为字节类型。 _warn_typed_storage_removal() return self._to(torch.uint8)
[文档] def bool(self): 将此存储转换为布尔类型。 _warn_typed_storage_removal() return self._to(torch.bool)
[文档] def bfloat16(self): 将此存储转换为 bfloat16 类型。 _warn_typed_storage_removal() return self._to(torch.bfloat16)
[文档] def complex_double(self): 将此存储转换为复数双精度类型。 _warn_typed_storage_removal() return self._to(torch.cdouble)
[文档] def complex_float(self): 将此存储转换为复浮点类型。 _warn_typed_storage_removal() return self._to(torch.cfloat)
[文档] def float8_e5m2(self): """将此存储转换为 float8_e5m2 类型""" _warn_typed_storage_removal() return self._to(torch.float8_e5m2)
[文档] def float8_e4m3fn(self): 将此存储转换为 float8_e4m3fn 类型 _warn_typed_storage_removal() return self._to(torch.float8_e4m3fn)
[文档] def float8_e5m2fnuz(self): 将此存储转换为 float8_e5m2fnuz 类型 _warn_typed_storage_removal() return self._to(torch.float8_e5m2fnuz)
[文档] def float8_e4m3fnuz(self): 将此存储转换为 float8_e4m3fnuz 类型 _warn_typed_storage_removal() return self._to(torch.float8_e4m3fnuz)
[文档] @classmethod def from_file(cls, filename, shared, size): """from_file(filename, shared=False, size=0) -> Storage 创建一个由内存映射文件支持的 CPU 存储。 如果 `shared` 是 `True`,则所有进程之间共享内存。 所有更改都写入文件。如果 `shared` 为 `False`,则更改... 存储不影响文件。 `size` 是存储中元素的数量。如果 `shared` 为 `False`, 文件必须至少包含 ``size * sizeof(Type)`` 字节 (``Type`` 是存储类型)。如果 ``shared`` 为 ``True``,则如果需要将创建文件。 参数: filename (str): 映射的文件名 共享(布尔值):是否共享内存(是否传递了 ``MAP_SHARED`` 或 ``MAP_PRIVATE`` 给底层的 `mmap(2) 调用 `_) (底层 `mmap(2) 调用 `_) 大小(整型):存储中元素的数量 """ _warn_typed_storage_removal() 如果 cls 等于 TypedStorage 抛出 RuntimeError("from_file 只能在派生类中调用") untyped_storage = UntypedStorage.from_file( 文件名,共享,大小 * torch._utils._element_size(cls.dtype) ) storage = cls(wrap_storage=untyped_storage) 返回 storage
@classmethod 定义
已过期(cls, *参数, **关键字参数): 返回 未类型化存储.已过期(*参数, **关键字参数) 定义 _写入文件(self, *参数, **关键字参数): 返回 self.未类型化存储._写入文件(*参数, **关键字参数) 定义 从文件设置(self, *参数, **关键字参数): 返回 self.未类型化存储.从文件设置(*参数, **关键字参数) 定义 _设置_cdata(self, *参数, **关键字参数): 返回 self.未类型化存储._设置_cdata(*参数, **关键字参数) 定义 _共享_cuda_(self, *参数, **关键字参数): 返回 self.未类型化存储._共享_cuda_(*参数, **关键字参数)
[文档] def is_shared(self): _warn_typed_storage_removal() return self._is_shared()
# 仅限内部使用,避免弃用警告 定义
共享(self): 返回 self.未类型化存储.是否共享() @classmethod 定义 _new_shared_cuda(cls, *参数, **关键字参数): 返回 火炬.未类型化存储._new_shared_cuda(*参数, **关键字参数) 定义 _share_filename_cpu_(self, *参数, **关键字参数): ( 管理员处理, 存储处理, 尺寸, ) = self.未类型化存储._share_filename_cpu_(*参数, **关键字参数) 返回 管理员处理, 存储句柄, 大小 // self.元素大小() 定义 _共享解引用(self): self.未类型化存储._共享解引用() 返回 self @classmethod 定义 释放 IPC 计数器(cls, *参数, 设备=, **关键字参数): 返回 火炬.未类型化存储._发布 ipc 计数器_cuda(*参数, **关键字参数) 定义 _共享增加引用(self, *参数, **关键字参数): 返回 self.未类型化存储._共享增加引用(*参数, **关键字参数) 定义 _share_fd_cpu_(self, *参数, **关键字参数): fd, 大小 = self.未类型化存储._share_fd_cpu_(*参数, **关键字参数) 返回 fd, 大小 // self.元素大小() 定义 _get_legacy_storage_class(self): 如果 self.dtype _dtype_to_storage_type_map(): 返回 存储名称 = _dtype_to_storage_type_map()[self.数据类型] 如果 self.设备.类型 [ "cpu", cuda, hpu, 火炬._C._get_privateuse1_backend_name(), ] 返回 模块 = ( 火炬 如果 self.设备.类型 == cpu 否则 getattr(火炬, self.设备.类型) ) 尝试: 返回 getattr(模块, 存储名称) 除了 属性错误: 返回
类型化存储.类型.__文档__ = 类型.__文档__ 类型化存储.cuda.__文档__ = _StorageBase.cuda.__文档__ 类型化存储.hpu.__文档__ = _StorageBase.hpu.__文档__ 类型化存储..__文档__ = _到.__文档__ _LegacyStorageMeta(类型): 数据类型: 火炬.dtype 定义 __instancecheck__(cls, 实例): 如果 类型(实例) == 类型化存储: 类设备 = 获取模块中的设备(cls.__模块__) 返回 (类设备 == 实例.设备.类型) ( cls.dtype == 实例.dtype ) 返回 _LegacyStorage(类型化存储, 元类=_LegacyStorageMeta): @classmethod 定义 新共享(cls, 尺寸): 在共享内存中创建具有相同数据类型的新存储。 未类型化存储 = 火炬.未类型化存储.新共享(大小 * cls().元素大小()) 返回 cls(包装存储=未类型化存储) @classmethod 定义 发布 IPC 计数器(cls, *参数, **关键字参数): 返回 火炬.未类型化存储._发布 ipc 计数器_cuda(*参数, **关键字参数) @classmethod 定义 _new_shared_filename(cls, 经理, 对象, 尺寸): 字节数大小 = 大小 * 火炬._utils.元素大小(cls.数据类型) 返回 cls( 包装存储=火炬.未类型化存储._new_shared_filename_cpu( 经理, 对象, 字节数大小 ) ) 定义 _从 pickle 存储类型获取数据类型(Pickle 存储类型: str): 尝试: 返回 _存储类型到数据类型映射()[Pickle 存储类型] 除了 键错误 as e: 抛出 键错误( f'pickle 存储类型"{pickle_storage_type}"不被识别" ) from e

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源