torch.utils.dlpack 的源代码
from
打字
导入
任何
导入
火炬
导入
枚举
from torch._C 导入
从 dlpack 转换
from torch._C 导入
转换为 dlpack
是
转换为 dlpack
类
DL 设备类型(
枚举.
整数枚举):
# DLPack 规范中的枚举(aten/src/ATen/dlpack.h)
kDLCPU = 1,
kDLGPU = 2,
kDLCPUPinned = 3,
kDLOpenCL = 4,
kDLVulkan = 7,
kDLMetal = 8,
kDLVPI = 9,
kDLROCM = 10,
kDL 扩展设备 = 12,
kDL 单 API = 14,
火把._C.
_添加文档字符串(
转换为 dlpack, r
to_dlpack(tensor) -> PyCapsule
返回一个不可见对象(一个“DLPack 胶囊”),表示张量。
.. 注意:
``to_dlpack`` 是一个遗留的 DLPack 接口。它返回的胶囊
不能在 Python 中用于任何其他目的,除了将其用作输入到
`from_dlpack`。DLPack 的更地道用法是调用
`直接在张量对象上使用 `from_dlpack` - 当这种情况工作时`
对象具有一个 `__dlpack__` 方法,PyTorch 和大多数其他
库确实有了。
.. 警告::
使用 `to_dlpack` 产生的胶囊每次只能调用一次 `from_dlpack`。
当胶囊被多次消费时的行为是未定义的。
参数:
tensor:要导出的张量
DLPack 胶囊共享张量的内存。
""")
# TODO: 添加一个 typing.Protocol 以使 Mypy 能够知道只有接受
# __dlpack__ 和 __dlpack_device__ 方法的对象
[文档]
定义
从 dlpack 转换(
扩展张量:
任何) -> 'torch.Tensor':
from_dlpack(ext_tensor) -> Tensor
将外部库中的张量转换为 ``torch.Tensor``。
返回的 PyTorch 张量将与输入张量共享内存
(可能来自另一个库)。请注意,就地操作
因此也会影响输入张量的数据。这可能会导致
预期之外的问题(例如,其他库可能有只读标志或
不可变的数据结构),因此用户只有在确定
这没有问题的情况下才应该这样做。
参数:
ext_tensor(具有 ``__dlpack__`` 属性的对象或 DLPack 封装):
要转换的张量或 DLPack 胶囊。
如果 `ext_tensor` 是一个张量(或 ndarray)对象,它必须支持
`__dlpack__` 协议(即拥有一个 `ext_tensor.__dlpack__`)
method)。否则 ``ext_tensor`` 可能是一个 DLPack 胶囊。
一个不透明的 `PyCapsule` 实例,通常由 `to_dlpack` 函数或方法生成。
`to_dlpack` 函数或方法。
示例:
>>> 导入 torch.utils.dlpack
>>> t = torch.arange(4)
直接转换张量(在 PyTorch >= 1.10 中受支持)
>>> t2 = torch.from_dlpack(t)
>>> t2[:2] = -1 # 显示内存是共享的
>>> t2
tensor([-1, -1, 2, 3])
>>> t
tensor([-1, -1, 2, 3])
# 旧式 DLPack 使用,带有中间胶囊对象
>>> capsule = torch.utils.dlpack.to_dlpack(t)
>>> capsule
>>> t3 = torch.from_dlpack(capsule)
>>> t3
tensor([-1, -1, 2, 3])
>>> t3[0] = -9 # 现在我们正在 3 个张量之间共享内存
>>> t3
tensor([-9, -1, 2, 3])
>>> t2
tensor([-9, -1, 2, 3])
>>> t
tensor([-9, -1, 2, 3])
"文档"
如果
有属性(
扩展 tensor, '__dlpack__'):
设备 =
扩展 tensor.__dlpack_device__()
设备是 CUDA 或 ROCm,我们需要传递当前
流
如果
设备[0]
在 (
DL 设备类型.kDLGPU,
DL 设备类型.kDLROCM):
流 =
火把.cuda.current_stream(f
cuda:{
设备[1]}')
# cuda_stream 是流指针,它是一个公共
# 属性,但它并未被文档化
# 数组 API 指定默认的遗留流必须传递
# 使用 CUDA 的值为 1
# https://data-apis.org/array-api/latest/API_specification/array_object.html?dlpack-self-stream-none#dlpack-self-stream-none
is_cuda = 设备[0] ==
DL 设备类型.kDLGPU
# 由于 PyTorch 默认不使用 PTDS,我们直接传递
# 旧版流
stream_ptr = 1 如果 is_cuda
并且
流.cuda_stream == 0
否则
流.cuda_stream
dlpack = 扩展张量.__dlpack__(
流=
流指针)
否则:
dlpack = 扩展张量.__dlpack__()
否则:
仅旧版本称为转换器
dlpack = ext_tensor
返回 _from_dlpack(dlpack)