torch.backends.opt_einsum 的源代码
# mypy: 允许未类型化定义
导入
系统
导入
警告
来自 contextlib
导入 contextmanager
来自 functools
导入 lru_cache as _lru_cache
来自
打字
导入
任何
来自
PyTorch 后端
导入
__允许非括号突变, ContextProp,
模块属性
尝试:
导入 opt_einsum as _opt_einsum # type: ignore[import]
除了
导入错误:
_opt_einsum = 无
[文档]@_lru_cache
def is_available() -> bool:
r"""返回一个布尔值,指示 opt_einsum 当前是否可用。
您必须安装 opt-einsum,以便 torch 自动优化 einsum。
使 opt-einsum 可用,您可以在安装 torch 时一起安装它:``pip install torch[opt-einsum]```
或单独使用:``pip install opt-einsum``。如果已安装该包,torch 将导入
它自动并相应地使用。使用此功能检查 opt-einsum
通过 torch 安装并正确导入。
"""
返回_opt_einsum 是否不为 None
[文档]def get_opt_einsum() -> Any:
返回 opt_einsum 包,如果 opt_einsum 当前可用,否则返回 None。
返回_opt_einsum
def _set_enabled(启用: bool) ->
无:
如果
不
是否可用()
和
启用:
抛出
值错误(
fopt_einsum 不可用,因此将`enabled`设置为{
启用}
将不会收获 " 的好处
torch.einsum 将会回退到从左到右进行收缩。为了启用这种最优路径计算,请安装 opt-einsum。
将回退到从左到右进行收缩。为了启用这种最优路径计算,请安装 opt-einsum。
请安装 opt-einsum 以启用这种最优路径计算。
)
全局
启用
启用 =
启用
def _get_enabled() -> bool:
返回
启用
def _set_strategy(_strategy: str) -> 无:
如果
不
是否可用():
抛出
值错误(
f"opt_einsum 不可用,因此将`strategy`设置为"{
策略}
将没有意义。
"torch.einsum 将绕过路径计算,并从左到右进行收缩。"
"请安装 opt_einsum 或取消设置 `strategy`。"
)
如果
不
启用:
抛出
值错误(
f"opt_einsum 未启用,因此设置`strategy`将没有意义。"{_strategy}
将不会产生意义。
"torch.einsum 将绕过路径计算,直接从左到右进行收缩。"
"请同时将 `enabled` 设置为 `True` 或取消设置 `strategy`。"
)
如果
_策略
不
在 [
"自动",
"贪婪",
"最优的"
]
抛出
值错误(
f"策略`必须为以下之一:[auto, greedy, 最优的]但却是"{
_策略}"
)
全局
策略
策略 =
_策略
def 获取策略() -> str:
返回
策略
def 设置标志(
启用=
无,
策略=
无):
原始标志 = (
启用,
无
如果
不
是否可用()
否则
策略)
如果
启用
是
不
无:
设置启用(
启用)
如果
策略
是
不
无:
设置策略(
策略)
返回
原始标志
@contextmanager
def 标志(
启用=
无,
策略=
无):
替换为
__允许非括号突变():
原始标志 =
设置标志(
启用,
策略)
尝试:
产生
最后:
# 恢复之前的值
替换为
__允许非括号突变():
设置标志(*
原始标志)
# 这里的魔法在于允许我们拦截如下代码:
#
# torch.backends.opt_einsum.enabled = True
类
OptEinsum 模块(
Prop 模块):
def __init__(self, m, 名称):
超级().__init__(m,
名称)
全局
启用
启用 = ContextProp(_get_enabled, _set_enabled)
全局
策略
策略 =
无
如果
是否可用():
策略 = ContextProp(_get_strategy, _set_strategy)
# 这是 sys.modules 替换技巧,详见
# https://stackoverflow.com/questions/2447353/getattr-on-a-module/7668273#7668273
系统模块.
模块[__name__] =
OptEinsum 模块(
系统模块.
模块[__name__
] __name__)
启用 =
真实
如果
是否可用()
否则
假
策略 =
自动
如果
是否可用()
否则
无