快捷方式

from_modules

class tensordict.from_modules(*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_stackas_module 是互斥的特性。

    警告

    懶惰輸出和非懶惰輸出之間有一個重要的區別:非懶惰輸出將使用所需的批次大小重新例項化引數,而 `lazy_stack` 將僅將引數表示為懶惰堆疊。這意味著,雖然原始引數可以安全地傳遞給最佳化器(當 `lazy_stack=True` 時),但在設定為 `True` 時需要傳遞新引數。

    警告

    雖然使用 lazy stack 來保留原始引數引用可能很誘人,但請記住,每次呼叫 get() 時,lazy stack 都會執行堆疊操作。這將需要記憶體(引數大小的 N 倍,如果構建了圖,則更多)和計算時間。它還意味著最佳化器將包含更多引數,像 step()zero_grad() 這樣的操作執行起來會更慢。總的來說,lazy_stack 應該只用於非常少的用例。

  • expand_identical (bool, optional) – 如果為 True 且正在堆疊相同的引數(相同標識),則將返回該引數的擴充套件版本。當 lazy_stack=True 時,將忽略此引數。

示例

>>> from torch import nn
>>> from tensordict import from_modules
>>> 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 = 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

文件

訪問全面的 PyTorch 開發者文件

檢視文件

教程

為初學者和高階開發者提供深入的教程

檢視教程

資源

查詢開發資源並讓您的問題得到解答

檢視資源