LazyStackedTensorDict¶
- class tensordict.LazyStackedTensorDict(*tensordicts: T, stack_dim: int = 0, hook_out: callable | None = None, hook_in: callable | None = None, batch_size: Sequence[int] | None = None, device: torch.device | None = None, names: Sequence[str] | None = None, stack_dim_name: str | None = None, strict_shape: bool = False)¶
TensorDict 的延迟堆叠。
将 TensorDict 堆叠在一起时,默认行为是将它们放入一个未实例化的堆栈中。这允许在堆栈中使用 tensordict 无缝地执行操作,这些操作会影响原始 tensordict。
- 参数::
示例
>>> from tensordict import TensorDict >>> import torch >>> tds = [TensorDict({'a': torch.randn(3, 4)}, batch_size=[3]) ... for _ in range(10)] >>> td_stack = torch.stack(tds, -1) >>> print(td_stack.shape) torch.Size([3, 10]) >>> print(td_stack.get("a").shape) torch.Size([3, 10, 4]) >>> print(td_stack[:, 0] is tds[0]) True
- abs() T ¶
计算 TensorDict 中每个元素的绝对值。
- abs_() T ¶
就地计算 TensorDict 中每个元素的绝对值。
- acos() T ¶
计算 TensorDict 中每个元素的
acos()
值。
- acos_() T ¶
就地计算 TensorDict 中每个元素的
acos()
值。
- add(other: TensorDictBase | torch.Tensor, *, alpha: float | None = None, default: str | CompatibleType | None = None) TensorDictBase ¶
将
other
(乘以alpha
)加到self
上。\[\text{{out}}_i = \text{{input}}_i + \text{{alpha}} \times \text{{other}}_i\]- 参数::
other (TensorDictBase 或 torch.Tensor) – 要添加到
self
的张量或 TensorDict。- 关键字参数:
alpha (数字, 可选) –
other
的乘数。default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- add_(other: TensorDictBase | float, *, alpha: float | None = None)¶
add()
的就地版本。注意
就地
add
不支持default
关键字参数。
- addcdiv(other1: TensorDictBase | torch.Tensor, other2: TensorDictBase | torch.Tensor, value: float | None = 1)¶
对
other1
除以other2
进行元素级运算,将结果乘以标量value
并将其添加到self
中。\[\text{out}_i = \text{input}_i + \text{value} \times \frac{\text{tensor1}_i}{\text{tensor2}_i}\]self
、other1
和other2
的元素的形状必须是可广播的。对于类型为 FloatTensor 或 DoubleTensor 的输入,
value
必须是实数,否则是整数。- 参数::
other1 (TensorDict 或 张量) – 分子 tensordict(或张量)
tensor2 (TensorDict 或 张量) – 分母 tensordict(或张量)
- 关键字参数:
value (数字, 可选) – \(\text{tensor1} / \text{tensor2}\) 的乘数
- addcmul(other1, other2, *, value: float | None = 1)¶
对
other1
乘以other2
进行元素级运算,将结果乘以标量value
并将其添加到self
中。\[\text{out}_i = \text{input}_i + \text{value} \times \text{other1}_i \times \text{other2}_i\]self
、other1
和other2
的形状必须是可广播的。对于类型为 FloatTensor 或 DoubleTensor 的输入,
value
必须是实数,否则是整数。- 参数::
other1 (TensorDict 或 张量) – 要相乘的 tensordict 或张量
other2 (TensorDict 或 张量) – 要相乘的 tensordict 或张量
- 关键字参数:
value (数字, 可选) – \(other1 .* other2\) 的乘数
- all(dim: int = None) bool | TensorDictBase ¶
检查 tensordict 中的所有值是否为 True/非空。
- 参数::
dim (int, 可选) – 如果为
None
,则返回一个布尔值,指示所有张量是否返回 tensor.all() == True。如果为整数,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 all。
- any(dim: int = None) bool | TensorDictBase ¶
检查 tensordict 中的任何值是否为 True/非空。
- 参数::
dim (int, 可选) – 如果为
None
,则返回一个布尔值,指示所有张量是否返回 tensor.any() == True。如果为整数,则仅当此维度与 tensordict 形状兼容时,才对指定维度调用 all。
- append(tensordict: T) None ¶
将一个 TensorDict 追加到堆栈上。
类似于 list.append。追加的 TensorDict 必须具有兼容的 batch_size 和设备。append 操作是就地操作,不会返回任何内容。
- 参数::
tensordict (TensorDictBase) – 要追加到堆栈上的 TensorDict。
- apply(fn: Callable, *others: T, batch_size: Sequence[int] | None = None, device: torch.device | None = _NoDefault.ZERO, names: Sequence[str] | None = _NoDefault.ZERO, inplace: bool = False, default: Any = _NoDefault.ZERO, filter_empty: bool | None = None, propagate_lock: bool = False, call_on_nested: bool = False, out: TensorDictBase | None = None, **constructor_kwargs) T | None ¶
将一个可调用对象应用于 tensordict 中存储的所有值,并将它们设置在一个新的 tensordict 中。
可调用对象签名必须为
Callable[Tuple[Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]
。- 参数::
fn (Callable) – 要应用于 tensordict 中张量的函数。
*others (TensorDictBase 实例, 可选) – 如果提供,这些 tensordict 实例应具有与 self 匹配的结构。
fn
参数应接收与 tensordict 数量相同的无名输入,包括 self。如果其他 tensordict 具有缺失的条目,可以通过default
关键字参数传递默认值。
- 关键字参数:
batch_size (int 序列, 可选) – 如果提供,则生成的 TensorDict 将具有所需的 batch_size。
batch_size
参数应与转换后的 batch_size 匹配。这是一个仅限关键字的参数。device (torch.device, 可选) – 生成的设备(如果有)。
names (str 列表, 可选) – 新的维度名称,如果 batch_size 被修改。
inplace (bool, 可选) – 如果为 True,则更改将就地进行。默认值为 False。这是一个仅限关键字的参数。
default (Any, 可选) – 其他 tensordict 中缺失条目的默认值。如果没有提供,则缺失的条目将引发 KeyError。
filter_empty (bool, 可选) – 如果
True
,则将过滤掉空 tensordict。这还带来了更低的计算成本,因为不会创建和销毁空数据结构。非张量数据被视为叶子,因此即使未被函数触碰,也会保留在 tensordict 中。默认值为False
,以保持向后兼容性。propagate_lock (bool, 可选) – 如果
True
,则锁定 tensordict 将产生另一个锁定 tensordict。默认值为False
。call_on_nested (bool, 可选) –
如果
True
,则该函数将在第一级张量和容器(TensorDict 或张量类)上调用。在这种情况下,func
负责将它的调用传播到嵌套级别。这允许在将调用传播到嵌套 tensordict 时实现细粒度的行为。如果False
,则该函数只会在叶子节点上调用,并且apply
将负责将该函数分派到所有叶子节点。>>> td = TensorDict({"a": {"b": [0.0, 1.0]}, "c": [1.0, 2.0]}) >>> def mean_tensor_only(val): ... if is_tensor_collection(val): ... raise RuntimeError("Unexpected!") ... return val.mean() >>> td_mean = td.apply(mean_tensor_only) >>> def mean_any(val): ... if is_tensor_collection(val): ... # Recurse ... return val.apply(mean_any, call_on_nested=True) ... return val.mean() >>> td_mean = td.apply(mean_any, call_on_nested=True)
out (TensorDictBase, 可选) –
要写入结果的 tensordict。这可以用来避免创建一个新的 tensordict。
>>> td = TensorDict({"a": 0}) >>> td.apply(lambda x: x+1, out=td) >>> assert (td==1).all()
警告
如果对 tensordict 执行的操作需要访问多个键才能进行单个计算,则提供等于
self
的out
参数会导致操作静默地提供错误的结果。例如>>> td = TensorDict({"a": 1, "b": 1}) >>> td.apply(lambda x: x+td["a"])["b"] # Right! tensor(2) >>> td.apply(lambda x: x+td["a"], out=td)["b"] # Wrong! tensor(3)
**constructor_kwargs – 要传递给 TensorDict 构造函数的其他关键字参数。
- 返回:
一个包含经过转换的张量的新的 tensordict。
示例
>>> td = TensorDict({ ... "a": -torch.ones(3), ... "b": {"c": torch.ones(3)}}, ... batch_size=[3]) >>> td_1 = td.apply(lambda x: x+1) >>> assert (td_1["a"] == 0).all() >>> assert (td_1["b", "c"] == 2).all() >>> td_2 = td.apply(lambda x, y: x+y, td) >>> assert (td_2["a"] == -2).all() >>> assert (td_2["b", "c"] == 2).all()
注意
如果函数返回
None
,则将忽略该条目。这可用于筛选 tensordict 中的数据。>>> td = TensorDict({"1": 1, "2": 2, "b": {"2": 2, "1": 1}}, []) >>> def filter(tensor): ... if tensor == 1: ... return tensor >>> td.apply(filter) TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
注意
apply 方法将返回一个
TensorDict
实例,无论输入类型如何。要保持相同的类型,可以执行>>> out = td.clone(False).update(td.apply(...))
- apply_(fn: Callable, *others, **kwargs)¶
将一个可调用对象应用于 tensordict 中存储的所有值,并将它们就地重写。
- 参数::
fn (Callable) – 要应用于 tensordict 中张量的函数。
*others (TensorDictBase 序列, 可选) – 要使用的其他 tensordict。
关键字参数:请参见
apply()
。- 返回:
self 或应用了函数的 self 的副本。
- asin() T ¶
计算 TensorDict 中每个元素的
asin()
值。
- asin_() T ¶
就地计算 TensorDict 中每个元素的
asin()
值。
- atan() T ¶
计算 TensorDict 中每个元素的
atan()
值。
- atan_() T ¶
在 TensorDict 中就地计算每个元素的
atan()
值。
- auto_batch_size_(batch_dims: int | None = None) T ¶
设置 tensordict 的最大批次大小,最多可达可选的 batch_dims。
- 参数::
batch_dims (int, optional) – 如果提供,批次大小将至多为
batch_dims
长度。- 返回:
self
示例
>>> from tensordict import TensorDict >>> import torch >>> td = TensorDict({"a": torch.randn(3, 4, 5), "b": {"c": torch.randn(3, 4, 6)}}, batch_size=[]) >>> td.auto_batch_size_() >>> print(td.batch_size) torch.Size([3, 4]) >>> td.auto_batch_size_(batch_dims=1) >>> print(td.batch_size) torch.Size([3])
- property batch_size: Size¶
TensorDict 的形状(或批次大小)。
tensordict 的形状对应于它所包含的张量的共同前
N
维度,其中N
是一个任意数。批次大小与“特征大小”形成对比,特征大小表示张量的语义相关形状。例如,一批视频可能具有形状[B, T, C, W, H]
,其中[B, T]
是批次大小(批次和时间维度),而[C, W, H]
是特征维度(通道和空间维度)。用户在初始化时控制
TensorDict
的形状(即,它不是从张量形状推断出来的)。如果新大小与 TensorDict 内容兼容,则可以动态地编辑
batch_size
。例如,始终允许将批次大小设置为空值。- 返回:
表示 TensorDict 批次大小的
Size
对象。
示例
>>> data = TensorDict({ ... "key 0": torch.randn(3, 4), ... "key 1": torch.randn(3, 5), ... "nested": TensorDict({"key 0": torch.randn(3, 4)}, batch_size=[3, 4])}, ... batch_size=[3]) >>> data.batch_size = () # resets the batch-size to an empty value
- bfloat16()¶
将所有张量转换为
torch.bfloat16
。
- bool()¶
将所有张量转换为
torch.bool
。
- classmethod cat(input, dim=0, *, out=None)¶
将 tensordict 沿给定维度连接成单个 tensordict。
此调用等效于调用
torch.cat()
,但与 torch.compile 兼容。
- ceil() T ¶
计算 TensorDict 中每个元素的
ceil()
值。
- ceil_() T ¶
在 TensorDict 中就地计算每个元素的
ceil()
值。
- chunk(chunks: int, dim: int = 0) tuple[TensorDictBase, ...] ¶
如果可能,将 tensordict 拆分成指定数量的块。
每个块都是输入 tensordict 的视图。
示例
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 4, 2), ... }, batch_size=[3, 4]) >>> td0, td1 = td.chunk(dim=-1, chunks=2) >>> td0['x'] tensor([[[ 0, 1], [ 2, 3]], [[ 8, 9], [10, 11]], [[16, 17], [18, 19]]])
- clamp_max(other: TensorDictBase | torch.Tensor, *, default: str | CompatibleType | None = None) T ¶
如果
self
的元素大于该值,则将其钳位到other
。- 参数::
other (TensorDict or Tensor) – 另一个输入 tensordict 或张量。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- clamp_max_(other: TensorDictBase | torch.Tensor) T ¶
clamp_max()
的就地版本。注意
就地
clamp_max
不支持default
关键字参数。
- clamp_min(other: TensorDictBase | torch.Tensor, default: str | CompatibleType | None = None) T ¶
如果
self
的元素小于该值,则将其钳制到other
。- 参数::
other (TensorDict or Tensor) – 另一个输入 tensordict 或张量。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- clamp_min_(other: TensorDictBase | torch.Tensor) T ¶
clamp_min()
的就地版本。注意
就地
clamp_min
不支持default
关键字参数。
- clear() T ¶
擦除 tensordict 的内容。
- clear_device_() T ¶
清除 tensordict 的设备。
返回值:self
- clone(recurse: bool = True, **kwargs) T ¶
将 TensorDictBase 子类实例克隆到相同类型的新的 TensorDictBase 子类上。
要从任何其他 TensorDictBase 子类型创建 TensorDict 实例,请改用
to_tensordict()
方法。- 参数::
recurse (bool, optional) – 如果为
True
,则 TensorDict 中包含的每个张量也会被复制。否则,只会复制 TensorDict 树结构。默认为True
。
注意
与许多其他操作(逐点算术、形状操作等)不同的是,
clone
不会继承原始锁定属性。这种设计选择是为了便于创建克隆进行修改,这是最常见的用法。
- complex128()¶
将所有张量转换为
torch.complex128
。
- complex32()¶
将所有张量转换为
torch.complex32
。
- complex64()¶
将所有张量转换为
torch.complex64
。
- consolidate(filename: Path | str | None = None, *, num_threads=0, device: torch.device | None = None, non_blocking: bool = False, inplace: bool = False, return_early: bool = False, use_buffer: bool = False, share_memory: bool = False, pin_memory: bool = False, metadata: bool = False) None ¶
将 tensordict 内容合并到单个存储中,以实现快速序列化。
- 参数::
filename (Path, optional) – 用于内存映射张量的可选文件路径,用作 tensordict 的存储。
- 关键字参数:
num_threads (integer, optional) – 用于填充存储的线程数。
device (torch.device, optional) – 存储必须实例化的可选设备。
non_blocking (bool, optional) – 传递给
copy_()
的non_blocking
参数。inplace (bool, optional) – 如果为
True
,则结果 tensordict 与self
相同,但具有更新的值。默认为False
。return_early (bool, optional) – 如果为
True
且num_threads>0
,则该方法将返回 tensordict 的一个未来。可以使用 future.result() 查询结果 tensordict。use_buffer (bool, optional) – 如果为
True
并且传递了文件名,则将在共享内存中创建一个中间本地缓冲区,并将数据作为最后一步复制到存储位置。这可能比直接写入遥远的物理内存(例如,NFS)更快。默认为False
。share_memory (bool, optional) – 如果为
True
,则存储将放置在共享内存中。默认为False
。pin_memory (bool, optional) – 合并后的数据是否应放置在固定内存中。默认为
False
。元数据 (bool, 可选) – 如果为
True
,元数据将与公共存储一起存储。如果提供了文件名,则此选项无效。存储元数据在需要控制序列化方式时很有用,因为 TensorDict 在元数据存在或不存在时,会以不同的方式处理合并 TD 的序列化/反序列化。
注意
如果 tensordict 已经合并,则忽略所有参数并返回
self
。调用contiguous()
重新合并。示例
>>> import pickle >>> import tempfile >>> import torch >>> import tqdm >>> from torch.utils.benchmark import Timer >>> from tensordict import TensorDict >>> data = TensorDict({"a": torch.zeros(()), "b": {"c": torch.zeros(())}}) >>> data_consolidated = data.consolidate() >>> # check that the data has a single data_ptr() >>> assert torch.tensor([ ... v.untyped_storage().data_ptr() for v in data_c.values(True, True) ... ]).unique().numel() == 1 >>> # Serializing the tensordict will be faster with data_consolidated >>> with open("data.pickle", "wb") as f: ... print("regular", Timer("pickle.dump(data, f)", globals=globals()).adaptive_autorange()) >>> with open("data_c.pickle", "wb") as f: ... print("consolidated", Timer("pickle.dump(data_consolidated, f)", globals=globals()).adaptive_autorange())
- contiguous() T ¶
返回一个新的相同类型 tensordict,其中包含连续的值(如果值已经连续,则返回 self)。
- copy()¶
返回 tensordict 的浅拷贝(即复制结构但不复制数据)。
等效于 TensorDictBase.clone(recurse=False)
- copy_at_(tensordict: T, idx: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], non_blocking: bool = False) T ¶
- cos() T ¶
计算 TensorDict 中每个元素的
cos()
值。
- cos_() T ¶
就地计算 TensorDict 中每个元素的
cos()
值。
- cosh() T ¶
计算 TensorDict 中每个元素的
cosh()
值。
- cosh_() T ¶
就地计算 TensorDict 中每个元素的
cosh()
值。
- create_nested(key)¶
创建一个与当前 tensordict 具有相同形状、设备和维度名称的嵌套 tensordict。
如果该值已存在,则此操作将覆盖它。在锁定的 tensordict 中,此操作将被阻止。
示例
>>> data = TensorDict({}, [3, 4, 5]) >>> data.create_nested("root") >>> data.create_nested(("some", "nested", "value")) >>> print(data) TensorDict( fields={ root: TensorDict( fields={ }, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False), some: TensorDict( fields={ nested: TensorDict( fields={ value: TensorDict( fields={ }, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 4, 5]), device=None, is_shared=False)
- cuda(device: Optional[int] = None, **kwargs) T ¶
将 tensordict 转换为 CUDA 设备(如果还没有在该设备上)。
- 参数::
device (int, 可选) – 如果提供,则为应该将张量转换到的 CUDA 设备。
此函数还支持
to()
的所有关键字参数。
- property data¶
返回一个 tensordict,其中包含叶子张量的 .data 属性。
- detach() T ¶
分离 tensordict 中的张量。
- 返回:
一个新的 tensordict,其中没有张量需要梯度。
- detach_() T ¶
就地分离 tensordict 中的张量。
- 返回:
self.
- property device: torch.device | None¶
TensorDict 的设备。
如果 TensorDict 指定了设备,则所有张量(包括嵌套的张量)都必须位于同一个设备上。如果 TensorDict 设备为
None
,则不同的值可以位于不同的设备上。- 返回:
指示张量放置位置的设备的 torch.device 对象,如果 TensorDict 没有设备,则为 None。
示例
>>> td = TensorDict({ ... "cpu": torch.randn(3, device='cpu'), ... "cuda": torch.randn(3, device='cuda'), ... }, batch_size=[], device=None) >>> td['cpu'].device device(type='cpu') >>> td['cuda'].device device(type='cuda') >>> td = TensorDict({ ... "x": torch.randn(3, device='cpu'), ... "y": torch.randn(3, device='cuda'), ... }, batch_size=[], device='cuda') >>> td['x'].device device(type='cuda') >>> td['y'].device device(type='cuda') >>> td = TensorDict({ ... "x": torch.randn(3, device='cpu'), ... "y": TensorDict({'z': torch.randn(3, device='cpu')}, batch_size=[], device=None), ... }, batch_size=[], device='cuda') >>> td['x'].device device(type='cuda') >>> td['y'].device # nested tensordicts are also mapped onto the appropriate device. device(type='cuda') >>> td['y', 'x'].device device(type='cuda')
- dim() int ¶
参见
batch_dims()
。
- div(other: TensorDictBase | torch.Tensor, *, default: str | CompatibleType | None = None) T ¶
将输入
self
的每个元素除以other
的对应元素。\[\text{out}_i = \frac{\text{input}_i}{\text{other}_i}\]支持广播、类型提升以及整数、浮点数、tensordict 或张量输入。始终将整数类型提升为默认标量类型。
- 参数::
other (TensorDict, Tensor 或 Number) – 除数。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- div_(other: TensorDictBase | torch.Tensor) T ¶
div()
的就地版本。注意
就地
div
不支持default
关键字参数。
- double()¶
将所有张量转换为
torch.bool
。
- property dtype¶
如果数据类型是唯一的,则返回 tensordict 中的值的数据类型。
- dumps(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将 tensordict 保存到磁盘。
此函数是
memmap()
的代理。
- empty(recurse=False, *, batch_size=None, device=_NoDefault.ZERO, names=None) T ¶
返回一个新的、空的 tensordict,它具有相同的设备和批次大小。
- 参数::
recurse (bool, 可选) – 如果为
True
,则将复制TensorDict
的整个结构,而不会复制内容。否则,只复制根。默认为False
。- 关键字参数:
batch_size (torch.Size, 可选) – tensordict 的新批次大小。
device (torch.device, 可选) – 新设备。
names (字符串列表, 可选) – 维度名称。
- entry_class(key: NestedKey) type ¶
返回条目的类,可能避免调用 isinstance(td.get(key), type)。
此方法应优先于
tensordict.get(key).shape
,只要get()
的执行可能很昂贵。
- erf() T ¶
计算 TensorDict 的每个元素的
erf()
值。
- erf_() T ¶
就地计算 TensorDict 的每个元素的
erf()
值。
- erfc() T ¶
计算 TensorDict 的每个元素的
erfc()
值。
- erfc_() T ¶
就地计算 TensorDict 的每个元素的
erfc()
值。
- exclude(*keys: NestedKey, inplace: bool = False) T ¶
排除 tensordict 的键,并返回一个不包含这些条目的新 tensordict。
值不会被复制:对原始 tensordict 或新 tensordict 的张量进行就地修改会导致两个 tensordict 都发生变化。
- 参数::
- 返回:
一个新的 tensordict(如果
inplace=True
则为同一个),不包含排除的条目。
示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": 0, "b": {"c": 1, "d": 2}}, []) >>> td.exclude("a", ("b", "c")) TensorDict( fields={ b: TensorDict( fields={ d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.exclude("a", "b") TensorDict( fields={ }, batch_size=torch.Size([]), device=None, is_shared=False)
- exp() T ¶
计算 TensorDict 中每个元素的
exp()
值。
- exp_() T ¶
就地计算 TensorDict 中每个元素的
exp()
值。
- expand(*args: int, inplace: bool = False) T ¶
根据
expand()
函数扩展 tensordict 的每个张量,忽略特征维度。支持可迭代对象来指定形状。
示例
>>> td = TensorDict({ ... 'a': torch.zeros(3, 4, 5), ... 'b': torch.zeros(3, 4, 10)}, batch_size=[3, 4]) >>> td_expand = td.expand(10, 3, 4) >>> assert td_expand.shape == torch.Size([10, 3, 4]) >>> assert td_expand.get("a").shape == torch.Size([10, 3, 4, 5])
- expand_as(other: TensorDictBase | torch.Tensor) TensorDictBase ¶
将 tensordict 的形状广播到 other 的形状,并相应地扩展它。
如果输入是张量集合(tensordict 或 tensorclass),则叶子将在一对一的基础上进行扩展。
示例
>>> from tensordict import TensorDict >>> import torch >>> td0 = TensorDict({ ... "a": torch.ones(3, 1, 4), ... "b": {"c": torch.ones(3, 2, 1, 4)}}, ... batch_size=[3], ... ) >>> td1 = TensorDict({ ... "a": torch.zeros(2, 3, 5, 4), ... "b": {"c": torch.zeros(2, 3, 2, 6, 4)}}, ... batch_size=[2, 3], ... ) >>> expanded = td0.expand_as(td1) >>> assert (expanded==1).all() >>> print(expanded) TensorDict( fields={ a: Tensor(shape=torch.Size([2, 3, 5, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([2, 3, 2, 6, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([2, 3]), device=None, is_shared=False)}, batch_size=torch.Size([2, 3]), device=None, is_shared=False)
- expm1() T ¶
计算 TensorDict 中每个元素的
expm1()
值。
- expm1_() T ¶
就地计算 TensorDict 中每个元素的
expm1()
值。
- filter_empty_()¶
就地过滤掉所有空的 tensordict。
- filter_non_tensor_data() T ¶
过滤掉所有非张量数据。
- flatten(start_dim=0, end_dim=- 1)¶
将 tensordict 中的所有张量展平。
示例
>>> td = TensorDict({ ... "a": torch.arange(60).view(3, 4, 5), ... "b": torch.arange(12).view(3, 4)}, batch_size=[3, 4]) >>> td_flat = td.flatten(0, 1) >>> td_flat.batch_size torch.Size([12]) >>> td_flat["a"] tensor([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29], [30, 31, 32, 33, 34], [35, 36, 37, 38, 39], [40, 41, 42, 43, 44], [45, 46, 47, 48, 49], [50, 51, 52, 53, 54], [55, 56, 57, 58, 59]]) >>> td_flat["b"] tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
- flatten_keys(separator: str = '.', inplace: bool = False, is_leaf: Callable[[Type], bool] | None = None) T ¶
递归地将嵌套的 tensordict 转换为扁平化的 tensordict。
TensorDict 类型将丢失,结果将是一个简单的 TensorDict 实例。
- 参数::
示例
>>> data = TensorDict({"a": 1, ("b", "c"): 2, ("e", "f", "g"): 3}, batch_size=[]) >>> data.flatten_keys(separator=" - ") TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b - c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), e - f - g: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
此方法和
unflatten_keys()
在处理 state-dict 时特别有用,因为它们可以使将扁平字典无缝地转换为模拟模型结构的数据结构成为可能。示例
>>> model = torch.nn.Sequential(torch.nn.Linear(3 ,4)) >>> ddp_model = torch.ao.quantization.QuantWrapper(model) >>> state_dict = TensorDict(ddp_model.state_dict(), batch_size=[]).unflatten_keys(".") >>> print(state_dict) TensorDict( fields={ module: TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model_state_dict = state_dict.get("module") >>> print(model_state_dict) TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model.load_state_dict(dict(model_state_dict.flatten_keys(".")))
- float()¶
将所有张量转换为
torch.float
。
- float16()¶
将所有张量转换为
torch.float16
。
- float32()¶
将所有张量转换为
torch.float32
。
- float64()¶
将所有张量转换为
torch.float64
。
- floor() T ¶
计算 TensorDict 中每个元素的
floor()
值。
- floor_() T ¶
就地计算 TensorDict 中每个元素的
floor()
值。
- frac() T ¶
计算 TensorDict 中每个元素的
frac()
值。
- frac_() T ¶
对 TensorDict 中的每个元素就地计算
frac()
值。
- classmethod from_dict(input_dict, batch_size=None, device=None, batch_dims=None, stack_dim_name=None, stack_dim=0)¶
从字典或其他
TensorDict
创建一个 TensorDict。如果未指定
batch_size
,则返回可能的最大批次大小。此功能也适用于嵌套字典,或者可以用来确定嵌套的 tensordict 的批次大小。
- 参数::
input_dict (dictionary, optional) – 用作数据源的字典(支持嵌套键)。
batch_size (iterable of int, optional) – tensordict 的批次大小。
device (torch.device or compatible type, optional) – TensorDict 的设备。
batch_dims (int, optional) –
batch_dims
(即用于batch_size
的前导维度数)。与batch_size
互斥。请注意,这是 tensordict 的__最大__批次维度数,允许使用更小的数字。names (list of str, optional) – tensordict 的维度名称。
示例
>>> input_dict = {"a": torch.randn(3, 4), "b": torch.randn(3)} >>> print(TensorDict.from_dict(input_dict)) TensorDict( fields={ a: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False), b: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> # nested dict: the nested TensorDict can have a different batch-size >>> # as long as its leading dims match. >>> input_dict = {"a": torch.randn(3), "b": {"c": torch.randn(3, 4)}} >>> print(TensorDict.from_dict(input_dict)) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> # we can also use this to work out the batch sie of a tensordict >>> input_td = TensorDict({"a": torch.randn(3), "b": {"c": torch.randn(3, 4)}}, []) >>> print(TensorDict.from_dict(input_td)) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)
- from_dict_instance(input_dict, batch_size=None, device=None, batch_dims=None, names=None)¶
from_dict()
的实例方法版本。与
from_dict()
不同,此方法将尝试在现有树中保留 tensordict 类型(对于任何现有的叶子)。示例
>>> from tensordict import TensorDict, tensorclass >>> import torch >>> >>> @tensorclass >>> class MyClass: ... x: torch.Tensor ... y: int >>> >>> td = TensorDict({"a": torch.randn(()), "b": MyClass(x=torch.zeros(()), y=1)}) >>> print(td.from_dict_instance(td.to_dict())) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: MyClass( x=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), y=Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> print(td.from_dict(td.to_dict())) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ x: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), y: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_h5(filename, mode='r')¶
从 h5 文件创建一个 PersistentTensorDict。
此功能将自动确定每个嵌套 tensordict 的批次大小。
- classmethod from_module(module, as_module: bool = False, lock: bool = True, use_state_dict: bool = False)¶
将模块的参数和缓冲区复制到 tensordict 中。
- 参数::
module (nn.Module) – 要从中获取参数的模块。
as_module (bool, optional) – 如果为
True
,将返回一个TensorDictParams
实例,可用于将参数存储在torch.nn.Module
中。默认为False
。lock (bool, optional) – 如果为
True
,生成的 tensordict 将被锁定。默认为True
。use_state_dict (bool, optional) –
如果为
True
,将使用模块中的状态字典,并将其展开成一个具有模型树结构的 TensorDict。默认为False
。 .. noteThis is particularly useful when state-dict hooks have to be used.
示例
>>> from torch import nn >>> module = nn.TransformerDecoder( ... decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4), ... num_layers=1) >>> params = TensorDict.from_module(module) >>> print(params["layers", "0", "linear1"]) TensorDict( fields={ bias: Parameter(shape=torch.Size([2048]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([2048, 4]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- classmethod from_modules(*modules, as_module: bool = False, lock: bool = True, use_state_dict: bool = False, lazy_stack: bool = False, expand_identical: bool = False)¶
通过 vmap 获取多个模块的参数,以用于 ensebmle 学习或特征提取。
- 参数::
modules (sequence of nn.Module) – 要从中获取参数的模块。如果模块在结构上不同,则需要延迟堆叠(见下面的
lazy_stack
参数)。- 关键字参数:
as_module (bool, optional) – 如果为
True
,将返回一个TensorDictParams
实例,可用于将参数存储在torch.nn.Module
中。默认为False
。lock (bool, optional) – 如果为
True
,生成的 tensordict 将被锁定。默认为True
。use_state_dict (bool, optional) –
如果为
True
,将使用模块中的状态字典,并将其展开成一个具有模型树结构的 TensorDict。默认为False
。 .. noteThis is particularly useful when state-dict hooks have to be used.
lazy_stack (bool, optional) –
参数是否应密集或延迟堆叠。默认为
False
(密集堆叠)。注意
lazy_stack
和as_module
是互斥的功能。警告
延迟和非延迟输出之间存在一个关键差异,即非延迟输出将使用所需的批次大小重新实例化参数,而
lazy_stack
只是将参数表示为延迟堆叠。这意味着,当lazy_stack=True
时,原始参数可以安全地传递给优化器,而当将其设置为True
时,需要传递新参数。警告
虽然使用懒惰堆栈来保留原始参数引用可能很诱人,但请记住,每次调用
get()
时,懒惰堆栈都会执行堆栈操作。这将需要内存(参数大小的 N 倍,如果构建图则更多)和时间来计算。这也意味着优化器将包含更多参数,并且像step()
或zero_grad()
这样的操作执行时间更长。一般来说,lazy_stack
应该保留用于极少数用例。expand_identical (bool, optional) – 如果
True
并且同一个参数(相同的标识)被堆叠到自身,则将返回此参数的扩展版本。当lazy_stack=True
时,此参数将被忽略。
示例
>>> from torch import nn >>> from tensordict import TensorDict >>> torch.manual_seed(0) >>> empty_module = nn.Linear(3, 4, device="meta") >>> n_models = 2 >>> modules = [nn.Linear(3, 4) for _ in range(n_models)] >>> params = TensorDict.from_modules(*modules) >>> print(params) TensorDict( fields={ bias: Parameter(shape=torch.Size([2, 4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Parameter(shape=torch.Size([2, 4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([2]), device=None, is_shared=False) >>> # example of batch execution >>> def exec_module(params, x): ... with params.to_module(empty_module): ... return empty_module(x) >>> x = torch.randn(3) >>> y = torch.vmap(exec_module, (0, None))(params, x) >>> assert y.shape == (n_models, 4) >>> # since lazy_stack = False, backprop leaves the original params untouched >>> y.sum().backward() >>> assert params["weight"].grad.norm() > 0 >>> assert modules[0].weight.grad is None
使用
lazy_stack=True
,情况略有不同>>> params = TensorDict.from_modules(*modules, lazy_stack=True) >>> print(params) LazyStackedTensorDict( fields={ bias: Tensor(shape=torch.Size([2, 4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([2, 4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, exclusive_fields={ }, batch_size=torch.Size([2]), device=None, is_shared=False, stack_dim=0) >>> # example of batch execution >>> y = torch.vmap(exec_module, (0, None))(params, x) >>> assert y.shape == (n_models, 4) >>> y.sum().backward() >>> assert modules[0].weight.grad is not None
- classmethod from_namedtuple(named_tuple, *, auto_batch_size: bool = False)¶
递归地将命名元组转换为 TensorDict。
- 关键字参数:
auto_batch_size (bool, optional) – 如果
True
,则批次大小将自动计算。默认值为False
。
示例
>>> from tensordict import TensorDict >>> import torch >>> data = TensorDict({ ... "a_tensor": torch.zeros((3)), ... "nested": {"a_tensor": torch.zeros((3)), "a_string": "zero!"}}, [3]) >>> nt = data.to_namedtuple() >>> print(nt) GenericDict(a_tensor=tensor([0., 0., 0.]), nested=GenericDict(a_tensor=tensor([0., 0., 0.]), a_string='zero!')) >>> TensorDict.from_namedtuple(nt, auto_batch_size=True) TensorDict( fields={ a_tensor: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), nested: TensorDict( fields={ a_string: NonTensorData(data=zero!, batch_size=torch.Size([3]), device=None), a_tensor: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)
- classmethod from_pytree(pytree, *, batch_size: torch.Size | None = None, auto_batch_size: bool = False, batch_dims: int | None = None)¶
将 pytree 转换为 TensorDict 实例。
此方法旨在尽可能地保持 pytree 的嵌套结构。
添加了额外的非张量键来跟踪每个级别的标识,提供了一个内置的 pytree 到 tensordict 的双射变换 API。
当前接受的类包括列表、元组、命名元组和字典。
注意
对于字典,非 NestedKey 键将作为
NonTensorData
实例单独注册。注意
可转换为张量的类型(如 int、float 或 np.ndarray)将转换为 torch.Tensor 实例。注意,此转换是满射的:将 tensordict 转换回 pytree 不会恢复原始类型。
示例
>>> # Create a pytree with tensor leaves, and one "weird"-looking dict key >>> class WeirdLookingClass: ... pass ... >>> weird_key = WeirdLookingClass() >>> # Make a pytree with tuple, lists, dict and namedtuple >>> pytree = ( ... [torch.randint(10, (3,)), torch.zeros(2)], ... { ... "tensor": torch.randn( ... 2, ... ), ... "td": TensorDict({"one": 1}), ... weird_key: torch.randint(10, (2,)), ... "list": [1, 2, 3], ... }, ... {"named_tuple": TensorDict({"two": torch.ones(1) * 2}).to_namedtuple()}, ... ) >>> # Build a TensorDict from that pytree >>> td = TensorDict.from_pytree(pytree) >>> # Recover the pytree >>> pytree_recon = td.to_pytree() >>> # Check that the leaves match >>> def check(v1, v2): >>> assert (v1 == v2).all() >>> >>> torch.utils._pytree.tree_map(check, pytree, pytree_recon) >>> assert weird_key in pytree_recon[1]
- classmethod fromkeys(keys: List[NestedKey], value: Any = 0)¶
从键列表和单个值创建 tensordict。
- 参数::
keys (list of NestedKey) – 指定新字典键的可迭代对象。
value (兼容类型, optional) – 所有键的值。默认值为
0
。
- gather(dim: int, index: Tensor, out: T | None = None) T ¶
沿 dim 指定的轴收集值。
- 参数::
dim (int) – 要收集元素的维度
index (torch.Tensor) – 一个长张量,其维度数与 tensordict 相匹配,只有两个维度之间的一个维度不同(收集维度)。它的元素是指要在所需维度上收集的索引。
out (TensorDictBase, optional) – 目标 tensordict。它必须与索引具有相同的形状。
示例
>>> td = TensorDict( ... {"a": torch.randn(3, 4, 5), ... "b": TensorDict({"c": torch.zeros(3, 4, 5)}, [3, 4, 5])}, ... [3, 4]) >>> index = torch.randint(4, (3, 2)) >>> td_gather = td.gather(dim=1, index=index) >>> print(td_gather) TensorDict( fields={ a: Tensor(shape=torch.Size([3, 2, 5]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([3, 2, 5]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3, 2, 5]), device=None, is_shared=False)}, batch_size=torch.Size([3, 2]), device=None, is_shared=False)
Gather 保留维度名称。
示例
>>> td.names = ["a", "b"] >>> td_gather = td.gather(dim=1, index=index) >>> td_gather.names ["a", "b"]
- gather_and_stack(dst: int, group: 'dist.ProcessGroup' | None = None) T | None ¶
从不同的工作进程收集 tensordict,并将它们堆叠到目标工作进程中的 self 上。
- 参数::
dst (int) – 目标工作进程的排名,其中将调用
gather_and_stack()
。group (torch.distributed.ProcessGroup, optional) – 如果设置,则将使用指定的进程组进行通信。否则,将使用默认进程组。默认值为
None
。
示例
>>> from torch import multiprocessing as mp >>> from tensordict import TensorDict >>> import torch >>> >>> def client(): ... torch.distributed.init_process_group( ... "gloo", ... rank=1, ... world_size=2, ... init_method=f"tcp://127.0.0.1:10003", ... ) ... # Create a single tensordict to be sent to server ... td = TensorDict( ... {("a", "b"): torch.randn(2), ... "c": torch.randn(2)}, [2] ... ) ... td.gather_and_stack(0) ... >>> def server(): ... torch.distributed.init_process_group( ... "gloo", ... rank=0, ... world_size=2, ... init_method=f"tcp://127.0.0.1:10003", ... ) ... # Creates the destination tensordict on server. ... # The first dim must be equal to world_size-1 ... td = TensorDict( ... {("a", "b"): torch.zeros(2), ... "c": torch.zeros(2)}, [2] ... ).expand(1, 2).contiguous() ... td.gather_and_stack(0) ... assert td["a", "b"] != 0 ... print("yuppie") ... >>> if __name__ == "__main__": ... mp.set_start_method("spawn") ... ... main_worker = mp.Process(target=server) ... secondary_worker = mp.Process(target=client) ... ... main_worker.start() ... secondary_worker.start() ... ... main_worker.join() ... secondary_worker.join()
- get(key: NestedKey, default: Any = _NoDefault.ZERO) Tensor ¶
获取使用输入键存储的值。
- 参数::
key (str, tuple of str) – 要查询的键。如果为 str 元组,则等效于 getattr 的链式调用。
default – 如果 tensordict 中未找到键,则为默认值。
示例
>>> td = TensorDict({"x": 1}, batch_size=[]) >>> td.get("x") tensor(1) >>> td.get("y", default=None) None
- get_at(key: NestedKey, index: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], default: Tensor = _NoDefault.ZERO) Tensor ¶
从键 key 中索引 idx 处获取 tensordict 的值。
- 参数::
key (str, tuple of str) – 要检索的键。
index (int, slice, torch.Tensor, iterable) – 张量的索引。
default (torch.Tensor) – 如果 tensordict 中不存在键,则返回的默认值。
- 返回:
索引的张量。
示例
>>> td = TensorDict({"x": torch.arange(3)}, batch_size=[]) >>> td.get_at("x", index=1) tensor(1)
- get_item_shape(key)¶
获取惰性堆栈中项目的形状。
异构维度将返回为 -1。
此实现效率低下,因为它将尝试堆叠项目以计算它们的形状,并且仅应用于打印。
- get_nestedtensor(key: NestedKey, default: Any = _NoDefault.ZERO, *, layout: torch.layout | None = None) CompatibleType ¶
在无法堆叠时返回嵌套张量。
- 参数::
key (NestedKey) – 要嵌套的条目。
default (Any, optional) –
如果键不在所有子 tensordict 中,则返回的默认值。
注意
如果默认值为张量,则此方法将尝试使用它构建嵌套张量。否则,将返回默认值。
- 关键字参数:
layout (torch.layout, optional) – 嵌套张量的布局。
示例
>>> td0 = TensorDict({"a": torch.zeros(4), "b": torch.zeros(4)}, []) >>> td1 = TensorDict({"a": torch.ones(5)}, []) >>> td = torch.stack([td0, td1], 0) >>> a = td.get_nestedtensor("a") >>> # using a tensor as default uses this default to build the nested tensor >>> b = td.get_nestedtensor("b", default=torch.ones(4)) >>> assert (a == b).all() >>> # using anything else as default returns the default >>> b2 = td.get_nestedtensor("b", None) >>> assert b2 is None
- get_non_tensor(key: NestedKey, default=_NoDefault.ZERO)¶
如果存在,获取非张量值,如果未找到非张量值,则获取 default。
此方法对张量/TensorDict 值很健壮,这意味着如果收集的值是普通张量,它也会被返回(尽管此方法有一些开销,不应超出其自然范围)。
有关如何在 tensordict 中设置非张量值的更多信息,请参见
set_non_tensor()
。- 参数::
key (NestedKey) – NonTensorData 对象的位置。
default (Any, optional) – 如果找不到键,则返回的值。
- 返回值:
tensordict.tensorclass.NonTensorData
的内容, 或者如果它不是
tensordict.tensorclass.NonTensorData
(或如果找不到条目,则为default
),则对应于key
的条目。
示例
>>> data = TensorDict({}, batch_size=[]) >>> data.set_non_tensor(("nested", "the string"), "a string!") >>> assert data.get_non_tensor(("nested", "the string")) == "a string!" >>> # regular `get` works but returns a NonTensorData object >>> data.get(("nested", "the string")) NonTensorData( data='a string!', batch_size=torch.Size([]), device=None, is_shared=False)
- property grad¶
返回一个 tensordict,其中包含叶张量的 .grad 属性。
- half()¶
将所有张量转换为
torch.half
。
- insert(index: int, tensordict: T) None ¶
在指定索引处将 TensorDict 插入堆栈中。
类似于 list.insert。插入的 TensorDict 必须具有兼容的 batch_size 和设备。插入是就地进行的,不会返回任何内容。
- 参数::
index (int) – 新 TensorDict 应该插入的索引。
tensordict (TensorDictBase) – 要插入堆栈的 TensorDict。
- int()¶
将所有张量转换为
torch.int
。
- int16()¶
将所有张量转换为
torch.int16
。
- int32()¶
将所有张量转换为
torch.int32
。
- int64()¶
将所有张量转换为
torch.int64
。
- int8()¶
将所有张量转换为
torch.int8
。
- irecv(src: int, *, group: 'dist.ProcessGroup' | None = None, return_premature: bool = False, init_tag: int = 0, pseudo_rand: bool = False) tuple[int, list[torch.Future]] | list[torch.Future] | None ¶
异步接收 TensorDict 的内容并更新内容。
有关上下文,请查看
isend()
方法中的示例。- 参数::
src (int) – 源工作进程的排名。
- 关键字参数:
group (torch.distributed.ProcessGroup, optional) – 如果设置,则将使用指定的进程组进行通信。否则,将使用默认进程组。默认值为
None
。return_premature (bool) – 如果为
True
,则返回要等待的未来列表,直到 TensorDict 更新。默认为False
,即等待直到在调用中完成更新。init_tag (int) – 源工作进程使用的
init_tag
。pseudo_rand (bool) – 如果为 True,则标签序列将是伪随机的,允许从不同节点发送多个数据而不会重叠。请注意,这些伪随机数的生成很昂贵(1e-5 秒/数),这意味着它可能会减慢算法的运行时间。此值必须与传递给
isend()
的值匹配。默认为False
。
- 返回:
- 如果
return_premature=True
,则返回要等待的未来列表 直到 TensorDict 更新。
- 如果
- is_consolidated()¶
检查 TensorDict 是否具有合并的存储。
- is_memmap() bool ¶
检查 TensorDict 是否是内存映射的。
如果 TensorDict 实例是内存映射的,它将被锁定(条目不能被重命名、删除或添加)。如果
TensorDict
是使用全是内存映射的张量创建的,这并不意味着is_memmap
将返回True
(因为新的张量可能是也可能不是内存映射的)。只有当调用 tensordict.memmap_() 时,TensorDict 才会被视为内存映射的。对于 CUDA 设备上的 TensorDict,这始终为
True
。
检查 TensorDict 是否位于共享内存中。
如果 TensorDict 实例位于共享内存中,它将被锁定(条目不能被重命名、删除或添加)。如果
TensorDict
是使用全是共享内存中的张量创建的,这并不意味着is_shared
将返回True
(因为新的张量可能是也可能不是共享内存中的)。只有当调用 tensordict.share_memory_() 或将 TensorDict 放置在默认情况下内容共享的设备上(例如,"cuda"
)时,TensorDict 才会被视为位于共享内存中。对于 CUDA 设备上的 TensorDict,这始终为
True
。
- isend(dst: int, *, group: 'dist.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int ¶
异步发送 TensorDict 的内容。
- 参数::
dst (int) – 应发送内容的目标工作进程的排名。
- 关键字参数:
示例
>>> import torch >>> from tensordict import TensorDict >>> from torch import multiprocessing as mp >>> def client(): ... torch.distributed.init_process_group( ... "gloo", ... rank=1, ... world_size=2, ... init_method=f"tcp://127.0.0.1:10003", ... ) ... ... td = TensorDict( ... { ... ("a", "b"): torch.randn(2), ... "c": torch.randn(2, 3), ... "_": torch.ones(2, 1, 5), ... }, ... [2], ... ) ... td.isend(0) ... >>> >>> def server(queue, return_premature=True): ... torch.distributed.init_process_group( ... "gloo", ... rank=0, ... world_size=2, ... init_method=f"tcp://127.0.0.1:10003", ... ) ... td = TensorDict( ... { ... ("a", "b"): torch.zeros(2), ... "c": torch.zeros(2, 3), ... "_": torch.zeros(2, 1, 5), ... }, ... [2], ... ) ... out = td.irecv(1, return_premature=return_premature) ... if return_premature: ... for fut in out: ... fut.wait() ... assert (td != 0).all() ... queue.put("yuppie") ... >>> >>> if __name__ == "__main__": ... queue = mp.Queue(1) ... main_worker = mp.Process( ... target=server, ... args=(queue, ) ... ) ... secondary_worker = mp.Process(target=client) ... ... main_worker.start() ... secondary_worker.start() ... out = queue.get(timeout=10) ... assert out == "yuppie" ... main_worker.join() ... secondary_worker.join()
- isfinite() T ¶
返回一个新的 TensorDict,其中布尔元素表示每个元素是否为有限的。
当实数不为 NaN、负无穷大或正无穷大时,它们为有限的。当复数的实部和虚部都为有限时,它们为有限的。
- isnan() T ¶
返回一个新的 TensorDict,其中布尔元素表示输入的每个元素是否为 NaN。
当复数的实部和/或虚部为 NaN 时,它们被视为 NaN。
- isneginf() T ¶
测试输入的每个元素是否为负无穷大。
- isposinf() T ¶
测试输入的每个元素是否为负无穷大。
- isreal() T ¶
返回一个新的 TensorDict,其中布尔元素表示输入的每个元素是否为实值。
- items(include_nested=False, leaves_only=False, is_leaf=None)¶
返回 tensordict 的键值对生成器。
- keys(include_nested: bool = False, leaves_only: bool = False, is_leaf: Callable[[Type], bool] | None = None) _LazyStackedTensorDictKeysView ¶
返回 tensordict 键的生成器。
- 参数::
示例
>>> from tensordict import TensorDict >>> data = TensorDict({"0": 0, "1": {"2": 2}}, batch_size=[]) >>> data.keys() ['0', '1'] >>> list(data.keys(leaves_only=True)) ['0'] >>> list(data.keys(include_nested=True, leaves_only=True)) ['0', '1', ('1', '2')]
- classmethod lazy_stack(items: Sequence[TensorDictBase], dim: int = 0, *, device: DeviceType | None = None, out: T | None = None, stack_dim_name: str | None = None, strict_shape: bool = False) T ¶
将 tensordict 堆叠到 LazyStackedTensorDict 中。
- 参数::
items (TensorDictBase 实例的序列) – 要堆叠的 TensorDictBase 实例的序列。
dim (int, optional) – 执行延迟堆叠的维度。默认值为 0。
- 关键字参数:
device (torch.device, optional) – 用于在无法从 tensordict 列表中推断设备的情况下(例如,列表为空)在 LazyStackedTensorDict 中设置的设备。
out (TensorDictBase, optional) – 要写入数据的 LazyStackedTensorDict。
stack_dim_name (str, optional) – 堆叠维度的名称。
strict_shape (bool, optional) – 如果为
True
,则每个 tensordict 的形状必须匹配。默认值为False
。
- lerp(end: TensorDictBase | torch.Tensor, weight: TensorDictBase | torch.Tensor | float)¶
根据标量或张量
weight
对两个张量start
(由self
给出)和end
进行线性插值。\[\text{out}_i = \text{start}_i + \text{weight}_i \times (\text{end}_i - \text{start}_i)\]start
和end
的形状必须是可广播的。如果weight
是张量,则weight
、start
和end
的形状必须是可广播的。- 参数::
end (TensorDict) – 具有结束点的 tensordict。
weight (TensorDict, tensor 或 float) – 插值公式的权重。
- lerp_(end: TensorDictBase | float, weight: TensorDictBase | float)¶
lerp()
的就地版本。
- lgamma() T ¶
计算 TensorDict 中每个元素的
lgamma()
值。
- lgamma_() T ¶
就地计算 TensorDict 中每个元素的
lgamma()
值。
- classmethod load(prefix: str | Path, *args, **kwargs) T ¶
从磁盘加载 tensordict。
此类方法是
load_memmap()
的代理。
- load_(prefix: str | Path, *args, **kwargs)¶
在当前 tensordict 内从磁盘加载 tensordict。
此类方法是
load_memmap_()
的代理。
- classmethod load_memmap(prefix: str | Path, device: torch.device | None = None, non_blocking: bool = False, *, out: TensorDictBase | None = None) T ¶
从磁盘加载内存映射的 tensordict。
- 参数::
prefix (str or Path to folder) – 保存的 tensordict 应该获取的文件夹的路径。
device (torch.device or equivalent, optional) – 如果提供,数据将异步转换为该设备。支持 “meta” 设备,在这种情况下,数据不会加载,而是创建一组空的“meta”张量。这对于在不实际打开任何文件的情况下了解模型的总大小和结构很有用。
non_blocking (bool, optional) – 如果为
True
,则在设备上加载张量后不会调用同步。默认为False
。out (TensorDictBase, optional) – 要写入数据的可选 tensordict。
示例
>>> from tensordict import TensorDict >>> td = TensorDict.fromkeys(["a", "b", "c", ("nested", "e")], 0) >>> td.memmap("./saved_td") >>> td_load = TensorDict.load_memmap("./saved_td") >>> assert (td == td_load).all()
此方法还允许加载嵌套的 tensordict。
>>> nested = TensorDict.load_memmap("./saved_td/nested") >>> assert nested["e"] == 0
tensordict 也可以加载到“meta”设备上,或者作为伪张量加载
>>> import tempfile >>> td = TensorDict({"a": torch.zeros(()), "b": {"c": torch.zeros(())}}) >>> with tempfile.TemporaryDirectory() as path: ... td.save(path) ... td_load = TensorDict.load_memmap(path, device="meta") ... print("meta:", td_load) ... from torch._subclasses import FakeTensorMode ... with FakeTensorMode(): ... td_load = TensorDict.load_memmap(path) ... print("fake:", td_load) meta: TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=meta, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=meta, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=meta, is_shared=False)}, batch_size=torch.Size([]), device=meta, is_shared=False) fake: TensorDict( fields={ a: FakeTensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), b: TensorDict( fields={ c: FakeTensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False)}, batch_size=torch.Size([]), device=cpu, is_shared=False)
- load_memmap_(prefix: str | Path)¶
在调用
load_memmap_
的 tensordict 内加载内存映射 tensordict 的内容。有关更多信息,请参阅
load_memmap()
。
- load_state_dict(state_dict: OrderedDict[str, Any], strict=True, assign=False, from_flatten=False) T ¶
将格式化的状态字典加载到 tensordict 中,如
state_dict()
中所示。- 参数::
state_dict (OrderedDict) – 要复制的状态字典。
strict (bool, optional) – 是否严格强制
state_dict
中的键与此 tensordict 的torch.nn.Module.state_dict()
函数返回的键匹配。默认:True
assign (bool, optional) – 是否将状态字典中的项目分配给 tensordict 中的对应键,而不是将它们就地复制到 tensordict 的当前张量中。当
False
时,当前模块中张量的属性将保留,而当True
时,状态字典中张量的属性将保留。默认:False
from_flatten (bool, optional) – 如果为
True
,则假设输入状态字典是扁平化的。默认为False
。
示例
>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, []) >>> data_zeroed = TensorDict({"1": 0, "2": 0, "3": {"3": 0}}, []) >>> sd = data.state_dict() >>> data_zeroed.load_state_dict(sd) >>> print(data_zeroed["3", "3"]) tensor(3) >>> # with flattening >>> data_zeroed = TensorDict({"1": 0, "2": 0, "3": {"3": 0}}, []) >>> data_zeroed.load_state_dict(data.state_dict(flatten=True), from_flatten=True) >>> print(data_zeroed["3", "3"]) tensor(3)
- lock_() T ¶
锁定 tensordict 以进行非就地操作。
诸如
set()
、__setitem__()
、update()
、rename_key_()
或其他添加或删除条目的操作将被阻止。此方法可用作装饰器。
示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": 1, "b": 2, "c": 3}, batch_size=[]) >>> with td.lock_(): ... assert td.is_locked ... try: ... td.set("d", 0) # error! ... except RuntimeError: ... print("td is locked!") ... try: ... del td["d"] ... except RuntimeError: ... print("td is locked!") ... try: ... td.rename_key_("a", "d") ... except RuntimeError: ... print("td is locked!") ... td.set("a", 0, inplace=True) # No storage is added, moved or removed ... td.set_("a", 0) # No storage is added, moved or removed ... td.update({"a": 0}, inplace=True) # No storage is added, moved or removed ... td.update_({"a": 0}) # No storage is added, moved or removed >>> assert not td.is_locked
- log() T ¶
计算 TensorDict 中每个元素的
log()
值。
- log10() T ¶
计算 TensorDict 中每个元素的
log10()
值。
- log10_() T ¶
就地计算 TensorDict 中每个元素的
log10()
值。
- log1p() T ¶
计算 TensorDict 中每个元素的
log1p()
值。
- log1p_() T ¶
对 TensorDict 中的每个元素进行
log1p()
操作,并修改原 TensorDict。
- log2() T ¶
计算 TensorDict 中每个元素的
log2()
值。
- log2_() T ¶
对 TensorDict 中的每个元素进行
log2()
操作,并修改原 TensorDict。
- log_() T ¶
对 TensorDict 中的每个元素进行
log()
操作,并修改原 TensorDict。
- make_memmap(key: NestedKey, shape: torch.Size | torch.Tensor, *, dtype: torch.dtype | None = None) MemoryMappedTensor ¶
根据指定的形状和数据类型创建一个空的内存映射张量。
警告
此方法默认情况下不是锁安全的。如果多个节点上存在内存映射的 TensorDict 实例,则需要使用
memmap_refresh_()
方法更新。写入现有条目会导致错误。
- 参数::
key (NestedKey) – 要写入的新条目的键。如果键已存在于 tensordict 中,则会引发异常。
shape (torch.Size 或 等效, torch.Tensor 用于嵌套张量) – 要写入的张量的形状。
- 关键字参数:
dtype (torch.dtype, 可选) – 新张量的数据类型。
- 返回:
新的内存映射张量。
- make_memmap_from_storage(key: NestedKey, storage: torch.UntypedStorage, shape: torch.Size | torch.Tensor, *, dtype: torch.dtype | None = None) MemoryMappedTensor ¶
根据指定的存储、形状和数据类型创建一个空的内存映射张量。
警告
此方法默认情况下不是锁安全的。如果多个节点上存在内存映射的 TensorDict 实例,则需要使用
memmap_refresh_()
方法更新。注意
如果存储关联了一个文件名,则该文件名必须与新文件的名称匹配。如果存储没有关联文件名,但 tensordict 关联了一个路径,则会引发异常。
- 参数::
key (NestedKey) – 要写入的新条目的键。如果键已存在于 tensordict 中,则会引发异常。
storage (torch.UntypedStorage) – 用于新 MemoryMappedTensor 的存储。必须是物理内存存储。
shape (torch.Size 或 等效, torch.Tensor 用于嵌套张量) – 要写入的张量的形状。
- 关键字参数:
dtype (torch.dtype, 可选) – 新张量的数据类型。
- 返回:
使用指定存储创建的新内存映射张量。
- make_memmap_from_tensor(key: NestedKey, tensor: Tensor, *, copy_data: bool = True) MemoryMappedTensor ¶
根据指定的张量创建一个空的内存映射张量。
警告
此方法默认情况下不是锁安全的。如果多个节点上存在内存映射的 TensorDict 实例,则需要使用
memmap_refresh_()
方法更新。如果
copy_data
为True
(即存储不共享),则此方法始终复制存储内容。- 参数::
key (NestedKey) – 要写入的新条目的键。如果键已存在于 tensordict 中,则会引发异常。
tensor (torch.Tensor) – 要在物理内存上复制的张量。
- 关键字参数:
copy_data (bool, 可选) – 如果为
False
,则新的张量将共享输入的元数据,例如形状和数据类型,但内容将为空。默认为True
。- 返回:
使用指定存储创建的新内存映射张量。
- map(fn: Callable[[TensorDictBase], TensorDictBase | None], dim: int = 0, num_workers: int | None = None, *, out: TensorDictBase | None = None, chunksize: int | None = None, num_chunks: int | None = None, pool: mp.Pool | None = None, generator: torch.Generator | None = None, max_tasks_per_child: int | None = None, worker_threads: int = 1, index_with_generator: bool = False, pbar: bool = False, mp_start_method: str | None = None)¶
将函数映射到张量字典的一个维度上的切片。
此方法将通过将张量字典分割成大小相等的张量字典并在所需数量的 worker 上分发操作,将函数应用于张量字典实例。
函数签名应为
Callabe[[TensorDict], Union[TensorDict, Tensor]]
。输出必须支持torch.cat()
操作。该函数必须是可序列化的。- 参数::
- 关键字参数:
out (TensorDictBase, optional) – 输出的可选容器。它沿着提供的
dim
的批处理大小必须与self.ndim
相匹配。如果它是共享的或内存映射的 (is_shared()
或is_memmap()
返回True
),它将在远程进程中被填充,避免数据向内传输。否则,来自self
切片的数据将被发送到进程,在当前进程中收集并在out
中就地写入。chunksize (int, optional) – 每个数据块的大小。
chunksize
为 0 将在应用函数后沿着所需维度解除张量字典的绑定并将其重新堆叠,而chunksize>0
将拆分张量字典并调用torch.cat()
在生成的张量字典列表上。如果没有提供,块的数量将等于工作进程的数量。对于非常大的张量字典,如此大的块可能无法放入内存以完成操作,可能需要更多块才能使操作实际上可行。此参数与num_chunks
互斥。num_chunks (int, optional) – 将张量字典拆分为的块数。如果没有提供,块的数量将等于工作进程的数量。对于非常大的张量字典,如此大的块可能无法放入内存以完成操作,可能需要更多块才能使操作实际上可行。此参数与
chunksize
互斥。pool (mp.Pool, optional) – 用于执行作业的多进程池实例。如果没有提供,将在
map
方法中创建一个池。generator (torch.Generator, optional) –
用于播种的生成器。将从它生成一个基本种子,并且池的每个 worker 将用提供的种子加上从
0
到num_workers
的唯一整数进行播种。如果没有提供生成器,将使用随机整数作为种子。要使用无种子 worker,应单独创建池并直接传递给map()
。.. noteCaution should be taken when providing a low-valued seed as this can cause autocorrelation between experiments, example: if 8 workers are asked and the seed is 4, the workers seed will range from 4 to 11. If the seed is 5, the workers seed will range from 5 to 12. These two experiments will have an overlap of 7 seeds, which can have unexpected effects on the results.
注意
播种 worker 的目的是让每个 worker 有独立的种子,而不是在 map 方法的调用之间有可重复的结果。换句话说,两次实验可能会也可能不会返回不同的结果,因为不可能知道哪个 worker 会选择哪个作业。但是,我们可以确保每个 worker 都有不同的种子,并且每个 worker 上的伪随机操作将不相关。
max_tasks_per_child (int, optional) – 每个子进程最多可以获取的任务数。默认为
None
,即对任务数没有限制。worker_threads (int, optional) – 工作线程的数量。默认为
1
。index_with_generator (bool, optional) – 如果为
True
,tensordict 的拆分/分块将在查询期间进行,节省初始化时间。请注意,chunk()
和split()
比索引(在生成器中使用)效率高得多,因此在初始化时获得的处理时间可能会对总运行时间产生负面影响。默认为False
。pbar (bool, optional) – 如果为
True
,将显示进度条。需要 tqdm 可用。默认为False
。mp_start_method (str, optional) – 多进程的启动方法。如果未提供,将使用默认启动方法。可接受的字符串为
"fork"
和"spawn"
。请记住,使用"fork"
启动方法无法在进程之间共享"cuda"
张量。如果将pool
传递给map
方法,则此参数无效。
示例
>>> import torch >>> from tensordict import TensorDict >>> >>> def process_data(data): ... data.set("y", data.get("x") + 1) ... return data >>> if __name__ == "__main__": ... data = TensorDict({"x": torch.zeros(1, 1_000_000)}, [1, 1_000_000]).memmap_() ... data = data.map(process_data, dim=1) ... print(data["y"][:, :10]) ... tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
注意
此方法在处理存储在磁盘上的大型数据集(例如内存映射 tensordicts)时特别有用,其中块将是原始数据的零拷贝切片,可以几乎零成本地传递给进程。这允许以很小的成本处理非常大的数据集(例如超过 Tb 大小的数据集)。
- map_iter(fn: Callable[[TensorDictBase], TensorDictBase | None], dim: int = 0, num_workers: int | None = None, *, shuffle: bool = False, chunksize: int | None = None, num_chunks: int | None = None, pool: mp.Pool | None = None, generator: torch.Generator | None = None, max_tasks_per_child: int | None = None, worker_threads: int = 1, index_with_generator: bool = True, pbar: bool = False, mp_start_method: str | None = None)¶
将函数映射到 tensordict 在一个维度上的拆分,并进行迭代。
这是
map()
的可迭代版本。此方法将通过将 tensordict 实例分成相同大小的 tensordict 并将操作分派到所需数量的工作线程上来对 tensordict 实例应用函数。它将一次产生一个结果。
函数签名应为
Callabe[[TensorDict], Union[TensorDict, Tensor]]
。函数必须是可序列化的。- 参数::
- 关键字参数:
shuffle (bool, optional) – 是否应全局混洗索引。如果为
True
,则每个批次将包含非连续样本。如果index_with_generator=False
并且 shuffle=True`,则会引发错误。默认为False
。chunksize (int, optional) – 每个数据块的大小。
chunksize
为 0 将在应用函数后沿着所需维度解除张量字典的绑定并将其重新堆叠,而chunksize>0
将拆分张量字典并调用torch.cat()
在生成的张量字典列表上。如果没有提供,块的数量将等于工作进程的数量。对于非常大的张量字典,如此大的块可能无法放入内存以完成操作,可能需要更多块才能使操作实际上可行。此参数与num_chunks
互斥。num_chunks (int, optional) – 将张量字典拆分为的块数。如果没有提供,块的数量将等于工作进程的数量。对于非常大的张量字典,如此大的块可能无法放入内存以完成操作,可能需要更多块才能使操作实际上可行。此参数与
chunksize
互斥。pool (mp.Pool, optional) – 用于执行作业的多进程池实例。如果没有提供,将在
map
方法中创建一个池。generator (torch.Generator, optional) –
用于播种的生成器。将从它生成一个基本种子,并且池的每个 worker 将用提供的种子加上从
0
到num_workers
的唯一整数进行播种。如果没有提供生成器,将使用随机整数作为种子。要使用无种子 worker,应单独创建池并直接传递给map()
。.. noteCaution should be taken when providing a low-valued seed as this can cause autocorrelation between experiments, example: if 8 workers are asked and the seed is 4, the workers seed will range from 4 to 11. If the seed is 5, the workers seed will range from 5 to 12. These two experiments will have an overlap of 7 seeds, which can have unexpected effects on the results.
注意
播种 worker 的目的是让每个 worker 有独立的种子,而不是在 map 方法的调用之间有可重复的结果。换句话说,两次实验可能会也可能不会返回不同的结果,因为不可能知道哪个 worker 会选择哪个作业。但是,我们可以确保每个 worker 都有不同的种子,并且每个 worker 上的伪随机操作将不相关。
max_tasks_per_child (int, optional) – 每个子进程最多可以获取的任务数。默认为
None
,即对任务数没有限制。worker_threads (int, optional) – 工作线程的数量。默认为
1
。index_with_generator (bool, optional) –
如果为
True
,tensordict 的拆分/分块将在查询期间进行,节省初始化时间。请注意,chunk()
和split()
比索引(在生成器中使用)效率高得多,因此在初始化时获得的处理时间可能会对总运行时间产生负面影响。默认为True
。注意
index_with_generator
的默认值对于map_iter
和map
不同,前者假定在内存中存储 TensorDict 的拆分版本非常昂贵。pbar (bool, optional) – 如果为
True
,将显示进度条。需要 tqdm 可用。默认为False
。mp_start_method (str, optional) – 多进程的启动方法。如果未提供,将使用默认启动方法。可接受的字符串为
"fork"
和"spawn"
。请记住,使用"fork"
启动方法无法在进程之间共享"cuda"
张量。如果将pool
传递给map
方法,则此参数无效。
示例
>>> import torch >>> from tensordict import TensorDict >>> >>> def process_data(data): ... data.unlock_() ... data.set("y", data.get("x") + 1) ... return data >>> if __name__ == "__main__": ... data = TensorDict({"x": torch.zeros(1, 1_000_000)}, [1, 1_000_000]).memmap_() ... for sample in data.map_iter(process_data, dim=1, chunksize=5): ... print(sample["y"]) ... break ... tensor([[1., 1., 1., 1., 1.]])
注意
此方法在处理存储在磁盘上的大型数据集(例如内存映射 tensordicts)时特别有用,其中块将是原始数据的零拷贝切片,可以几乎零成本地传递给进程。这允许以很小的成本处理非常大的数据集(例如超过 Tb 大小的数据集)。
注意
此函数可用于表示数据集并以类似 dataloader 的方式从其加载数据。
- masked_fill(mask: Tensor, value: float | bool) T ¶
masked_fill 的非就地版本。
- 参数::
mask (boolean torch.Tensor) – 要填充的值的掩码。形状必须与 tensordict 的批次大小匹配。
value – 用于填充张量的值。
- 返回:
self
示例
>>> td = TensorDict(source={'a': torch.zeros(3, 4)}, ... batch_size=[3]) >>> mask = torch.tensor([True, False, False]) >>> td1 = td.masked_fill(mask, 1.0) >>> td1.get("a") tensor([[1., 1., 1., 1.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
- masked_fill_(mask: Tensor, value: float | bool) T ¶
使用指定的值填充与掩码相对应的值。
- 参数::
mask (boolean torch.Tensor) – 要填充的值的掩码。形状必须与 tensordict 的批次大小匹配。
value – 用于填充张量的值。
- 返回:
self
示例
>>> td = TensorDict(source={'a': torch.zeros(3, 4)}, ... batch_size=[3]) >>> mask = torch.tensor([True, False, False]) >>> td.masked_fill_(mask, 1.0) >>> td.get("a") tensor([[1., 1., 1., 1.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
- masked_select(mask: Tensor) T ¶
掩盖 TensorDict 中的所有张量,并返回一个新的 TensorDict 实例,其中类似的键指向掩盖的值。
- 参数::
mask (torch.Tensor) – 用于张量的布尔掩码。形状必须与 TensorDict 的
batch_size
相匹配。
示例
>>> td = TensorDict(source={'a': torch.zeros(3, 4)}, ... batch_size=[3]) >>> mask = torch.tensor([True, False, False]) >>> td_mask = td.masked_select(mask) >>> td_mask.get("a") tensor([[0., 0., 0., 0.]])
- maximum(other: TensorDictBase | torch.Tensor, *, default: str | CompatibleType | None = None) T ¶
计算
self
和other
的逐元素最大值。- 参数::
other (TensorDict or Tensor) – 另一个输入 tensordict 或张量。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- maximum_(other: TensorDictBase | torch.Tensor) T ¶
maximum()
的就地版本。注意
就地
maximum
不支持default
关键字参数。
- classmethod maybe_dense_stack(items: Sequence[TensorDictBase], dim: int = 0, out: T | None = None, strict: bool = False) T ¶
如果可能,将张量或张量字典密集地堆叠起来,否则堆叠到 LazyStackedTensorDict 中。
示例
>>> td0 = TensorDict({"a": 0}, []) >>> td1 = TensorDict({"b": 0}, []) >>> LazyStackedTensorDict.maybe_dense_stack([td0, td0]) # returns a TensorDict with shape [2] >>> LazyStackedTensorDict.maybe_dense_stack([td0, td1]) # returns a LazyStackedTensorDict with shape [2] >>> LazyStackedTensorDict.maybe_dense_stack(list(torch.randn(2))) # returns a torch.Tensor with shape [2]
- mean(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: torch.dtype | None = None, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入张量字典中所有元素的平均值。
- 参数::
- 关键字参数:
dtype (torch.dtype, optional) – 返回张量的所需数据类型。如果指定,则在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – 如果为
True
,则将在所有 TensorDict 值上进行缩减,并返回一个单一的缩减张量。默认值为False
。
- memmap(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将所有张量写入新张量字典中的相应内存映射张量。
- 参数::
- 关键字参数:
然后张量字典被锁定,这意味着任何非就地的写入操作都会引发异常(例如,重命名、设置或删除条目)。 一旦张量字典解锁,内存映射属性将变为
False
,因为跨进程身份不再保证。- 返回:
一个新的张量字典,其中张量存储在磁盘上,如果
return_early=False
,否则是一个TensorDictFuture
实例。
注意
以这种方式进行序列化对于深度嵌套的张量字典来说可能很慢,因此不建议在训练循环中调用此方法。
- memmap_(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将所有张量写入相应的内存映射张量,就地进行。
- 参数::
- 关键字参数:
num_threads (int, optional) – 用于写入 memmap 张量的线程数。 默认值为 0。
return_early (bool, optional) – 如果为
True
且num_threads>0
,则该方法将返回 tensordict 的一个未来。可以使用 future.result() 查询结果 tensordict。share_non_tensor (bool, optional) – 如果
True
,非张量数据将在进程之间共享,并且对单个节点内任何工作程序的写入操作(例如就地更新或设置)将更新所有其他工作程序的值。 如果非张量叶节点的数量很高(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。 默认值为False
。
然后张量字典被锁定,这意味着任何非就地的写入操作都会引发异常(例如,重命名、设置或删除条目)。 一旦张量字典解锁,内存映射属性将变为
False
,因为跨进程身份不再保证。- 返回:
self if
return_early=False
,否则是一个TensorDictFuture
实例。
注意
以这种方式进行序列化对于深度嵌套的张量字典来说可能很慢,因此不建议在训练循环中调用此方法。
- memmap_like(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
创建与原始张量字典具有相同形状的无内容内存映射张量字典。
- 参数::
- 关键字参数:
然后张量字典被锁定,这意味着任何非就地的写入操作都会引发异常(例如,重命名、设置或删除条目)。 一旦张量字典解锁,内存映射属性将变为
False
,因为跨进程身份不再保证。- 返回:
一个新的
TensorDict
实例,其中数据存储为内存映射张量,如果return_early=False
,否则是一个TensorDictFuture
实例。
注意
这是在磁盘上写入一组大型缓冲区的推荐方法,因为
memmap_()
将复制信息,这对于大型内容来说可能很慢。示例
>>> td = TensorDict({ ... "a": torch.zeros((3, 64, 64), dtype=torch.uint8), ... "b": torch.zeros(1, dtype=torch.int64), ... }, batch_size=[]).expand(1_000_000) # expand does not allocate new memory >>> buffer = td.memmap_like("/path/to/dataset")
- memmap_refresh_()¶
如果内存映射张量字典具有
saved_path
,则刷新内存映射张量字典的内容。此方法如果未关联任何路径,则将引发异常。
- minimum(other: TensorDictBase | torch.Tensor, *, default: str | CompatibleType | None = None) T ¶
计算
self
和other
的逐元素最小值。- 参数::
other (TensorDict or Tensor) – 另一个输入 tensordict 或张量。
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- minimum_(other: TensorDictBase | torch.Tensor) T ¶
minimum()
的就地版本。注意
就地
minimum
不支持default
关键字参数。
- mul(other: TensorDictBase | torch.Tensor, *, default: str | CompatibleType | None = None) T ¶
将
other
乘以self
。\[\text{{out}}_i = \text{{input}}_i \times \text{{other}}_i\]支持广播、类型提升以及整数、浮点数和复数输入。
- 参数::
other (TensorDict, Tensor 或 Number) – 从
self
中减去的张量或数字。- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- mul_(other: TensorDictBase | torch.Tensor) T ¶
mul()
的就地版本。注意
就地
mul
不支持default
关键字参数。
- named_apply(fn: Callable, *others: T, nested_keys: bool = False, batch_size: Sequence[int] | None = None, device: torch.device | None = _NoDefault.ZERO, names: Sequence[str] | None = _NoDefault.ZERO, inplace: bool = False, default: Any = _NoDefault.ZERO, filter_empty: bool | None = None, propagate_lock: bool = False, call_on_nested: bool = False, out: TensorDictBase | None = None, **constructor_kwargs) T | None ¶
将一个键条件可调用函数应用于tensordict中存储的所有值,并将它们设置为新的tensordict。
可调用函数签名必须为
Callable[Tuple[str, Tensor, ...], Optional[Union[Tensor, TensorDictBase]]]
。- 参数::
fn (Callable) – 要应用于tensordict中 (name, tensor) 对的函数。对于每个叶子,只使用其叶子名称(不是完整的 NestedKey)。
*others (TensorDictBase 实例, 可选) – 如果提供,这些 tensordict 实例应具有与 self 匹配的结构。
fn
参数应接收与 tensordict 数量相同的无名输入,包括 self。如果其他 tensordict 具有缺失的条目,可以通过default
关键字参数传递默认值。nested_keys (bool, optional) – 如果为
True
,将使用通往叶子的完整路径。默认为False
,即只将最后一个字符串传递给函数。batch_size (int 序列, 可选) – 如果提供,则生成的 TensorDict 将具有所需的 batch_size。
batch_size
参数应与转换后的 batch_size 匹配。这是一个仅限关键字的参数。device (torch.device, 可选) – 生成的设备(如果有)。
names (str 列表, 可选) – 新的维度名称,如果 batch_size 被修改。
inplace (bool, optional) – 如果为 True,则就地进行更改。默认值为 False。这是一个仅限关键字的参数。
default (Any, 可选) – 其他 tensordict 中缺失条目的默认值。如果没有提供,则缺失的条目将引发 KeyError。
filter_empty (bool, optional) – 如果为
True
,则会过滤掉空的tensordict。这也会降低计算成本,因为不会创建和销毁空数据结构。出于向后兼容性考虑,默认值为False
。propagate_lock (bool, optional) – 如果为
True
,则锁定tensordict将生成另一个锁定tensordict。默认值为False
。call_on_nested (bool, optional) –
如果
True
,则该函数将在第一级张量和容器(TensorDict 或张量类)上调用。在这种情况下,func
负责将它的调用传播到嵌套级别。这允许在将调用传播到嵌套 tensordict 时实现细粒度的行为。如果False
,则该函数只会在叶子节点上调用,并且apply
将负责将该函数分派到所有叶子节点。>>> td = TensorDict({"a": {"b": [0.0, 1.0]}, "c": [1.0, 2.0]}) >>> def mean_tensor_only(val): ... if is_tensor_collection(val): ... raise RuntimeError("Unexpected!") ... return val.mean() >>> td_mean = td.apply(mean_tensor_only) >>> def mean_any(val): ... if is_tensor_collection(val): ... # Recurse ... return val.apply(mean_any, call_on_nested=True) ... return val.mean() >>> td_mean = td.apply(mean_any, call_on_nested=True)
out (TensorDictBase, 可选) –
要写入结果的 tensordict。这可以用来避免创建一个新的 tensordict。
>>> td = TensorDict({"a": 0}) >>> td.apply(lambda x: x+1, out=td) >>> assert (td==1).all()
警告
如果对 tensordict 执行的操作需要访问多个键才能进行单个计算,则提供等于
self
的out
参数会导致操作静默地提供错误的结果。例如>>> td = TensorDict({"a": 1, "b": 1}) >>> td.apply(lambda x: x+td["a"])["b"] # Right! tensor(2) >>> td.apply(lambda x: x+td["a"], out=td)["b"] # Wrong! tensor(3)
**constructor_kwargs – 要传递给 TensorDict 构造函数的其他关键字参数。
- 返回:
一个包含经过转换的张量的新的 tensordict。
示例
>>> td = TensorDict({ ... "a": -torch.ones(3), ... "nested": {"a": torch.ones(3), "b": torch.zeros(3)}}, ... batch_size=[3]) >>> def name_filter(name, tensor): ... if name == "a": ... return tensor >>> td.named_apply(name_filter) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), nested: TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> def name_filter(name, *tensors): ... if name == "a": ... r = 0 ... for tensor in tensors: ... r = r + tensor ... return tensor >>> out = td.named_apply(name_filter, td) >>> print(out) TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), nested: TensorDict( fields={ a: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False)}, batch_size=torch.Size([3]), device=None, is_shared=False) >>> print(out["a"]) tensor([-1., -1., -1.])
注意
如果函数返回
None
,则将忽略该条目。这可用于筛选 tensordict 中的数据。>>> td = TensorDict({"1": 1, "2": 2, "b": {"2": 2, "1": 1}}, []) >>> def name_filter(name, tensor): ... if name == "1": ... return tensor >>> td.named_apply(name_filter) TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- property names¶
tensordict 的维度名称。
可以使用
names
参数在构造时设置名称。有关如何在构造后设置名称的详细信息,请参阅
refine_names()
。
- nanmean(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: torch.dtype | None = None, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入tensordict中所有非NaN元素的平均值。
- 参数::
- 关键字参数:
dtype (torch.dtype, optional) – 返回张量的所需数据类型。如果指定,则在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – 如果为
True
,则将在所有 TensorDict 值上进行缩减,并返回一个单一的缩减张量。默认值为False
。
- nansum(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: torch.dtype | None = None, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回 tensordict 中所有非 NaN 元素的总和。
- 参数::
- 关键字参数:
dtype (torch.dtype, optional) – 返回张量的所需数据类型。如果指定,则在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – 如果为
True
,则将在所有 TensorDict 值上进行缩减,并返回一个单一的缩减张量。默认值为False
。
- property ndim: int¶
参见
batch_dims()
。
- ndimension() int ¶
参见
batch_dims()
。
- neg() T ¶
计算 TensorDict 中每个元素的
neg()
值。
- neg_() T ¶
就地计算 TensorDict 中每个元素的
neg()
值。
- new_empty(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回一个大小为
size
且包含空张量的 TensorDict。默认情况下,返回的 TensorDict 与此 tensordict 具有相同的
torch.dtype
和torch.device
。- 参数::
size (int...) – 定义输出张量形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的所需类型。默认值:如果为
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的所需设备。默认值:如果为
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果自动微分应记录对返回张量的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的所需布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,则返回的张量将在固定内存中分配。仅适用于 CPU 张量。默认值:
False
。
- new_full(size: Size, fill_value, *, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回大小为
size
且用 1 填充的 TensorDict。默认情况下,返回的 TensorDict 与此 tensordict 具有相同的
torch.dtype
和torch.device
。- 参数::
size (整数序列) – 定义输出张量形状的整数列表、元组或 torch.Size。
fill_value (标量) – 用来填充输出张量的数字。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的所需类型。默认值:如果为
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的所需设备。默认值:如果为
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果自动微分应记录对返回张量的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的所需布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,则返回的张量将在固定内存中分配。仅适用于 CPU 张量。默认值:
False
。
- new_ones(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回大小为
size
且用 1 填充的 TensorDict。默认情况下,返回的 TensorDict 与此 tensordict 具有相同的
torch.dtype
和torch.device
。- 参数::
size (int...) – 定义输出张量形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的所需类型。默认值:如果为
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的所需设备。默认值:如果为
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果自动微分应记录对返回张量的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的所需布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,则返回的张量将在固定内存中分配。仅适用于 CPU 张量。默认值:
False
。
- new_tensor(data: torch.Tensor | TensorDictBase, *, dtype: torch.dtype = None, device: DeviceType = _NoDefault.ZERO, requires_grad: bool = False, pin_memory: bool | None = None)¶
返回一个新的 TensorDict,其中数据为张量 `data`。
默认情况下,返回的 TensorDict 值具有与该张量相同的 `torch.dtype` 和 `torch.device`。
`data` 也可以是张量集合 (`TensorDict` 或 `tensorclass`),在这种情况下,`new_tensor` 方法将遍历 `self` 和 `data` 的张量对。
- 参数::
data (torch.Tensor 或 TensorDictBase) – 要复制的数据。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的所需类型。默认值:如果为
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的所需设备。默认值:如果为
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果自动微分应记录对返回张量的操作。默认值:
False
。pin_memory (bool, 可选) – 如果设置,则返回的张量将在固定内存中分配。仅适用于 CPU 张量。默认值:
False
。
- new_zeros(*size: Size, dtype: Optional[dtype] = None, device: Union[device, str, int] = _NoDefault.ZERO, requires_grad: bool = False, layout: layout = torch.strided, pin_memory: Optional[bool] = None)¶
返回一个大小为 `size` 且填充为 0 的 TensorDict。
默认情况下,返回的 TensorDict 与此 tensordict 具有相同的
torch.dtype
和torch.device
。- 参数::
size (int...) – 定义输出张量形状的整数列表、元组或 torch.Size。
- 关键字参数:
dtype (torch.dtype, 可选) – 返回的 tensordict 的所需类型。默认值:如果为
None
,则 torch.dtype 将保持不变。device (torch.device, 可选) – 返回的 tensordict 的所需设备。默认值:如果为
None
,则torch.device
将保持不变。requires_grad (bool, 可选) – 如果自动微分应记录对返回张量的操作。默认值:
False
。layout (torch.layout, 可选) – 返回的 TensorDict 值的所需布局。默认值:
torch.strided
。pin_memory (bool, 可选) – 如果设置,则返回的张量将在固定内存中分配。仅适用于 CPU 张量。默认值:
False
。
- norm(*, out=None, dtype: torch.dtype | None = None)¶
计算 tensordict 中每个张量的范数。
- 关键字参数:
out (TensorDict, 可选) – 输出 tensordict。
dtype (torch.dtype, 可选) – 输出 dtype (torch>=2.4)。
- numpy()¶
将 tensordict 转换为 (可能嵌套的) numpy 数组字典。
非张量数据将按原样公开。
示例
>>> from tensordict import TensorDict >>> import torch >>> data = TensorDict({"a": {"b": torch.zeros(()), "c": "a string!"}}) >>> print(data) TensorDict( fields={ a: TensorDict( fields={ b: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.float32, is_shared=False), c: NonTensorData(data=a string!, batch_size=torch.Size([]), device=None)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> print(data.numpy()) {'a': {'b': array(0., dtype=float32), 'c': 'a string!'}}
- permute(*args, **kwargs)¶
返回 tensordict 的视图,其中批次维度根据 dims 重新排列。
- 参数::
*dims_list (int) – tensordict 批次维度的新的排序顺序。或者,可以提供一个单个整数可迭代对象。
dims (int 列表) – 调用 permute(…) 的替代方法。
- 返回:
一个具有所需顺序批次维度的新的 tensordict。
示例
>>> tensordict = TensorDict({"a": torch.randn(3, 4, 5)}, [3, 4]) >>> print(tensordict.permute([1, 0])) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0])) >>> print(tensordict.permute(1, 0)) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0])) >>> print(tensordict.permute(dims=[1, 0])) PermutedTensorDict( source=TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=cpu, is_shared=False), op=permute(dims=[1, 0]))
- pin_memory(num_threads: int | None = None, inplace: bool = False) T ¶
在存储的张量上调用
pin_memory()
。- 参数::
num_threads (int or str) – 如果提供,则用于在叶子节点上调用
pin_memory
的线程数。默认为None
,它在ThreadPoolExecutor(max_workers=None)
中设置了大量的线程。要在线程池中执行所有对pin_memory()
的调用,请传递num_threads=0
。inplace (bool, optional) – 如果为
True
,则会对 tensordict 进行就地修改。默认为False
。
- pin_memory_(num_threads: int | str = 0) T ¶
在存储的张量上调用
pin_memory()
,并返回就地修改的 TensorDict。
- pop(key: NestedKey, default: Any = _NoDefault.ZERO) Tensor ¶
从 tensordict 中移除并返回一个值。
如果该值不存在,并且未提供默认值,则会抛出 KeyError。
- 参数::
key (str or nested key) – 要查找的条目。
default (Any, optional) – 如果找不到 key,则返回的值。
示例
>>> td = TensorDict({"1": 1}, []) >>> one = td.pop("1") >>> assert one == 1 >>> none = td.pop("1", default=None) >>> assert none is None
- pow(other: TensorDictBase | torch.Tensor, *, default: str | CompatibleType | None = None) T ¶
使用
other
对self
中的每个元素进行幂运算,并返回包含结果的张量。other
可以是单个float
数字、Tensor 或TensorDict
。当
other
为张量时,input
和other
的形状必须是可广播的。- 参数::
other (float, tensor or tensordict) – 指数值
- 关键字参数:
default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- pow_(other: TensorDictBase | torch.Tensor) T ¶
pow()
的就地版本。注意
就地
pow
不支持default
关键字参数。
- prod(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: torch.dtype | None = None, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素值的乘积。
- 参数::
- 关键字参数:
dtype (torch.dtype, optional) – 返回张量的所需数据类型。如果指定,则在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – 如果为
True
,则将在所有 TensorDict 值上进行缩减,并返回一个单一的缩减张量。默认值为False
。
- qint32()¶
将所有张量转换为
torch.qint32
。
- qint8()¶
将所有张量转换为
torch.qint8
。
- quint4x2()¶
将所有张量转换为
torch.quint4x2
。
- quint8()¶
将所有张量转换为
torch.quint8
。
- reciprocal() T ¶
计算 TensorDict 中每个元素的
reciprocal()
值。
- reciprocal_() T ¶
原地计算 TensorDict 中每个元素的
reciprocal()
值。
- recv(src: int, *, group: 'dist.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) int ¶
接收 tensordict 的内容并用它更新内容。
有关上下文,请查看 send 方法中的示例。
- 参数::
src (int) – 源工作进程的排名。
- 关键字参数:
- reduce(dst, op=None, async_op=False, return_premature=False, group=None)¶
在所有机器上减少 tensordict。
只有
rank
为 dst 的进程将收到最终结果。
- refine_names(*names) T ¶
根据 names 细化 self 的维度名称。
细化是重命名的一个特例,它“提升”了未命名的维度。一个 None 维度可以被细化为具有任何名称;一个命名维度只能被细化为具有相同的名称。
由于命名张量可以与未命名张量共存,因此细化名称提供了一种很好的方法来编写与命名和未命名张量都兼容的命名张量感知代码。
names 可能包含最多一个 Ellipsis (…). Ellipsis 会被贪婪地扩展;它会原地扩展以使用 self.names 中相应索引的名称来填充 names,使其与 self.dim() 的长度相同。
返回值:具有根据输入命名的维度的相同 tensordict。
示例
>>> td = TensorDict({}, batch_size=[3, 4, 5, 6]) >>> tdr = td.refine_names(None, None, None, "d") >>> assert tdr.names == [None, None, None, "d"] >>> tdr = td.refine_names("a", None, None, "d") >>> assert tdr.names == ["a", None, None, "d"]
- rename(*names, **rename_map)¶
返回 tensordict 的克隆,其维度已重命名。
示例
>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4]) >>> td.names = list("abcd") >>> td_rename = td.rename(c="g") >>> assert td_rename.names == list("abgd")
- rename_(*names, **rename_map)¶
与
rename()
相同,但会原地执行重命名。示例
>>> td = TensorDict({}, batch_size=[1, 2, 3 ,4]) >>> td.names = list("abcd") >>> assert td.rename_(c="g") >>> assert td.names == list("abgd")
- rename_key_(old_key: NestedKey, new_key: NestedKey, safe: bool = False) T ¶
使用新的字符串重命名键并返回具有更新的键名称的相同 tensordict。
- replace(*args, **kwargs)¶
创建 tensordict 的浅层副本,其中条目已被替换。
接受一个未命名的参数,该参数必须是
TensorDictBase
子类的字典。此外,可以使用命名的关键字参数更新第一级条目。- 返回:
如果输入非空,则返回
self
的副本,其中包含更新的条目。如果提供空字典或没有字典,并且 kwargs 为空,则返回self
。
- requires_grad_(requires_grad=True) T ¶
更改是否应该记录此张量的操作的自动梯度:原地设置此张量的 requires_grad 属性。
返回此 tensordict。
- 参数::
requires_grad (bool, 可选) – 是否应该记录自动梯度以对此 tensordict 执行操作。默认值为
True
。
- reshape(*args, **kwargs) T ¶
返回具有所需形状的连续的重塑张量。
- 参数::
*shape (int) – 生成的 tensordict 的新形状。
- 返回:
具有重塑键的 TensorDict
示例
>>> td = TensorDict({ ... 'x': torch.arange(12).reshape(3, 4), ... }, batch_size=[3, 4]) >>> td = td.reshape(12) >>> print(td['x']) torch.Tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
- round() T ¶
计算 TensorDict 中每个元素的
round()
值。
- round_() T ¶
原地计算 TensorDict 中每个元素的
round()
值。
- save(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T ¶
将 tensordict 保存到磁盘。
此函数是
memmap()
的代理。
- property saved_path¶
返回一个 memmap 保存的 TensorDict 存储的路径。
当 is_memmap() 返回
False
时(例如,当 tensordict 被解锁时),该参数将失效。
- select(*keys: NestedKey, inplace: bool = False, strict: bool = True) T ¶
选择 tensordict 的键,并返回一个仅包含所选键的新 tensordict。
值不会被复制:对原始 tensordict 或新 tensordict 的张量进行就地修改会导致两个 tensordict 都发生变化。
- 参数::
- 返回:
包含仅选定键的新 tensordict(如果
inplace=True
,则为相同的 tensordict)。
注意
要选择 tensordict 中的键并返回一个没有这些键的版本,请参见
split_keys()
方法。示例
>>> from tensordict import TensorDict >>> td = TensorDict({"a": 0, "b": {"c": 1, "d": 2}}, []) >>> td.select("a", ("b", "c")) TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.select("a", "b") TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), d: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> td.select("this key does not exist", strict=False) TensorDict( fields={ }, batch_size=torch.Size([]), device=None, is_shared=False)
- send(dst: int, *, group: 'dist.ProcessGroup' | None = None, init_tag: int = 0, pseudo_rand: bool = False) None ¶
将 tensordict 的内容发送到远端工作器。
- 参数::
dst (int) – 应发送内容的目标工作进程的排名。
- 关键字参数:
示例
>>> from torch import multiprocessing as mp >>> from tensordict import TensorDict >>> import torch >>> >>> >>> def client(): ... torch.distributed.init_process_group( ... "gloo", ... rank=1, ... world_size=2, ... init_method=f"tcp://127.0.0.1:10003", ... ) ... ... td = TensorDict( ... { ... ("a", "b"): torch.randn(2), ... "c": torch.randn(2, 3), ... "_": torch.ones(2, 1, 5), ... }, ... [2], ... ) ... td.send(0) ... >>> >>> def server(queue): ... torch.distributed.init_process_group( ... "gloo", ... rank=0, ... world_size=2, ... init_method=f"tcp://127.0.0.1:10003", ... ) ... td = TensorDict( ... { ... ("a", "b"): torch.zeros(2), ... "c": torch.zeros(2, 3), ... "_": torch.zeros(2, 1, 5), ... }, ... [2], ... ) ... td.recv(1) ... assert (td != 0).all() ... queue.put("yuppie") ... >>> >>> if __name__=="__main__": ... queue = mp.Queue(1) ... main_worker = mp.Process(target=server, args=(queue,)) ... secondary_worker = mp.Process(target=client) ... ... main_worker.start() ... secondary_worker.start() ... out = queue.get(timeout=10) ... assert out == "yuppie" ... main_worker.join() ... secondary_worker.join()
- set(key: NestedKey, item: Tensor, inplace: bool = False, *, non_blocking: bool = False, **kwargs: Any) T ¶
设置新的键值对。
- 参数::
key (str, str 元组) – 要设置的键的名称。
item (torch.Tensor 或 等效类型, TensorDictBase 实例) – 要存储在 tensordict 中的值。
inplace (bool, 可选) – 如果为
True
,并且键与 tensordict 中的现有键匹配,则该键值对的更新将就地发生。如果 inplace 为True
且找不到条目,则会将其添加。要进行更严格的就地操作,请使用set_()
。默认值为False
。
- 关键字参数:
non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。- 返回:
self
示例
>>> td = TensorDict({}, batch_size[3, 4]) >>> td.set("x", torch.randn(3, 4)) >>> y = torch.randn(3, 4, 5) >>> td.set("y", y, inplace=True) # works, even if 'y' is not present yet >>> td.set("y", torch.zeros_like(y), inplace=True) >>> assert (y==0).all() # y values are overwritten >>> td.set("y", torch.ones(5), inplace=True) # raises an exception as shapes mismatch
- set_(key: NestedKey, item: Tensor, *, non_blocking: bool = False) T ¶
将值设置为现有键,同时保留原始存储。
- 参数::
key (str) – 值的名称
item (torch.Tensor 或 兼容类型, TensorDictBase) – 要存储在 tensordict 中的值
- 关键字参数:
non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。- 返回:
self
示例
>>> td = TensorDict({}, batch_size[3, 4]) >>> x = torch.randn(3, 4) >>> td.set("x", x) >>> td.set_("x", torch.zeros_like(x)) >>> assert (x == 0).all()
- set_at_(key: NestedKey, value: Tensor, index: Union[None, int, slice, str, Tensor, List[Any], Tuple[Any, ...]], *, non_blocking: bool = False) T ¶
在由
index
指示的索引处就地设置值。- 参数::
key (str, tuple of str) – 要修改的键。
value (torch.Tensor) – 要在索引 index 处设置的值。
- 关键字参数:
non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。- 返回:
self
示例
>>> td = TensorDict({}, batch_size[3, 4]) >>> x = torch.randn(3, 4) >>> td.set("x", x) >>> td.set_at_("x", value=torch.ones(1, 4), index=slice(1)) >>> assert (x[0] == 1).all()
- set_non_tensor(key: NestedKey, value: Any)¶
使用
tensordict.tensorclass.NonTensorData
在 tensordict 中注册非张量值。可以使用
TensorDictBase.get_non_tensor()
或直接使用 get 检索该值,它将返回tensordict.tensorclass.NonTensorData
对象。返回:self
示例
>>> data = TensorDict({}, batch_size=[]) >>> data.set_non_tensor(("nested", "the string"), "a string!") >>> assert data.get_non_tensor(("nested", "the string")) == "a string!" >>> # regular `get` works but returns a NonTensorData object >>> data.get(("nested", "the string")) NonTensorData( data='a string!', batch_size=torch.Size([]), device=None, is_shared=False)
- setdefault(key: NestedKey, default: Tensor, inplace: bool = False) Tensor ¶
如果
key
不在 tensordict 中,则插入具有default
值的key
条目。如果
key
在 tensordict 中,则返回key
的值,否则返回default
。- 参数::
key (str or nested key) – 值的名称。
default (torch.Tensor or compatible type, TensorDictBase) – 如果键不存在,要存储在 tensordict 中的值。
- 返回:
tensordict 中键的值。如果键以前未设置,则为默认值。
示例
>>> td = TensorDict({}, batch_size=[3, 4]) >>> val = td.setdefault("a", torch.zeros(3, 4)) >>> assert (val == 0).all() >>> val = td.setdefault("a", torch.ones(3, 4)) >>> assert (val == 0).all() # output is still 0
- property shape: Size¶
参见
batch_size
。
将所有张量放置在共享内存中。
然后锁定 TensorDict,这意味着任何非就地写入操作都会引发异常(例如,重命名、设置或删除条目)。相反,一旦 tensordict 解锁,share_memory 属性将变为
False
,因为不再保证跨进程身份。- 返回:
self
- sigmoid() T ¶
计算 TensorDict 中每个元素的
sigmoid()
值。
- sigmoid_() T ¶
就地计算 TensorDict 中每个元素的
sigmoid()
值。
- sign() T ¶
计算 TensorDict 中每个元素的
sign()
值。
- sign_() T ¶
就地计算 TensorDict 中每个元素的
sign()
值。
- sin() T ¶
计算 TensorDict 中每个元素的
sin()
值。
- sin_() T ¶
就地计算 TensorDict 中每个元素的
sin()
值。
- sinh() T ¶
计算 TensorDict 中每个元素的
sinh()
值。
- sinh_() T ¶
就地计算 TensorDict 中每个元素的
sinh()
值。
- size(dim: int | None = None) torch.Size | int ¶
返回由
dim
指示的维度的尺寸。如果未指定
dim
,则返回 TensorDict 的batch_size
属性。
- property sorted_keys: list[NestedKey]¶
返回按字母顺序排序的键。
不支持额外参数。
如果 TensorDict 被锁定,则键将被缓存,直到 tensordict 被解锁以加快执行速度。
- split(split_size: int | list[int], dim: int = 0) list[TensorDictBase] ¶
使用给定维度中指定的尺寸分割 TensorDict 中的每个张量,类似于 torch.split。
返回一个
TensorDict
实例列表,其中包含对分割后的项目块的视图。- 参数::
- 返回:
具有给定维度中指定大小的 TensorDict 列表。
示例
>>> td = TensorDict({ ... 'x': torch.arange(12).reshape(3, 4), ... }, batch_size=[3, 4]) >>> td0, td1 = td.split([1, 2], dim=0) >>> print(td0['x']) torch.Tensor([[0, 1, 2, 3]])
- split_keys(*key_sets, inplace=False, strict: bool = True, reproduce_struct: bool = False)¶
将 tensordict 分割成给定一个或多个键集的子集。
该方法将返回
N+1
个 tensordict,其中N
是提供的参数数量。- 参数::
注意
None
非张量值将被忽略,不会返回。注意
该方法不会检查提供的列表中是否存在重复项。
示例
>>> td = TensorDict( ... a=0, ... b=0, ... c=0, ... d=0, ... ) >>> td_a, td_bc, td_d = td.split_keys(["a"], ["b", "c"]) >>> print(td_bc)
- sqrt()¶
计算
self
的逐元素平方根。
- squeeze(*args, **kwargs)¶
压缩所有张量以获取 -self.batch_dims+1 到 self.batch_dims-1 之间的维度,并将它们返回到一个新的 tensordict 中。
- 参数::
dim (可选[int]) – 要压缩的维度。如果 dim 为
None
,则将压缩所有单例维度。默认值为None
。
示例
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 1, 4, 2), ... }, batch_size=[3, 1, 4]) >>> td = td.squeeze() >>> td.shape torch.Size([3, 4]) >>> td.get("x").shape torch.Size([3, 4, 2])
此操作也可以用作上下文管理器。对原始 tensordict 的更改将发生在外部,即原始张量的内容不会改变。这也假定 tensordict 未锁定(否则,需要解锁 tensordict)。此功能与隐式压缩不兼容。
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 1, 4, 2), ... }, batch_size=[3, 1, 4]) >>> with td.squeeze(1) as tds: ... tds.set("y", torch.zeros(3, 4)) >>> assert td.get("y").shape == [3, 1, 4]
- classmethod stack(input, dim=0, *, out=None)¶
将 tensordict 沿着给定维度堆叠成单个 tensordict。
此调用等效于调用
torch.stack()
,但与 torch.compile 兼容。
- state_dict(destination=None, prefix='', keep_vars=False, flatten=False) OrderedDict[str, Any] ¶
从 tensordict 生成 state_dict。
state_dict 的结构将保持嵌套,除非
flatten
设置为True
。tensordict state_dict 包含重建 tensordict 所需的所有张量和元数据(目前不支持名称)。
- 参数::
destination (dict, 可选) – 如果提供,则 tensordict 的状态将更新到字典中,并返回同一个对象。否则,将创建一个
OrderedDict
并返回。默认值:None
。prefix (str, 可选) – 添加到张量名称的前缀,用于组成 state_dict 中的键。默认值:
''
。keep_vars (bool, 可选) – 默认情况下,state_dict 中返回的
torch.Tensor
项目与 autograd 分离。如果将其设置为True
,则不会执行分离。默认值:False
。flatten (bool, 可选) – 结构是否应该使用
"."
字符展平。默认值为False
。
示例
>>> data = TensorDict({"1": 1, "2": 2, "3": {"3": 3}}, []) >>> sd = data.state_dict() >>> print(sd) OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3', OrderedDict([('3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])), ('__batch_size', torch.Size([])), ('__device', None)]) >>> sd = data.state_dict(flatten=True) OrderedDict([('1', tensor(1)), ('2', tensor(2)), ('3.3', tensor(3)), ('__batch_size', torch.Size([])), ('__device', None)])
- std(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入张量字典中所有元素的标准差值。
- sub(other: TensorDictBase | float, *, alpha: float | None = None, default: str | CompatibleType | None = None)¶
从
self
中减去other
,乘以alpha
。\[\text{{out}}_i = \text{{input}}_i - \text{{alpha}} \times \text{{other}}_i\]支持广播、类型提升以及整数、浮点数和复数输入。
- 参数::
other (TensorDict, Tensor 或 Number) – 从
self
中减去的张量或数字。- 关键字参数:
alpha (数字) –
other
的乘数。default (torch.Tensor 或 str, 可选) – 用于排他性条目的默认值。如果没有提供,则两个 tensordict 的键列表必须完全匹配。如果传递了
default="intersection"
,则只考虑相交的键集,其他键将被忽略。在所有其他情况下,default
将用于操作两侧的所有缺失条目。
- sub_(other: TensorDictBase | float, alpha: float | None = None)¶
sub()
的就地版本。注意
就地
sub
不支持default
关键字参数。
- sum(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, dtype: torch.dtype | None = None, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入张量字典中所有元素的总和值。
- 参数::
- 关键字参数:
dtype (torch.dtype, optional) – 返回张量的所需数据类型。如果指定,则在执行操作之前将输入张量转换为 dtype。这对于防止数据类型溢出很有用。默认值:
None
。reduce (bool, optional) – 如果为
True
,则将在所有 TensorDict 值上进行缩减,并返回一个单一的缩减张量。默认值为False
。
- tan() T ¶
计算张量字典中每个元素的
tan()
值。
- tan_() T ¶
就地计算张量字典中每个元素的
tan()
值。
- tanh() T ¶
计算张量字典中每个元素的
tanh()
值。
- tanh_() T ¶
就地计算张量字典中每个元素的
tanh()
值。
- to(*args, **kwargs) T ¶
将张量字典类映射到另一个设备、数据类型或另一个张量字典类(如果允许)。
不允许将张量转换为新的数据类型,因为张量字典不绑定到包含单个张量数据类型。
- 参数::
device (torch.device, 可选) – 张量字典的目标设备。
dtype (torch.dtype, 可选) – tensordict 所需的浮点或复数 dtype。
tensor (torch.Tensor, 可选) – Tensor 类型的 dtype 和设备将作为此 TensorDict 中所有 tensors 的 dtype 和设备。
- 关键字参数:
non_blocking (bool, 可选) – 操作是否阻塞。
memory_format (torch.memory_format, 可选) – 此 tensordict 中 4D 参数和缓冲区的所需内存格式。
batch_size (torch.Size, 可选) – 输出 tensordict 的结果批量大小。
other (TensorDictBase, 可选) –
TensorDict 实例,其 dtype 和设备将作为此 TensorDict 中所有 tensors 的 dtype 和设备。 .. 注意:: 由于
TensorDictBase
实例没有dtype,因此 dtype 从示例叶节点收集。如果有多个 dtype,则不进行 dtype 转换。
non_blocking_pin (bool, 可选) –
如果为
True
,则在将 tensors 发送到设备之前将它们固定。这将异步完成,但可以通过num_threads
参数进行控制。注意
调用
tensordict.pin_memory().to("cuda")
通常会比tensordict.to("cuda", non_blocking_pin=True)
慢得多,因为在第二种情况下,pin_memory 是异步调用的。如果 tensors 的大小和数量都很大,则多线程pin_memory
通常会有益:当发送的 tensors 太少时,生成线程和收集数据的开销大于多线程的益处,如果 tensors 的大小很小,则迭代长列表的开销也会过大。num_threads (int 或 None, 可选) – 如果
non_blocking_pin=True
,则用于pin_memory
的线程数。默认情况下,将生成max(1, torch.get_num_threads())
个线程。num_threads=0
将取消对 pin_memory() 调用的任何多线程。
- 返回:
如果设备与 tensordict 设备不同,或者如果传递了 dtype,则返回一个新的 tensordict 实例。否则,返回相同的 tensordict。
batch_size
仅在原地进行修改。
注意
如果 TensorDict 已合并,则结果 TensorDict 也将被合并。每个新的 tensor 将是合并存储的视图,并转换为所需的设备。
示例
>>> data = TensorDict({"a": 1.0}, [], device=None) >>> data_cuda = data.to("cuda:0") # casts to cuda >>> data_int = data.to(torch.int) # casts to int >>> data_cuda_int = data.to("cuda:0", torch.int) # multiple casting >>> data_cuda = data.to(torch.randn(3, device="cuda:0")) # using an example tensor >>> data_cuda = data.to(other=TensorDict({}, [], device="cuda:0")) # using a tensordict example
- to_h5(filename, **kwargs)¶
将 tensordict 转换为具有 h5 后端的 PersistentTensorDict。
- 参数::
filename (str 或 path) – h5 文件的路径。
device (torch.device 或 兼容, 可选) – 返回 tensors 后所期望的设备。默认为
None
(默认在 cpu 上)。**kwargs – 要传递给
h5py.File.create_dataset()
的 kwargs。
- 返回:
一个
PersitentTensorDict
实例,链接到新创建的文件。
示例
>>> import tempfile >>> import timeit >>> >>> from tensordict import TensorDict, MemoryMappedTensor >>> td = TensorDict({ ... "a": MemoryMappedTensor.from_tensor(torch.zeros(()).expand(1_000_000)), ... "b": {"c": MemoryMappedTensor.from_tensor(torch.zeros(()).expand(1_000_000, 3))}, ... }, [1_000_000]) >>> >>> file = tempfile.NamedTemporaryFile() >>> td_h5 = td.to_h5(file.name, compression="gzip", compression_opts=9) >>> print(td_h5) PersistentTensorDict( fields={ a: Tensor(shape=torch.Size([1000000]), device=cpu, dtype=torch.float32, is_shared=False), b: PersistentTensorDict( fields={ c: Tensor(shape=torch.Size([1000000, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([1000000]), device=None, is_shared=False)}, batch_size=torch.Size([1000000]), device=None, is_shared=False)
- to_module(module: nn.Module, *, inplace: bool | None = None, return_swap: bool = True, swap_dest=None, use_state_dict: bool = False, non_blocking: bool = False, memo=None)¶
将 TensorDictBase 实例的内容递归地写入给定 nn.Module 的属性。
- 参数::
module (nn.Module) – 要将参数写入的模块。
- 关键字参数:
inplace (bool, 可选) – 如果为
True
,则模块中的参数或 tensors 将被原地更新。默认为False
。return_swap (bool, 可选) – 如果为
True
,则将返回旧的参数配置。默认为False
。swap_dest (TensorDictBase, 可选) – 如果
return_swap
为True
,则为应写入交换的 tensordict。use_state_dict (bool, 可选) – 如果为
True
,则将使用 state-dict API 加载参数(包括 state-dict 钩子)。默认为False
。non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。
示例
>>> from torch import nn >>> module = nn.TransformerDecoder( ... decoder_layer=nn.TransformerDecoderLayer(nhead=4, d_model=4), ... num_layers=1) >>> params = TensorDict.from_module(module) >>> params.zero_() >>> params.to_module(module) >>> assert (module.layers[0].linear1.weight == 0).all()
- to_namedtuple(dest_cls: type | None = None)¶
将 tensordict 转换为命名元组。
- 参数::
dest_cls (Type, 可选) – 要使用的可选命名元组类。
示例
>>> from tensordict import TensorDict >>> import torch >>> data = TensorDict({ ... "a_tensor": torch.zeros((3)), ... "nested": {"a_tensor": torch.zeros((3)), "a_string": "zero!"}}, [3]) >>> data.to_namedtuple() GenericDict(a_tensor=tensor([0., 0., 0.]), nested=GenericDict(a_tensor=tensor([0., 0., 0.]), a_string='zero!'))
- to_padded_tensor(padding=0.0, mask_key: NestedKey | None = None)¶
将所有嵌套的 tensors 转换为填充版本,并相应地调整批量大小。
- 参数::
padding (float) – tensordict 中 tensors 的填充值。默认为
0.0
。mask_key (NestedKey, 可选) – 如果提供,则为写入有效值掩码的键。如果异构维度不是 tensordict 批量大小的一部分,则会导致错误。默认为
None
- to_pytree()¶
将 tensordict 转换为 PyTree。
如果 tensordict 不是从 pytree 创建的,则此方法将直接返回
self
,而不进行修改。有关更多信息和示例,请参见
from_pytree()
。
- to_tensordict() T ¶
从 TensorDictBase 返回一个常规的 TensorDict 实例。
- 返回:
包含相同值的新的 TensorDict 对象。
- transpose(dim0, dim1)¶
返回一个张量字典,它是输入的转置版本。给定的维度
dim0
和dim1
被交换。对转置张量字典的原地或非原地修改也会影响原始张量字典,因为内存是共享的,并且操作被映射回原始张量字典。
示例
>>> tensordict = TensorDict({"a": torch.randn(3, 4, 5)}, [3, 4]) >>> tensordict_transpose = tensordict.transpose(0, 1) >>> print(tensordict_transpose.shape) torch.Size([4, 3]) >>> tensordict_transpose.set("b",, torch.randn(4, 3)) >>> print(tensordict.get("b").shape) torch.Size([3, 4])
- trunc() T ¶
计算张量字典中每个元素的
trunc()
值。
- trunc_() T ¶
原地计算张量字典中每个元素的
trunc()
值。
- uint16()¶
将所有张量转换为
torch.uint16
。
- uint32()¶
将所有张量转换为
torch.uint32
。
- uint64()¶
将所有张量转换为
torch.uint64
。
- uint8()¶
将所有张量转换为
torch.uint8
。
- unbind(dim: int) tuple[T, ...] ¶
返回一个索引张量字典的元组,沿着指示的维度解绑。
示例
>>> td = TensorDict({ ... 'x': torch.arange(12).reshape(3, 4), ... }, batch_size=[3, 4]) >>> td0, td1, td2 = td.unbind(0) >>> td0['x'] tensor([0, 1, 2, 3]) >>> td1['x'] tensor([4, 5, 6, 7])
- unflatten(dim, unflattened_size)¶
对张量字典进行展平,将其扩展到所需的形状。
- 参数::
dim (int) – 指定要展平的输入张量的维度。
unflattened_size (shape) – 是张量字典中展平维度的新形状。
示例
>>> td = TensorDict({ ... "a": torch.arange(60).view(3, 4, 5), ... "b": torch.arange(12).view(3, 4)}, ... batch_size=[3, 4]) >>> td_flat = td.flatten(0, 1) >>> td_unflat = td_flat.unflatten(0, [3, 4]) >>> assert (td == td_unflat).all()
- unflatten_keys(separator: str = '.', inplace: bool = False) T ¶
将一个扁平的张量字典递归地转换为嵌套的张量字典。
张量字典类型将丢失,结果将是一个简单的 TensorDict 实例。嵌套张量字典的元数据将从根节点推断:数据树中的所有实例将共享相同的批次大小、维度名称和设备。
- 参数::
示例
>>> data = TensorDict({"a": 1, "b - c": 2, "e - f - g": 3}, batch_size=[]) >>> data.unflatten_keys(separator=" - ") TensorDict( fields={ a: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), b: TensorDict( fields={ c: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False), e: TensorDict( fields={ f: TensorDict( fields={ g: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
此方法和
unflatten_keys()
在处理 state-dict 时特别有用,因为它们可以使将扁平字典无缝地转换为模拟模型结构的数据结构成为可能。示例
>>> model = torch.nn.Sequential(torch.nn.Linear(3 ,4)) >>> ddp_model = torch.ao.quantization.QuantWrapper(model) >>> state_dict = TensorDict(ddp_model.state_dict(), batch_size=[]).unflatten_keys(".") >>> print(state_dict) TensorDict( fields={ module: TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model_state_dict = state_dict.get("module") >>> print(model_state_dict) TensorDict( fields={ 0: TensorDict( fields={ bias: Tensor(shape=torch.Size([4]), device=cpu, dtype=torch.float32, is_shared=False), weight: Tensor(shape=torch.Size([4, 3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False) >>> model.load_state_dict(dict(model_state_dict.flatten_keys(".")))
- unsqueeze(*args, **kwargs)¶
为位于 -td.batch_dims 和 td.batch_dims 之间的维度对所有张量进行扩展,并将它们返回到一个新的张量字典中。
- 参数::
dim (int) – 要扩展的维度
示例
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 4, 2), ... }, batch_size=[3, 4]) >>> td = td.unsqueeze(-2) >>> td.shape torch.Size([3, 1, 4]) >>> td.get("x").shape torch.Size([3, 1, 4, 2])
此操作也可以用作上下文管理器。对原始张量字典的更改将发生在非原地,即原始张量的内容不会改变。这也假设张量字典没有被锁定(否则,需要解锁张量字典)。
>>> td = TensorDict({ ... 'x': torch.arange(24).reshape(3, 4, 2), ... }, batch_size=[3, 4]) >>> with td.unsqueeze(-2) as tds: ... tds.set("y", torch.zeros(3, 1, 4)) >>> assert td.get("y").shape == [3, 4]
- update(input_dict_or_td: T, clone: bool = False, *, keys_to_update: Sequence[NestedKey] | None = None, non_blocking: bool = False, is_leaf: Callable[[Type], bool] | None = None, **kwargs: Any) T ¶
用字典或另一个张量字典的值更新张量字典。
- 参数::
input_dict_or_td (TensorDictBase or dict) – 要写入 self 的输入数据。
clone (bool, optional) – 输入(张量)字典中的张量在设置之前是否应该被克隆。默认值为
False
。inplace (bool, optional) – 如果为
True
并且键与张量字典中现有的键匹配,则更新将对该键值对发生在原地。如果找不到该条目,则将其添加。默认值为False
。
- 关键字参数:
keys_to_update (sequence of NestedKeys, optional) – 如果提供,则仅更新
key_to_update
中的键列表。其目的是避免调用data_dest.update(data_src.select(*keys_to_update))
。non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。is_leaf (Callable[[Type], bool], optional) – 一个可调用对象,用于指示一个对象类型是否被认为是一个叶子并被交换,或者是一个张量集合。
- 返回:
self
示例
>>> td = TensorDict({}, batch_size=[3]) >>> a = torch.randn(3) >>> b = torch.randn(3, 4) >>> other_td = TensorDict({"a": a, "b": b}, batch_size=[]) >>> td.update(other_td, inplace=True) # writes "a" and "b" even though they can't be found >>> assert td['a'] is other_td['a'] >>> other_td = other_td.clone().zero_() >>> td.update(other_td) >>> assert td['a'] is not other_td['a']
- update_(input_dict_or_td: dict[str, CompatibleType] | TensorDictBase, clone: bool = False, *, non_blocking: bool = False, **kwargs: Any) T ¶
使用字典或另一个 TensorDict 中的值就地更新 TensorDict。
与
update()
不同,如果键在self
中未知,此函数将引发错误。- 参数::
input_dict_or_td (TensorDictBase or dict) – 要写入 self 的输入数据。
clone (bool, optional) – 输入(张量)字典中的张量在设置之前是否应该被克隆。默认值为
False
。
- 关键字参数:
keys_to_update (sequence of NestedKeys, 可选) – 如果提供,则仅更新
key_to_update
中的键列表。 旨在避免调用data_dest.update_(data_src.select(*keys_to_update))
。non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。
- 返回:
self
示例
>>> a = torch.randn(3) >>> b = torch.randn(3, 4) >>> td = TensorDict({"a": a, "b": b}, batch_size=[3]) >>> other_td = TensorDict({"a": a*0, "b": b*0}, batch_size=[]) >>> td.update_(other_td) >>> assert td['a'] is not other_td['a'] >>> assert (td['a'] == other_td['a']).all() >>> assert (td['a'] == 0).all()
- update_at_(input_dict_or_td: dict[str, CompatibleType] | TensorDictBase, index: IndexType, clone: bool = False, *, non_blocking: bool = False) T ¶
在指定索引处就地更新 TensorDict,使用字典或另一个 TensorDict 中的值。
与 TensorDict.update 不同,如果键在 TensorDict 中未知,此函数将引发错误。
- 参数::
input_dict_or_td (TensorDictBase or dict) – 要写入 self 的输入数据。
idx (int, torch.Tensor, 可迭代, slice) – 应进行更新的 tensordict 的索引。
clone (bool, 可选) – 输入 (张量) 字典中的张量是否应在设置之前被克隆。 默认为 False。
- 关键字参数:
keys_to_update (sequence of NestedKeys, 可选) – 如果提供,则仅更新
key_to_update
中的键列表。non_blocking (bool, 可选) – 如果为
True
,并且此副本位于不同的设备之间,则该副本可能会异步发生,相对于主机而言。
- 返回:
self
示例
>>> td = TensorDict({ ... 'a': torch.zeros(3, 4, 5), ... 'b': torch.zeros(3, 4, 10)}, batch_size=[3, 4]) >>> td.update_at_( ... TensorDict({ ... 'a': torch.ones(1, 4, 5), ... 'b': torch.ones(1, 4, 10)}, batch_size=[1, 4]), ... slice(1, 2)) TensorDict( fields={ a: Tensor(torch.Size([3, 4, 5]), dtype=torch.float32), b: Tensor(torch.Size([3, 4, 10]), dtype=torch.float32)}, batch_size=torch.Size([3, 4]), device=None, is_shared=False) >>> assert (td[1] == 1).all()
- valid_keys(include_nested: bool = False, leaves_only: bool = False, is_leaf: Callable[[Type], bool] | None = None) _LazyStackedTensorDictKeysView ¶
返回 tensordict 键的生成器。
- 参数::
示例
>>> from tensordict import TensorDict >>> data = TensorDict({"0": 0, "1": {"2": 2}}, batch_size=[]) >>> data.keys() ['0', '1'] >>> list(data.keys(leaves_only=True)) ['0'] >>> list(data.keys(include_nested=True, leaves_only=True)) ['0', '1', ('1', '2')]
- values(include_nested=False, leaves_only=False, is_leaf=None)¶
返回一个表示 tensordict 值的生成器。
- var(dim: int | Tuple[int] = _NoDefault.ZERO, keepdim: bool = _NoDefault.ZERO, *, correction: int = 1, reduce: bool | None = None) TensorDictBase | torch.Tensor ¶
返回输入 tensordict 中所有元素的方差值。
- 参数::
- 关键字参数:
- view(*shape: int, size: list | tuple | torch.Size | None = None, batch_size: torch.Size | None = None)¶
返回一个 tensordict,其中包含张量的视图,根据新的形状,与 tensordict batch_size 兼容。
或者,可以将 dtype 作为第一个未命名的参数提供。 在这种情况下,所有张量都将使用相应的 dtype 进行查看。 请注意,这假设新形状将与提供的 dtype 兼容。 有关 dtype 视图的更多信息,请参见
view()
。- 参数::
*shape (int) – 生成的 tensordict 的新形状。
dtype (torch.dtype) – 或者,用于表示张量内容的数据类型。
size – 可迭代对象
- 关键字参数:
batch_size (torch.Size, 可选) – 如果提供了数据类型,可以使用此关键字参数重置批次大小。如果使用形状调用
view
,则此参数无效。- 返回:
具有所需批次大小的新 tensordict。
示例
>>> td = TensorDict(source={'a': torch.zeros(3,4,5), ... 'b': torch.zeros(3,4,10,1)}, batch_size=torch.Size([3, 4])) >>> td_view = td.view(12) >>> print(td_view.get("a").shape) # torch.Size([12, 5]) >>> print(td_view.get("b").shape) # torch.Size([12, 10, 1]) >>> td_view = td.view(-1, 4, 3) >>> print(td_view.get("a").shape) # torch.Size([1, 4, 3, 5]) >>> print(td_view.get("b").shape) # torch.Size([1, 4, 3, 10, 1])
- where(condition, other, *, out=None, pad=None)¶
返回一个
TensorDict
,其中元素从自身或其他中选择,具体取决于条件。- 参数::
condition (BoolTensor) – 当为
True
(非零)时,生成self
,否则生成other
。other (TensorDictBase 或 Scalar) – 值(如果
other
是标量)或在条件为False
的索引处选择的值。
- 关键字参数:
out (TensorDictBase, 可选) – 输出
TensorDictBase
实例。pad (scalar, 可选) – 如果提供,源或目标 tensordict 中的缺失键将被写入为 torch.where(mask, self, pad) 或 torch.where(mask, pad, other)。默认值为
None
,即不允许出现缺失键。
- zero_() T ¶
将 tensordict 中所有张量设置为零(就地操作)。