快捷键

torch.autograd.grad_mode 源代码

# mypy: 允许未类型化定义
来自 打字 导入 任何, 联合

导入 火炬
来自 torch.utils._contextlib 导入 (
    装饰器上下文管理器,
    _NoParamDecoratorContextManager,
    F,
)


全部 = [
    "关闭梯度",
    "启用梯度",
    set_grad_enabled,
    "推理模式",
    set_multithreading_enabled,
]


[文档] 不梯度(_NoParamDecoratorContextManager): r"""上下文管理器,用于禁用梯度计算。 禁用梯度计算对于推理很有用,当你确定 你不会调用 :meth:`Tensor.backward()` 方法时。这将减少内存 消耗原本需要 `requires_grad=True` 的计算。 在此模式下,每次计算的输出都将 `requires_grad=False`,即使输入有 `requires_grad=True`。 存在一个例外!所有工厂函数,或者创建 新的 Tensor 和带 requires_grad 参数,将不会受到影响。 这种模式。 此上下文管理器是线程局部;它不会影响其他线程的计算。 也可用作装饰器。 .. 注意:: No-grad 是能够启用或禁用局部梯度的几种机制之一, 有关它们如何比较的更多信息,请参阅::ref:`locally-disable-grad-doc`。 有关它们如何比较的更多信息,请参阅::ref:`locally-disable-grad-doc`。 .. 注意:: 此 API 不适用于:ref:`正向模式 AD `. 如果您想禁用计算中的正向 AD,您可以解包您的双张量。 您的双张量。 示例:: >>> # xdoctest: +SKIP >>> x = torch.tensor([1.], requires_grad=True) >>> with torch.no_grad(): ... y = x * 2 >>> y.requires_grad False >>> @torch.no_grad() ... def 双倍器(x): ... 返回 x * 2 >>> z = 双倍器(x) >>> z.requires_grad False >>> @torch.no_grad() ... def tripler(x): ... return x * 3 >>> z = tripler(x) >>> z.requires_grad False >>> # 工厂函数异常 >>> with torch.no_grad(): ... a = torch.nn.Parameter(torch.rand(10)) >>> a 需要梯度 True """ def __init__(self) -> : 如果 PyTorch._jit_internal.是否正在脚本化(): 超级().__init__() self.上一个 = def __进入__(self) -> : self.上一个 = PyTorch.梯度是否启用() PyTorch.设置梯度启用(False) def __退出__(self, 异常类型: 任何, exc_value: 任何, 跟踪回溯: 任何) -> : PyTorch.设置梯度启用(self.上一页)
[文档] 启用梯度(_NoParamDecoratorContextManager): r上下文管理器,用于启用梯度计算。 如果通过 :class:`~no_grad` 或 :class:`~set_grad_enabled` 禁用了梯度计算,则启用梯度计算。 这个上下文管理器是线程局部的;它不会影响其他线程的计算 它还充当装饰器。 .. 注意:: enable_grad 是可以启用或禁用梯度的几种机制之一。 本地禁用渐变,请参阅::ref:`locally-disable-grad-doc` 了解更多信息。 了解它们如何比较的更多信息。 .. 注意:: 此 API 不适用于:ref:`forward-mode AD 》。 示例:: >>> # xdoctest: +SKIP >>> x = torch.tensor([1.], requires_grad=True) >>> with torch.no_grad(): ... with torch.enable_grad(): ... y = x * 2 >>> y.requires_grad True >>> y.backward() >>> x.grad tensor([2.]) >>> @torch.enable_grad() ... def 双倍器(x): ... 返回 x * 2 >>> with torch.no_grad(): ... z = 双倍器(x) >>> z.requires_grad True >>> @torch.enable_grad() ... def tripler(x): ... return x * 3 >>> with torch.no_grad(): ... z = tripler(x) >>> z.requires_grad True """ def __进入__(self) -> : self.上一个 = PyTorch.梯度是否启用() PyTorch._C._set_grad_enabled(True) def __退出__(self, 异常类型: 任何, exc_value: 任何, 跟踪回溯: 任何) -> : PyTorch._C._set_grad_enabled(self.上一页)
[文档] 设置梯度启用(装饰器上下文管理器): r上下文管理器,用于开启或关闭梯度计算。 ``set_grad_enabled`` 根据其参数 :attr:`mode` 来启用或禁用梯度。 它可以用作上下文管理器或函数。 此上下文管理器是线程局部变量;它不会影响计算 在其他线程中。 参数: 模式(布尔值):启用 grad(``True``)或禁用 (``False``)。这可以用来有条件地启用 渐变。 .. 注意:: set_grad_enabled 是可以启用或禁用局部梯度的几种机制之一,有关它们如何比较的更多信息,请参阅 :ref:`locally-disable-grad-doc`。 更多信息,请参阅 :ref:`locally-disable-grad-doc`。 更多信息,请参阅 :ref:`locally-disable-grad-doc`。 .. 注意:: 此 API 不适用于:ref:`正向模式 AD `. 示例:: >>> # xdoctest: +SKIP >>> x = torch.tensor([1.], requires_grad=True) >>> is_train = False >>> with torch.set_grad_enabled(is_train): ... y = x * 2 ... >>> y.requires_grad False ... >>> _ = torch.set_grad_enabled(True) ... >>> y = x * 2 >>> y.requires_grad True >>> _ = torch.set_grad_enabled(False) >>> y = x * 2 >>> y.requires_grad False """ def __init__(self, 模式: bool) -> : self.上一个 = PyTorch.梯度是否启用() self.模式 = 模式 PyTorch._C.设置梯度启用(模式) def __调用__(self, 原始函数: F) -> F: PyTorch._C.设置梯度启用(self.上一页) 返回 超级().__调用__(原始函数) def __进入__(self) -> : PyTorch._C._设置梯度启用(self.模式) def __退出__(self, 异常类型: 任何, exc_value: 任何, 跟踪回溯: 任何) -> : PyTorch._C._设置梯度启用(self.上一页)
[文档] def clone(self) -> "设置梯度启用": r""" 创建此类的副本 """ 返回 self.__class__(self.mode)
[文档] inference_mode(装饰器上下文管理器): r上下文管理器,用于启用或禁用推理模式。 推理模式是一个类似于 :class:`~no_grad` 的上下文管理器 用于您确定您的操作不会产生交互时 使用自动微分(例如,模型训练)。在此模式下运行的代码性能更佳 通过禁用视图跟踪和版本计数器更新来提高性能。注意 与一些其他本地启用或禁用 grad 的机制不同, 进入推理模式也会禁用到:ref:`前向模式 AD `. 此上下文管理器是线程局部;它不会影响其他线程的计算 也可用作装饰器。 .. 注意:: 推理模式是多种机制之一,可以启用或禁用局部梯度,有关它们如何比较的更多信息,请参阅::ref:`局部禁用梯度文档`。 禁用局部梯度,有关它们如何比较的更多信息,请参阅::ref:`局部禁用梯度文档`。 更多信息,请参阅::ref:`局部禁用梯度文档`。 参数: 模式(bool 或函数):启用或禁用该模式的布尔标志或函数 禁用推理模式或用于装饰的 Python 函数 推理模式已启用 示例:: >>> # xdoctest: +REQUIRES(环境:TORCH_DOCTEST_AUTOGRAD) >>> 导入 torch >>> x = torch.ones(1, 2, 3, requires_grad=True) >>> with torch.inference_mode(): ... y = x * x >>> y.requires_grad False >>> # xdoctest: +SKIP("想要字符串并不完全正确") >>> y._version Traceback (most recent call last): 文件 "", 行 1,在 中 RuntimeError: 推理张量不跟踪版本计数器。 >>> @torch.inference_mode() ... def func(x): ... return x * x >>> out = func(x) >>> out.requires_grad False >>> @torch.inference_mode() ... def doubler(x): ... return x * 2 >>> out = doubler(x) >>> out.requires_grad False """ def __init__(self, 模式: 布尔值 = True) -> : 如果 PyTorch._jit_internal.是否正在脚本化(): 超级().__init__() self.模式 = 模式 def __new__(, 模式=True): 如果 isinstance(模式, bool): 返回 超级().__new__() 返回 ()(模式) def __进入__(self) -> : self._inference_mode_context = PyTorch._C._InferenceMode(self.模式) self._inference_mode_context.__进入__() def __退出__(self, 异常类型: 任何, exc_value: 任何, 跟踪回溯: 任何) -> : self._inference_mode_context.__退出__(异常类型, exc_value, 跟踪回溯)
[文档] def clone(self) -> "推理模式": r""" 创建本类的副本 """ 返回当前类的实例(self.__class__(self.mode))
def _进入推理模式(模式): 模式上下文 = PyTorch._C.推理模式(模式) 模式上下文.__进入__() 返回 模式上下文 def 退出推理模式(模式): 模式.__退出__(, , )
[文档]class set_multithreading_enabled(_DecoratorContextManager): r"""多线程回溯开启或关闭的上下文管理器。 ``set_multithreading_enabled`` 将根据其参数 :attr:`mode` 启用或禁用多线程回溯。 它可以用作上下文管理器或函数。 这个上下文管理器是线程局部的;它不会影响其他线程的计算 在其他线程中。 参数: 模式(布尔值):标志是否启用多线程反向(``True``),或禁用 (``False``). .. 注意:: 该 API 不适用于:ref:`前向模式 AD `. """ def __init__(self, mode: bool) -> None: self.prev = torch._C._is_multithreading_enabled() torch._C._set_multithreading_enabled(mode) self.mode = mode def __enter__(self) -> None: pass def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: torch._C._set_multithreading_enabled(self.prev)
[文档] def clone(self) -> "启用多线程": r""" 创建本类的副本 """ return self.__class__(self.mode)
_强制原始视图跟踪(装饰器上下文管理器): r上下文管理器,用于设置是否在 autograd 中始终启用视图回放。 `set_view_replay_enabled` 方法将根据其参数 :attr:`mode` 启用或禁用视图回放。 它可以作为上下文管理器或函数使用。 此上下文管理器是线程局部变量;它不会影响计算 在其他线程中。 当张量视图被修改时,自动微分引擎需要决定是否 通过重新播放从更新后的基础视图链来重新生成“更新视图” 或通过一次调用 as_strided。 如果将 set_view_replay_enabled 设置为 True,则 autograd 将始终使用视图重放。 否则,它将回退到现有的逻辑。 参数: 模式(布尔值):标志是否启用视图重放(``True``),或禁用 (``False``) """ def __init__(self, 模式: bool) -> : self.上一个 = PyTorch._C._is_view_replay_enabled() PyTorch._C._set_view_replay_enabled(模式) self.模式 = 模式 def __进入__(self) -> : 通过 def __退出__(self, 异常类型: 任何, exc_value: 任何, 跟踪回溯: 任何) -> : PyTorch._C._set_view_replay_enabled(self.上一页) def 克隆(self): 返回 self.(self.模式) _不安全保留版本计数器(装饰器上下文管理器): r除非你确切知道你在做什么,否则不要使用此功能。 此上下文管理器可能导致代码其他部分的任意静默正确性问题。 (即使这些部分没有直接受到上下文管理器的直接影响)! 通常,autograd 会通过递增其 `._version` 属性来跟踪对张量的修改。 这通常对正确性很重要,例如,对于反向传播过程中保存的 tensor 进行修改可能会导致梯度不正确,而 autograd 使用版本计数器来检测这种情况并报错。 然而,在极少数情况下,可能需要隐藏对 autograd 的修改。例如: 和错误。 但是,在极少数情况下,可能需要隐藏对 autograd 的修改。例如: 如果一个张量非常大,并且您想将其存储在其他地方以释放其内存,并在需要时重新填充 该张量,以便在 autograd 之前使用。 参数: 张量(torch.Tensor):您想要保留版本计数器的张量。 .. 注意:: 此 API 不适用于:ref:`forward-mode AD `。 """ def __init__(self, 张量: 联合[PyTorch.张量, 元组[PyTorch.张量, ...]]) -> : self.张量 = (张量,) 如果 isinstance(张量, PyTorch.张量) 否则 张量 断言 isinstance(self.张量, 元组) self.前版本 = 元组(t._version for t self.张量) def __进入__(self) -> : 通过 def __退出__(self, *参数) -> : PyTorch._C._自动微分._不安全设置版本计数器(self.张量, self.前版本)

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源