LogProbs¶
- class torchrl.modules.llm.LogProbs(prompt: 'torch.Tensor | None' = None, response: 'torch.Tensor | None' = None, full: 'torch.Tensor | None' = None, padded: 'bool | None' = None, *, batch_size, device=None, names=None)[原始碼]¶
- cat(dim: int = 0, *, out=None)¶
將tensordicts沿給定維度連線成一個tensordict。
此呼叫等同於呼叫
torch.cat(),但與 torch.compile 相容。
- classmethod default_spec(shape=(- 1,), keys: list[Literal['prompt', 'response', 'full']] | None = None)[原始碼]¶
在轉換器/環境中使用的預設規範,它們會返回 LogProbs 物件。
- dumps(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) Self¶
將tensordict儲存到磁碟。
此函式是
memmap()的代理。
- classmethod fields()¶
返回一個描述此資料類的欄位的元組。欄位型別為 Field。
接受一個數據類或其例項。元組元素為 Field 型別。
- from_any(*, auto_batch_size: bool = False, batch_dims: int | None = None, device: torch.device | None = None, batch_size: torch.Size | None = None)¶
Recursively converts any object to a TensorDict.
注意
from_any比常規的 TensorDict 建構函式限制更少。它可以使用自定義啟發式方法將資料結構(如 dataclasses 或 tuples)轉換為 tensordict。此方法可能會產生一些額外的開銷,並在對映策略方面涉及更多主觀選擇。注意
This method recursively converts the input object to a TensorDict. If the object is already a TensorDict (or any similar tensor collection object), it will be returned as is.
- 引數:
obj – The object to be converted.
- 關鍵字引數:
auto_batch_size (bool, optional) – 如果
True,將自動計算 batch size。預設為False。batch_dims (int, optional) – 如果 auto_batch_size 為
True,則定義輸出 tensordict 應具有的維度數。預設為None(每個級別的完整 batch size)。device (torch.device, optional) – 將建立 TensorDict 的裝置。
batch_size (torch.Size, optional) – TensorDict 的批次大小。與
auto_batch_size互斥。
- 返回:
A TensorDict representation of the input object.
Supported objects
透過
from_dataclass()的資料類(資料類將被轉換為 TensorDict 例項,而不是 tensorclass)。透過
from_namedtuple()的命名元組。透過
from_dict()的字典。透過
from_tuple()的元組。透過
from_struct_array()的 NumPy 結構化陣列。透過
from_h5()的 HDF5 物件。
- from_dataclass(*, dest_cls: Type | None = None, auto_batch_size: bool = False, batch_dims: int | None = None, as_tensorclass: bool = False, device: torch.device | None = None, batch_size: torch.Size | None = None)¶
Converts a dataclass into a TensorDict instance.
- 引數:
dataclass – The dataclass instance to be converted.
- 關鍵字引數:
dest_cls (tensorclass, optional) – 用於對映資料的 tensorclass 型別。如果未提供,則建立一個新類。如果
obj是一個型別或 as_tensorclass 為 False,則無效。auto_batch_size (bool, optional) – 如果
True,將自動確定並應用 batch size 到生成的 TensorDict。預設為False。batch_dims (int, optional) – 如果
auto_batch_size為True,則定義輸出 tensordict 應具有的維度數。預設為None(每個級別的完整 batch size)。as_tensorclass (bool, optional) – 如果
True,則將轉換委託給自由函式from_dataclass(),並返回一個 tensorclass(tensorclass())型別或例項,而不是 TensorDict。預設為False。device (torch.device, optional) – 將建立 TensorDict 的裝置。預設為
None。batch_size (torch.Size, optional) – TensorDict 的批次大小。預設為
None。
- 返回:
A TensorDict instance derived from the provided dataclass, unless as_tensorclass is True, in which case a tensor-compatible class or instance is returned.
- 丟擲:
TypeError – 如果提供的輸入不是資料類例項。
警告
This method is distinct from the free function from_dataclass and serves a different purpose. While the free function returns a tensor-compatible class or instance, this method returns a TensorDict instance.
注意
此方法建立一個新的 TensorDict 例項,其鍵對應於輸入 dataclass 的欄位。
結果 TensorDict 中的每個鍵都使用 `cls.from_any` 方法進行初始化。
auto_batch_size選項允許自動確定批次大小並將其應用於結果 TensorDict。
- from_h5(*, mode: str = 'r', auto_batch_size: bool = False, batch_dims: int | None = None, batch_size: torch.Size | None = None)¶
從 h5 檔案建立 PersistentTensorDict。
- 引數:
filename (str) – h5 檔案的路徑。
- 關鍵字引數:
mode (str, optional) – 讀取模式。預設為
"r"。auto_batch_size (bool, optional) – 如果
True,將自動計算 batch size。預設為False。batch_dims (int, optional) – 如果 auto_batch_size 為
True,則定義輸出 tensordict 應具有的維度數。預設為None(每個級別的完整 batch size)。batch_size (torch.Size, optional) – TensorDict 的批次大小。預設為
None。
- 返回:
輸入 h5 檔案的 PersistentTensorDict 表示。
示例
>>> td = TensorDict.from_h5("path/to/file.h5") >>> print(td) PersistentTensorDict( fields={ key1: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False), key2: Tensor(shape=torch.Size([3]), device=cpu, dtype=torch.float32, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- from_modules(*, as_module: bool = False, lock: bool = True, use_state_dict: bool = False, lazy_stack: bool = False, expand_identical: bool = False)¶
為 vmap 的 ensemable 學習/特徵期望應用檢索多個模組的引數。
- 引數:
modules (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,則將使用模組的 state-dict 並將其解壓到具有模型樹結構的 TensorDict 中。預設為False。注意
這在使用 state-dict hook 時尤其有用。
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
- from_namedtuple(*, auto_batch_size: bool = False, batch_dims: int | None = None, device: torch.device | None = None, batch_size: torch.Size | None = None)¶
遞迴地將命名元組轉換為 TensorDict。
- 引數:
named_tuple – 要轉換的命名元組例項。
- 關鍵字引數:
auto_batch_size (bool, optional) – 如果
True,將自動計算 batch size。預設為False。batch_dims (int, optional) – 如果
auto_batch_size為True,則定義輸出 tensordict 應具有的維度數。預設為None(每個級別的完整 batch size)。device (torch.device, optional) – 將建立 TensorDict 的裝置。預設為
None。batch_size (torch.Size, optional) – TensorDict 的批次大小。預設為
None。
- 返回:
輸入命名元組的 TensorDict 表示。
示例
>>> 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)
- from_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]
- from_remote_init(group: 'ProcessGroup' | None = None, device: torch.device | None = None) Self¶
從遠端傳送的元資料建立新的 tensordict 例項。
此類方法接收由 init_remote 傳送的元資料,建立具有匹配形狀和 dtype 的新 tensordict,然後非同步接收實際的 tensordict 內容。
- 引數:
src (int) – 傳送元資料的源程序的 rank。
group ("ProcessGroup", optional) – 要使用的程序組。預設為 None。
device (torch.device, 可選) – 用於張量運算的裝置。預設為 None。
- 返回:
使用接收到的元資料和內容初始化的新 tensordict 例項。
- 返回型別:
TensorDict
另請參閱
傳送程序應已呼叫 ~.init_remote 來發送元資料和內容。
- from_struct_array(*, auto_batch_size: bool = False, batch_dims: int | None = None, device: torch.device | None = None, batch_size: torch.Size | None = None) Self¶
將結構化 numpy 陣列轉換為 TensorDict。
生成的 TensorDict 將與 numpy 陣列共享相同的記憶體內容(這是一次零複製操作)。原地更改結構化 numpy 陣列的值會影響 TensorDict 的內容。
注意
此方法執行零複製操作,這意味著生成的 TensorDict 將與輸入的 numpy 陣列共享相同的記憶體內容。因此,原地更改 numpy 陣列的值會影響 TensorDict 的內容。
- 引數:
struct_array (np.ndarray) – 要轉換的結構化 numpy 陣列。
- 關鍵字引數:
auto_batch_size (bool, optional) – 如果
True,將自動計算 batch size。預設為False。batch_dims (int, optional) – 如果
auto_batch_size為True,則定義輸出 tensordict 應具有的維度數。預設為None(每個級別的完整 batch size)。device (torch.device, 可選) –
將建立 TensorDict 的裝置。預設為
None。注意
更改裝置(即,指定任何非 `None` 或 `"cpu"` 的裝置)將傳輸資料,從而導致返回資料的記憶體位置發生更改。
batch_size (torch.Size, 可選) – TensorDict 的批次大小。預設為 None。
- 返回:
輸入的結構化 numpy 陣列的 TensorDict 表示。
示例
>>> x = np.array( ... [("Rex", 9, 81.0), ("Fido", 3, 27.0)], ... dtype=[("name", "U10"), ("age", "i4"), ("weight", "f4")], ... ) >>> td = TensorDict.from_struct_array(x) >>> x_recon = td.to_struct_array() >>> assert (x_recon == x).all() >>> assert x_recon.shape == x.shape >>> # Try modifying x age field and check effect on td >>> x["age"] += 1 >>> assert (td["age"] == np.array([10, 4])).all()
- classmethod from_tensordict(tensordict: TensorDictBase, non_tensordict: dict | None = None, safe: bool = True) Self¶
用於例項化新張量類物件的張量類包裝器。
- 引數:
tensordict (TensorDictBase) – 張量型別字典
non_tensordict (dict) – 包含非張量和巢狀張量類物件的字典
safe (bool) – 如果 tensordict 不是 TensorDictBase 例項,是否引發錯誤
- from_tuple(*, auto_batch_size: bool = False, batch_dims: int | None = None, device: torch.device | None = None, batch_size: torch.Size | None = None)¶
將元組轉換為 TensorDict。
- 引數:
obj – 要轉換的元組例項。
- 關鍵字引數:
auto_batch_size (bool, optional) – 如果
True,將自動計算 batch size。預設為False。batch_dims (int, optional) – 如果 auto_batch_size 為
True,則定義輸出 tensordict 應具有的維度數。預設為None(每個級別的完整 batch size)。device (torch.device, optional) – 將建立 TensorDict 的裝置。預設為
None。batch_size (torch.Size, optional) – TensorDict 的批次大小。預設為
None。
- 返回:
輸入的元組的 TensorDict 表示。
示例
>>> my_tuple = (1, 2, 3) >>> td = TensorDict.from_tuple(my_tuple) >>> print(td) TensorDict( fields={ 0: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), 1: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False), 2: Tensor(shape=torch.Size([]), device=cpu, dtype=torch.int64, is_shared=False)}, batch_size=torch.Size([]), device=None, is_shared=False)
- fromkeys(value: Any = 0)¶
從鍵列表和單個值建立 tensordict。
- 引數:
keys (list of NestedKey) – 指定新字典鍵的可迭代物件。
value (compatible type, optional) – 所有鍵的值。預設為
0。
- get(key: NestedKey, *args, **kwargs)¶
獲取輸入鍵對應的儲存值。
- 引數:
key (str, tuple of str) – 要查詢的鍵。如果是字串元組,則等同於鏈式呼叫 getattr。
default – 如果在張量類中找不到鍵,則返回預設值。
- 返回:
儲存在輸入鍵下的值
- lazy_stack(dim: int = 0, *, out=None, **kwargs)¶
建立 TensorDicts 的懶惰堆疊。
有關詳細資訊,請參閱
lazy_stack()。
- load(*args, **kwargs) Self¶
從磁碟載入 tensordict。
此類方法是
load_memmap()的代理。
- load_(prefix: str | Path, *args, **kwargs)¶
在當前 tensordict 中從磁碟載入 tensordict。
此類方法是
load_memmap_()的代理。
- load_memmap(device: torch.device | None = None, non_blocking: bool = False, *, out: TensorDictBase | None = None) Self¶
從磁碟載入記憶體對映的 tensordict。
- 引數:
prefix (str 或 Path to folder) – 應獲取已儲存 tensordict 的資料夾路徑。
device (torch.device 或 等效項, 可選) – 如果提供,資料將非同步轉換為該裝置。支援 `"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)¶
嘗試將 state_dict 載入到目標張量類中(原地)。
- maybe_dense_stack(dim: int = 0, *, out=None, **kwargs)¶
嘗試使 TensorDicts 密集堆疊,並在需要時回退到懶惰堆疊。
有關詳細資訊,請參閱
maybe_dense_stack()。
- memmap(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False, existsok: bool = True) Self¶
將所有張量寫入記憶體對映的 Tensor 中,並放入新的 tensordict。
- 引數:
prefix (str) – 記憶體對映張量將儲存的目錄字首。目錄樹結構將模仿 tensordict 的結構。
copy_existing (bool) – 如果為 False(預設值),則如果 tensordict 中的某個條目已經是儲存在磁碟上的張量並具有關聯檔案,但未按 prefix 指定的位置儲存,則會引發異常。如果為
True,則任何現有張量都將被複制到新位置。
- 關鍵字引數:
num_threads (int, optional) – 用於寫入 memmap 張量的執行緒數。預設為 0。
return_early (bool, optional) – 如果
True且num_threads>0,則該方法將返回 tensordict 的未來物件。share_non_tensor (bool, optional) – 如果為
True,則非張量資料將在程序之間共享,並且單個節點內任何工作程序上的寫入操作(例如原地更新或設定)將更新所有其他工作程序上的值。如果非張量葉子節點數量很高(例如,共享大量非張量資料),這可能會導致 OOM 或類似錯誤。預設為False。existsok (bool, optional) – 如果為
False,則如果同一路徑下已存在張量,將引發異常。預設為True。
然後,Tensordict 被鎖定,這意味著任何非就地寫入操作(例如重新命名、設定或刪除條目)都將引發異常。一旦 tensordict 被解鎖,記憶體對映屬性將變為
False,因為不能保證跨程序身份。- 返回:
返回一個新的 tensordict,其中張量儲存在磁碟上(如果
return_early=False),否則返回一個TensorDictFuture例項。
注意
以這種方式序列化對於深度巢狀的 tensordicts 來說可能很慢,因此不建議在訓練迴圈中呼叫此方法。
- memmap_(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False, existsok: bool = True) Self¶
將所有張量原地寫入相應的記憶體對映張量。
- 引數:
prefix (str) – 記憶體對映張量將儲存的目錄字首。目錄樹結構將模仿 tensordict 的結構。
copy_existing (bool) – 如果為 False(預設值),則如果 tensordict 中的某個條目已經是儲存在磁碟上的張量並具有關聯檔案,但未按 prefix 指定的位置儲存,則會引發異常。如果為
True,則任何現有張量都將被複制到新位置。
- 關鍵字引數:
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。existsok (bool, optional) – 如果為
False,則如果同一路徑下已存在張量,將引發異常。預設為True。
然後,Tensordict 被鎖定,這意味著任何非就地寫入操作(例如重新命名、設定或刪除條目)都將引發異常。一旦 tensordict 被解鎖,記憶體對映屬性將變為
False,因為不能保證跨程序身份。- 返回:
如果
return_early=False,則返回 self,否則返回TensorDictFuture例項。
注意
以這種方式序列化對於深度巢狀的 tensordicts 來說可能很慢,因此不建議在訓練迴圈中呼叫此方法。
- memmap_like(prefix: str | None = None, copy_existing: bool = False, *, existsok: bool = True, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) Self¶
建立一個無內容的記憶體對映 tensordict,其形狀與原始 tensordict 相同。
- 引數:
prefix (str) – 記憶體對映張量將儲存的目錄字首。目錄樹結構將模仿 tensordict 的結構。
copy_existing (bool) – 如果為 False(預設值),則如果 tensordict 中的某個條目已經是儲存在磁碟上的張量並具有關聯檔案,但未按 prefix 指定的位置儲存,則會引發異常。如果為
True,則任何現有張量都將被複制到新位置。
- 關鍵字引數:
num_threads (int, optional) – 用於寫入 memmap 張量的執行緒數。預設為 0。
return_early (bool, optional) – 如果
True且num_threads>0,則該方法將返回 tensordict 的未來物件。share_non_tensor (bool, optional) – 如果為
True,則非張量資料將在程序之間共享,並且單個節點內任何工作程序上的寫入操作(例如原地更新或設定)將更新所有其他工作程序上的值。如果非張量葉子節點數量很高(例如,共享大量非張量資料),這可能會導致 OOM 或類似錯誤。預設為False。existsok (bool, optional) – 如果為
False,則如果同一路徑下已存在張量,將引發異常。預設為True。
然後,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,則重新整理其內容。如果沒有任何路徑與之關聯,此方法將引發異常。
- save(prefix: str | None = None, copy_existing: bool = False, *, num_threads: int = 0, return_early: bool = False, share_non_tensor: bool = False) Self¶
將tensordict儲存到磁碟。
此函式是
memmap()的代理。
- set(key: NestedKey, value: Any, inplace: bool = False, non_blocking: bool = False)¶
設定一個新的鍵值對。
- 引數:
key (str, tuple of str) – 要設定的鍵的名稱。如果是字串元組,則等同於鏈式呼叫 getattr,然後進行最終的 setattr。
value (Any) – 要儲存在張量類中的值
inplace (bool, optional) – 如果為
True,則 set 將嘗試原地更新值。如果為False或鍵不存在,則值將簡單地寫入其目的地。
- 返回:
self
- stack(dim: int = 0, *, out=None)¶
沿給定維度將 tensordicts 堆疊成一個單一的 tensordict。
此呼叫等效於呼叫
torch.stack(),但與 torch.compile 相容。
- state_dict(destination=None, prefix='', keep_vars=False, flatten=False) dict[str, Any]¶
返回一個 state_dict 字典,可用於儲存和載入張量類的資料。
- to_tensordict(*, retain_none: bool | None = None) TensorDict¶
將張量類轉換為常規 TensorDict。
複製所有條目。記憶體對映和共享記憶體張量將被轉換為常規張量。
- 引數:
retain_none (bool) – 如果為
True,則None值將被寫入 tensordict。否則它們將被丟棄。預設值:True。- 返回:
包含與張量類相同值的新的 TensorDict 物件。
- unbind(dim: int)¶
返回沿指定維度解綁的索引張量類例項的元組。
結果張量類例項將共享初始張量類例項的儲存。