类型#
TensorList#
TensorList 表示张量批次。TensorList 是 Pipeline.run()
, Pipeline.outputs()
或 Pipeline.share_outputs()
的返回值。
后续调用提到的函数(或 Pipeline.release_outputs()
)会使 TensorList(以及从中获得的任何 DALI 张量)无效,并向 DALI 指示内存可以用于其他用途。
TensorList 包装当前迭代的输出,并且仅在迭代期间有效。不允许在移动到下一次迭代后使用 TensorList。如果您希望保留数据,则需要在指示 DALI 您已释放数据之前复制它。
对于典型的用例,例如当 DALI 通过 深度学习框架插件 使用时,无需额外的内存簿记。
TensorListCPU#
- class nvidia.dali.tensors.TensorListCPU#
- __getitem__(self: TensorListCPU, i: int) TensorCPU #
返回列表中给定位置 i 的张量。
- __init__(*args, **kwargs)#
重载函数。
__init__(self: nvidia.dali.tensors.TensorListCPU, object: capsule, layout: str = ‘’) -> None
驻留在 CPU 内存中的张量列表。
- objectDLPack 对象
表示 TensorList 的 Python DLPack 对象
- layoutstr
数据布局
__init__(self: nvidia.dali.tensors.TensorListCPU, tl: nvidia.dali.tensors.TensorListCPU, layout: object = None) -> None
__init__(self: nvidia.dali.tensors.TensorListCPU, b: Buffer, layout: str = ‘’, is_pinned: bool = False) -> None
驻留在 CPU 内存中的张量列表。
- bobject
要包装到 TensorListCPU 对象中的缓冲区
- layoutstr
数据布局
- is_pinnedbool
如果提供的内存是页锁定的(pinned)
__init__(self: nvidia.dali.tensors.TensorListCPU, list_of_tensors: list, layout: str = ‘’) -> None
驻留在 CPU 内存中的张量列表。
- list_of_tensors[TensorCPU]
TensorCPU 对象的 Python 列表
- layoutstr
数据布局
- as_array(self: TensorListCPU) numpy.ndarray #
将 TensorList 作为 numpy 数组返回。TensorList 必须是密集的。
- as_cpu(self: TensorListCPU) TensorListCPU #
直通,因为它已经是 TensorListCPU 的实例。
- as_reshaped_tensor(self: TensorListCPU, arg0: list[int]) TensorCPU #
返回一个张量,该张量是将此 TensorList 转换为给定形状的视图。
仅当 TensorList 在内存中是连续的,并且请求的 Tensor 和 TensorList 的体积匹配时,才能调用此函数。
- as_tensor(self: TensorListCPU) TensorCPU #
返回一个张量,该张量是此 TensorList 的视图。
仅当 is_dense_tensor 返回 True 时,才能调用此函数。
- at(self: TensorListCPU, arg0: int) numpy.ndarray #
返回列表中给定位置的张量。
- copy_to_external(self: TensorListCPU, arg0: object) None #
将此 TensorList 的内容复制到驻留在 CPU 内存中的外部指针(类型为 ctypes.c_void_p)。
此函数由插件在内部使用,以与来自受支持的深度学习框架的张量进行接口。
- data_ptr(self: TensorListCPU) object #
返回 TensorList 第一个元素的地址。
- property dtype#
TensorListCPU 元素的数据类型。
- 类型:
- is_dense_tensor(self: TensorListCPU) bool #
检查此 TensorList 中的所有张量是否具有相同的形状(因此列表本身可以视为张量)。
例如,如果 TensorList 包含 N 个张量,每个张量的形状为 (H,W,C)(具有相同的 H、W 和 C 值),则该列表可以视为形状为 (N, H, W, C) 的张量。
- layout(self: TensorListCPU) str #
- reset(self: TensorListCPU) None #
- shape(self: TensorListCPU) list[tuple] #
张量列表的形状。
TensorListGPU#
- class nvidia.dali.tensors.TensorListGPU#
- __getitem__(self: TensorListGPU, i: int) TensorGPU #
返回列表中给定位置 i 的张量。
- __init__(*args, **kwargs)#
重载函数。
__init__(self: nvidia.dali.tensors.TensorListGPU, object: capsule, layout: str = ‘’) -> None
驻留在 GPU 内存中的张量列表。
- objectDLPack 对象
表示 TensorList 的 Python DLPack 对象
- layoutstr
数据布局
__init__(self: nvidia.dali.tensors.TensorListGPU, tl: nvidia.dali.tensors.TensorListGPU, layout: object = None) -> None
__init__(self: nvidia.dali.tensors.TensorListGPU, list_of_tensors: list, layout: str = ‘’) -> None
驻留在 GPU 内存中的张量列表。
- list_of_tensors[TensorGPU]
TensorGPU 对象的 Python 列表
- layoutstr
数据布局
__init__(self: nvidia.dali.tensors.TensorListGPU, object: object, layout: str = ‘’, device_id: int = -1) -> None
驻留在 GPU 内存中的张量列表。
- objectobject
实现 CUDA Array Interface 的 Python 对象
- layoutstr
数据布局
- device_idint
此张量所在的设备。如果未提供,则使用当前设备。
__init__(self: nvidia.dali.tensors.TensorListGPU) -> None
驻留在 GPU 内存中的张量列表。
- as_cpu(self: TensorListGPU) TensorListCPU #
返回作为此 TensorListGPU 副本的 TensorListCPU 对象。
- as_reshaped_tensor(self: TensorListGPU, arg0: list[int]) TensorGPU #
返回一个张量,该张量是将此 TensorList 转换为给定形状的视图。
仅当 TensorList 在内存中是连续的,并且请求的 Tensor 和 TensorList 的体积匹配时,才能调用此函数。
- as_tensor(self: TensorListGPU) TensorGPU #
返回一个张量,该张量是此 TensorList 的视图。
仅当 is_dense_tensor 返回 True 时,才能调用此函数。
- at(self: TensorListGPU, arg0: int) TensorGPU #
返回列表中给定位置的张量。已弃用,请使用 __getitem__()。
- copy_to_external(self: TensorListGPU, ptr: object, cuda_stream: object = None, non_blocking: bool = False, use_copy_kernel: bool = False) None #
将此 TensorList 的内容复制到驻留在 GPU 内存中的外部指针。
此函数由插件在内部使用,以与来自受支持的深度学习框架的张量进行接口。
- ptrctypes.c_void_p
复制的目标位置。
- cuda_streamctypes.c_void_p
在其上调度复制的 CUDA 流(如果未提供,则为默认流)。
- non_blockingbool
异步复制。
- data_ptr(self: TensorListGPU) object #
返回 TensorList 第一个元素的地址。
- device_id(self: TensorListGPU) int #
- property dtype#
TensorListGPU 元素的数据类型。
- 类型:
- is_dense_tensor(self: TensorListGPU) bool #
检查此 TensorList 中的所有张量是否具有相同的形状(因此列表本身可以视为张量)。
例如,如果 TensorList 包含 N 个张量,每个张量的形状为 (H,W,C)(具有相同的 H、W 和 C 值),则该列表可以视为形状为 (N, H, W, C) 的张量。
- layout(self: TensorListGPU) str #
- reset(self: TensorListGPU) None #
- shape(self: TensorListGPU) list[tuple] #
张量列表的形状。
Tensor#
TensorCPU#
- class nvidia.dali.tensors.TensorCPU#
表示驻留在主机内存中的 Tensor 的类。它可以用于访问
TensorListCPU
的单个样本,或用于包装旨在作为 DALI 输入传递的 CPU 内存。它与 Python Buffer Protocol、NumPy Array Interface 和 DLPack 兼容。
- dtype(self: TensorCPU) str #
表示 Tensor 的 NumPy 类型的字符串。
Warning
此方法已弃用。请使用
TensorCPU.dtype
代替。
- property __array_interface__#
返回 TensorCPU 的 Array Interface 表示。
- __dlpack__(self: TensorCPU, stream: Optional[int] = None, dl_device: Optional[tuple[nvidia.dali.backend_impl.DLDeviceType, int]] = None) capsule #
将 tensor 作为 DLPack capsule 公开。
Note
当不使用动态执行时(即 pipeline 参数 exec_dynamic 未设置或未评估为 True),pipeline 输出可能会在调用 release_outputs 后被 DALI 重用和覆盖。如果您想无限期地保留输出,请使用 exec_dynamic=True。
- streamint, None
调用者将用于访问缓冲区的 CUDA stream。如有必要,同步事件可能会插入到该 stream 中。特殊值
None
- 任何 stream;在主机上等待-1
- 完全不同步1
- 传统默认 stream2
- 传统每个线程 stream>2
- 转换为整数的 CUDA stream 句柄0
- 禁止值
- __dlpack_device__(self: TensorCPU) tuple[nvidia.dali.backend_impl.DLDeviceType, int] #
以 DLPack 格式返回设备类型和设备 ID。
- __init__(*args, **kwargs)#
重载函数。
__init__(self: nvidia.dali.tensors.TensorCPU, object: capsule, layout: str = ‘’) -> None
包装驻留在 CPU 内存中的 DLPack Tensor。
- objectDLPack 对象
Python DLPack 对象
- layoutstr
数据布局
__init__(self: nvidia.dali.tensors.TensorCPU, b: Buffer, layout: str = ‘’, is_pinned: bool = False) -> None
包装驻留在 CPU 内存中的 Tensor。
- bobject
要包装到 TensorListCPU 对象中的缓冲区
- layoutstr
数据布局
- is_pinnedbool
如果提供的内存是页锁定的(pinned)
- property dtype#
TensorCPU 元素的数据类型。
- 类型:
TensorGPU#
- class nvidia.dali.tensors.TensorGPU#
表示驻留在 GPU 内存中的 Tensor 的类。它可以用于访问
TensorListGPU
的单个样本,或用于包装旨在作为 DALI 输入传递的 GPU 内存。它与 CUDA Array Interface 和 DLPack 兼容。
- dtype(self: TensorCPU) str #
表示 Tensor 的 NumPy 类型的字符串。
Warning
此方法已弃用。请使用
TensorGPU.dtype
代替。
- property __cuda_array_interface__#
返回 TensorGPU 的 CUDA Array Interface (Version 2) 表示。
- __dlpack__(self: TensorGPU, stream: Optional[int] = None, dl_device: Optional[tuple[nvidia.dali.backend_impl.DLDeviceType, int]] = None) capsule #
将 tensor 作为 DLPack capsule 公开。
Note
当不使用动态执行时(即 pipeline 参数 exec_dynamic 未设置或未评估为 True),pipeline 输出可能会在调用 release_outputs 后被 DALI 重用和覆盖。如果您想无限期地保留输出,请使用 exec_dynamic=True。
- streamint, None
调用者将用于访问缓冲区的 CUDA stream。如有必要,同步事件可能会插入到该 stream 中。特殊值
None
- 任何 stream;在主机上等待-1
- 完全不同步1
- 传统默认 stream2
- 传统每个线程 stream>2
- 转换为整数的 CUDA stream 句柄0
- 禁止值
- __dlpack_device__(self: TensorGPU) tuple[nvidia.dali.backend_impl.DLDeviceType, int] #
以 DLPack 格式返回设备类型和设备 ID。
- __init__(*args, **kwargs)#
重载函数。
__init__(self: nvidia.dali.tensors.TensorGPU, object: capsule, layout: str = ‘’) -> None
包装驻留在 GPU 内存中的 DLPack Tensor。
- objectDLPack 对象
Python DLPack 对象
- layoutstr
数据布局
__init__(self: nvidia.dali.tensors.TensorGPU, object: object, layout: str = ‘’, device_id: int = -1) -> None
包装驻留在 GPU 内存中,并实现 CUDA Array Interface 的 Tensor。
- objectobject
实现 CUDA Array Interface 的 Python 对象
- layoutstr
数据布局
- device_id: int
此张量所在的设备。如果未提供,则使用当前设备。
- copy_to_external(self: TensorGPU, ptr: object, cuda_stream: object = None, non_blocking: bool = False, use_copy_kernel: bool = False) None #
复制到 GPU 内存中的外部指针。
- ptrctypes.c_void_p
复制的目标位置。
- cuda_streamctypes.c_void_p
在其上调度复制的 CUDA 流(如果未提供,则为默认流)。
- non_blockingbool
异步复制。
- property dtype#
TensorGPU 元素的数据类型。
- 类型:
- squeeze(self: TensorGPU, dim: object = None) bool #
从 Tensor 的形状中移除大小为 1 的维度条目,如果形状已更改,则返回 true,如果形状保持不变,则返回 false。
- dimint
如果指定,则表示要压缩的单维度轴。
- property stream#
数据布局#
Tensor 布局字符串格式#
DALI 使用短字符串(Python str 类型)来描述 tensor 中的数据布局,方法是将一个字符分配给 tensor 形状中存在的每个维度。例如,shape=(400, 300, 3),layout="HWC" 表示数据是具有 3 个交错通道、400 像素高度和 300 像素宽度的图像。
对于 TensorList,列表中的索引不被视为维度(批次中样本的数量),并且不包含在布局中。
解释 Tensor 布局字符串#
DALI 允许您处理不同性质的数据(例如,图像、视频、音频、体积图像)以及不同的格式(例如,平面配置与交错通道中的 RGB 图像)。通常,DALI 算子可以处理不同的数据格式,并将根据输入的性质以不同的方式运行。
虽然我们不限制 tensor 布局中使用的有效字符,但 DALI 算子假定某种命名约定。以下是常用维度名称的列表
名称 |
含义 |
---|---|
H |
高度 |
W |
宽度 |
C |
通道 |
F |
帧 |
D |
深度 |
以下是一些常用布局的示例
布局 |
描述 |
---|---|
HWC |
图像(交错) |
CHW |
图像(平面) |
DHWC |
体积图像(交错) |
CDHW |
体积图像(平面) |
FHWC |
视频 |
例如,接收具有交错布局(“HWC”)的输入的裁剪操作(Crop 算子)将推断它应该在前两个维度 (H, W) 上进行裁剪。另一方面,如果输入具有平面布局(“CHW”),则裁剪将发生在第二和第三维度上。
某些算子本质上会修改数据的布局(例如 Transpose),而另一些算子会将相同的数据布局传播到输出(例如 Normalize)。
每个算子的布局限制(如果有)可通过算子的文档获得。
值得注意的是,当使用 ExternalSource API 时,用户有责任显式填写布局信息。
常量包装器#
Constant#
- nvidia.dali.types.Constant(value, dtype=None, shape=None, layout=None, device=None, **kwargs)#
包装一个常量值,该常量值随后可在
nvidia.dali.Pipeline.define_graph()
pipeline 定义步骤中使用。如果
value
参数是标量,并且未提供shape
、layout
或device
,则该函数将返回一个ScalarConstant
包装器对象,该对象在使用 数学表达式 时会收到特殊的优化处理。否则,该函数将创建一个 dali.ops.Constant 节点,该节点生成一批常量 tensor。
- 参数:
value¶ (bool, int, float, DALIDataType DALIImageType, DALIInterpType,) – 一个 list 或 tuple 或 numpy.ndarray 要包装的常量值。如果它是标量,则可以在数学表达式中用作标量值。否则,它将生成一个常量 tensor 节点(可选地根据
shape
参数调整形状)。如果此参数是 numpy 数组、PyTorch tensor 或 MXNet 数组,则shape
和dtype
的值将分别默认为 value.shape 和 value.dtype。dtype¶ (DALIDataType, 可选) – 常量的目标类型。
shape¶ (list 或 tuple of int, 可选) – 请求的输出形状。如果
value
是标量,则会广播它以填充请求的形状。否则,value
中的元素数量必须与形状的体积匹配。layout¶ (string, 可选) – 描述常量 tensor 布局的字符串,例如 “HWC”
device¶ (string, 可选, "cpu" 或 "gpu") – 用于放置常量 tensor 的设备。如果指定,则强制该值成为给定设备上的常量 tensor 节点,而与
value
类型或shape
无关。**kwargs¶ (附加关键字参数) – 如果存在,则强制常量成为 Constant tensor 节点,并且参数将传递给 dali.ops.Constant 算子
- class nvidia.dali.types.ScalarConstant(value, dtype=None)#
Note
不应直接实例化此类;使用带有适当参数的
Constant()
函数来创建此类的实例。可用于 DALI 数学表达式 的常量值的包装器,并逐元素应用于 DALI 算子的结果,这些算子表示
nvidia.dali.Pipeline.define_graph()
步骤中的 Tensor。ScalarConstant 指示应将该值视为相对于类型提升的哪种类型。从 python 传递到后端的实际值对于整数值将为 int32,对于浮点值将为 float32。Python 内置类型 bool、int 和 float 将被标记为分别指示
nvidia.dali.types.DALIDataType.BOOL
、nvidia.dali.types.DALIDataType.INT32
和nvidia.dali.types.DALIDataType.FLOAT
。- 参数:
value¶ (bool 或 int 或 float) – 要传递给 DALI 表达式的常量值。
dtype¶ (DALIDataType, optional) – 用于类型提升的常量的目标类型。
Enums#
DALIDataType#
- class nvidia.dali.types.DALIDataType#
表示张量数据类型的对象。
- NO_TYPE#
- UINT8#
- UINT16#
- UINT32#
- UINT64#
- INT8#
- INT16#
- INT32#
- INT64#
- FLOAT16#
- FLOAT#
- FLOAT64#
- BOOL#
- STRING#
- FEATURE#
- IMAGE_TYPE#
- DATA_TYPE#
- INTERP_TYPE#
- TENSOR_LAYOUT#
- PYTHON_OBJECT#
- nvidia.dali.types.to_numpy_type(dali_type)#
将 DALIDataType 转换为 NumPy 类型
- 参数:
dali_type¶ (DALIDataType) – 要转换的输入类型
DALIIterpType#
DALIImageType#
SampleInfo#
- class nvidia.dali.types.SampleInfo(idx_in_epoch, idx_in_batch, iteration, epoch_idx)#
描述从
nvidia.dali.fn.external_source()
请求的样本的索引- 变量:
idx_in_epoch – epoch 内基于 0 的样本索引
idx_in_batch – batch 内基于 0 的样本索引
iteration – epoch 内当前 batch 的编号
epoch_idx – 当前 epoch 的编号
BatchInfo#
- class nvidia.dali.types.BatchInfo(iteration, epoch_idx)#
描述从
nvidia.dali.fn.external_source()
请求的 batch- 变量:
iteration – epoch 内当前 batch 的编号
epoch_idx – 当前 epoch 的编号
TensorLayout#
- class nvidia.dali.types.TensorLayout#