快捷方式

PairwiseDataset

class torchrl.data.PairwiseDataset(chosen_data: 'RewardData', rejected_data: 'RewardData', *, batch_size, device=None, names=None)[源代码]
property batch_size: Size

检索张量类的批次大小。

返回值: :

批次大小 (torch.Size)

property device: device

检索张量类的设备类型。

classmethod from_dataset(split, dataset_name: str | None = None, max_length: int = 550, root_dir: str | None = None, from_disk: bool = False, num_workers: int | None = None)[源代码]

从数据集名称返回一个 PairwiseDataset

参数: :
  • split (str) – "train""valid",具体取决于所需的数据拆分。

  • dataset_name (str, 可选) – 要处理的数据集的名称。默认为 "CarperAI/openai_summarize_comparisons"

  • max_length (int, 可选) – 数据集序列的最大长度。默认为 550。

  • root_dir (路径, 可选) – 存储数据集的路径。默认为 "$HOME/.cache/torchrl/data"

  • from_disk (bool, 可选) – 如果为 True,将使用 datasets.load_from_disk()。否则,将使用 datasets.load_dataset()。默认为 False

返回值: 包含内存映射的 PairwiseDataset 实例

所需数据集的版本。

示例

>>> data = PairwiseDataset.from_dataset("train")
>>> print(data)
PairwiseDataset(
    chosen_data=RewardData(
        attention_mask=MemoryMappedTensor(shape=torch.Size([92534, 550]), device=cpu, dtype=torch.int64, is_shared=False),
        input_ids=MemoryMappedTensor(shape=torch.Size([92534, 550]), device=cpu, dtype=torch.int64, is_shared=False),
        rewards=None,
        end_scores=None,
        batch_size=torch.Size([92534]),
        device=None,
        is_shared=False),
    rejected_data=RewardData(
        attention_mask=MemoryMappedTensor(shape=torch.Size([92534, 550]), device=cpu, dtype=torch.int64, is_shared=False),
        input_ids=MemoryMappedTensor(shape=torch.Size([92534, 550]), device=cpu, dtype=torch.int64, is_shared=False),
        rewards=None,
        end_scores=None,
        batch_size=torch.Size([92534]),
        device=None,
        is_shared=False),
    batch_size=torch.Size([92534]),
    device=None,
    is_shared=False)
>>> # data can be sampled from using regular indexing
>>> sub_data = data[:3]
classmethod from_tensordict(tensordict, non_tensordict=None)

张量类包装器,用于实例化新的张量类对象。

参数: :
  • tensordict (TensorDict) – 张量类型字典

  • non_tensordict (dict) – 包含非张量和嵌套张量类对象的字典

get(key: NestedKey, default: Any = _NoDefault.ZERO)

获取使用输入键存储的值。

参数: :
  • key (str, str 元组) – 要查询的键。如果为 str 元组,则等同于对 getattr 的链式调用。

  • default – 如果张量类中找不到键,则为默认值。

返回值: :

使用输入键存储的值

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()

此方法还允许加载嵌套的 tensordicts。

>>> 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_state_dict(state_dict: dict[str, Any], strict=True, assign=False, from_flatten=False)

尝试在目标 tensorclass 上就地加载 state_dict。

memmap(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T

将所有张量写入新的 tensordict 中对应的内存映射张量。

参数: :
  • prefix (str) – 内存映射张量将存储在其中的目录前缀。目录树结构将模仿 tensordict 的结构。

  • copy_existing (bool) – 如果为 False(默认),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且具有关联的文件,但未根据前缀保存在正确位置,则会引发异常。如果 True,任何现有的张量将被复制到新位置。

关键字参数:
  • num_threads (int, optional) – 用于写入 memmap 张量的线程数。默认为 0.

  • return_early (bool, optional) – 如果 True 并且 num_threads>0,该方法将返回 tensordict 的 future。

  • share_non_tensor (bool, optional) – 如果 True,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上进行写入操作(如就地更新或设置)将更新所有其他 worker 上的值。如果非张量叶节点数量很多(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。默认为 False

然后 tensordict 被锁定,这意味着任何不在原地的写入操作都将引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,内存映射属性将变为 False,因为跨进程身份不再保证。

返回值: :

如果 return_early=False,则包含存储在磁盘上的张量的新的 tensordict,否则为 TensorDictFuture 实例。

注意

以这种方式序列化可能在深度嵌套的 tensordicts 中很慢,因此不建议在训练循环中调用此方法。

memmap_(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T

将所有张量写入对应的内存映射张量,就地。

参数: :
  • prefix (str) – 内存映射张量将存储在其中的目录前缀。目录树结构将模仿 tensordict 的结构。

  • copy_existing (bool) – 如果为 False(默认),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且具有关联的文件,但未根据前缀保存在正确位置,则会引发异常。如果 True,任何现有的张量将被复制到新位置。

关键字参数:
  • num_threads (int, optional) – 用于写入 memmap 张量的线程数。默认为 0.

  • return_early (bool, optional) – 如果 True 并且 num_threads>0,该方法将返回 tensordict 的 future。可以使用 future.result() 查询结果 tensordict。

  • share_non_tensor (bool, optional) – 如果 True,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上进行写入操作(如就地更新或设置)将更新所有其他 worker 上的值。如果非张量叶节点数量很多(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。默认为 False

然后 tensordict 被锁定,这意味着任何不在原地的写入操作都将引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,内存映射属性将变为 False,因为跨进程身份不再保证。

返回值: :

如果 return_early=False,则为 self,否则为 TensorDictFuture 实例。

注意

以这种方式序列化可能在深度嵌套的 tensordicts 中很慢,因此不建议在训练循环中调用此方法。

memmap_like(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) T

创建一个与原始 tensordict 具有相同形状的无内容的内存映射 tensordict。

参数: :
  • prefix (str) – 内存映射张量将存储在其中的目录前缀。目录树结构将模仿 tensordict 的结构。

  • copy_existing (bool) – 如果为 False(默认),如果 tensordict 中的条目已经是存储在磁盘上的张量,并且具有关联的文件,但未根据前缀保存在正确位置,则会引发异常。如果 True,任何现有的张量将被复制到新位置。

关键字参数:
  • num_threads (int, optional) – 用于写入 memmap 张量的线程数。默认为 0.

  • return_early (bool, optional) – 如果 True 并且 num_threads>0,该方法将返回 tensordict 的 future。

  • share_non_tensor (bool, optional) – 如果 True,非张量数据将在进程之间共享,并且在单个节点内的任何 worker 上进行写入操作(如就地更新或设置)将更新所有其他 worker 上的值。如果非张量叶节点数量很多(例如,共享大量非张量数据),这可能会导致 OOM 或类似错误。默认为 False

然后 tensordict 被锁定,这意味着任何不在原地的写入操作都将引发异常(例如,重命名、设置或删除条目)。一旦 tensordict 被解锁,内存映射属性将变为 False,因为跨进程身份不再保证。

返回值: :

如果 return_early=False,则使用作为内存映射张量的存储的数据的新 TensorDict 实例,否则为 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_()

如果内存映射 tensordict 具有 saved_path,则刷新其内容。

如果与此 tensordict 关联的路径不存在,则此方法将引发异常。

property names: Size

检索张量类的维名。

返回值: :

names (字符串列表)

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() 的代理。

set(key: NestedKey, value: Any, inplace: bool = False, non_blocking: bool = False)

设置新的键值对。

参数: :
  • key (str, tuple of str) – 要设置的键的名称。如果为字符串元组,则等效于对 getattr 的连锁调用,最后是 setattr。

  • value (Any) – 要存储在 tensorclass 中的值

  • inplace (bool, optional) – 如果为 True,则 set 将尝试就地更新值。如果为 False 或键不存在,则该值将简单地写入其目标位置。

返回值: :

self

state_dict(destination=None, prefix='', keep_vars=False, flatten=False) dict[str, Any]

返回一个 state_dict 字典,该字典可用于从 tensorclass 保存和加载数据。

to_tensordict() TensorDict

将 tensorclass 转换为常规的 TensorDict。

对所有条目进行复制。内存映射和共享内存张量将转换为常规张量。

返回值: :

一个新的 TensorDict 对象,包含与 tensorclass 相同的值。

unbind(dim: int)

返回沿指定维度解绑的索引 tensorclass 实例的元组。

生成的 tensorclass 实例将共享初始 tensorclass 实例的存储空间。

文档

访问 PyTorch 的全面开发者文档

查看文档

教程

获取适合初学者和高级开发者的深入教程

查看教程

资源

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

查看资源