torch.backends.cudnn 的源代码
# mypy: 允许未类型化定义
导入
操作系统
导入
系统
导入
警告
来自 contextlib
导入 contextmanager
来自
打字
导入
可选
导入
火炬
来自
PyTorch 后端
导入 __allow_nonbracketed_mutation, ContextProp,
模块属性
尝试:
来自 torch._C
导入 _cudnn
除了
导入错误:
_cudnn = 无
# 类型:忽略[赋值]
# 写入:
#
# torch.backends.cudnn.enabled = False
#
# 全局禁用 CuDNN/MIOpen
__cudnn_version: 可选[int] =
无
如果 _cudnn
是
不
无:
def _初始化():
全局
__cudnn 版本
如果
__cudnn 版本
是
无:
__cudnn 版本 = _cudnn.
获取版本整数()
运行时版本 = _cudnn.
获取运行时版本()
编译版本 = _cudnn.
获取编译版本()
运行时主版本号,
运行时小版本, _ =
运行时版本
编译主版本,
编译小版本, _ =
编译版本
不同主版本总是不兼容
从 cuDNN 7 开始,次要版本是向后兼容的
对于 MIOpen (ROCm)不确定,所以总是进行严格检查
如果
运行时主版本 !=
编译主版本:
兼容 CUDNN =
假
如果...否则
运行时主版本 < 7
或者
不 _cudnn.is_cuda:
cudnn_compatible = runtime_minor == 编译小版本
否则:
支持 cuDNN =
运行时小版本
≥
编译小版本
如果
不
cudnn 兼容:
如果 os.
环境.
获取(
"跳过 PYTORCH 对 cuDNN 兼容性的检查", "0") == "1":
返回
真实
基础错误信息 = (
f"cuDNN 版本不兼容:"
fPyTorch 编译版本为{
编译版本} "
f但发现运行时版本为{
运行时版本}
.
fPyTorch 已经捆绑了 cuDNN。
f解决此错误的一个选项是确保 PyTorch
f可以找到捆绑的 cuDNN。
)
如果
LD_LIBRARY_PATH
在 os.
环境:
ld_library_path = os.环境.
获取("LD_LIBRARY_PATH",
输入文本翻译为简体中文为:"")
如果
任何(
substring 在 ld_library_path for
子串
在 [
cuda,
cudnn]
):
抛出
运行时错误(
f"{基础错误信息}"
f"看起来您的 LD_LIBRARY_PATH 包含不兼容版本的 cudnn。"
f"请将其从路径中删除或安装 cudnn。"{
编译版本}"
)
否则:
抛出
运行时错误(
f"{基础错误信息}"
f"有一种可能是,存在一个“"
f"LD_LIBRARY_PATH 中存在冲突的 cuDNN。"
)
否则:
抛出
运行时错误(base_error_msg)
返回
真实
否则:
def _初始化():
返回
假
[文档]def 版本():
"""返回 cuDNN 的版本。"""
if not _init():
返回 None
返回 __cudnn_version
CUDNN_TENSOR_DTYPES = {
PyTorch.
半,
PyTorch.float,
PyTorch.double,
}
[文档]定义 is_available()
返回一个布尔值,指示 CUDNN 当前是否可用。
返回 torch._C._has_cudnn
def is_acceptable(张量):
如果
不
PyTorch._C._get_cudnn_enabled():
返回
假
如果
张量.
设备.
类型 != "cuda"
或者
张量.dtype
不
在 CUDNN_TENSOR_DTYPES:
返回
假
如果
不
是否可用():
警告.
警告(
"PyTorch 未编译 cuDNN/MIOpen 支持。要使用 cuDNN/MIOpen,请重新构建 "
"确保库对构建系统可见的 PyTorch。"
)
返回
假
如果
不
_初始化():
警告.
警告(
"未找到 cuDNN/MIOpen 库。请检查 "{libpath}".
格式(
libpath={"darwin": "DYLD_LIBRARY_PATH", win32:
环境变量 PATH}.
获取(
系统模块.
平台,
LD_LIBRARY_PATH
)
)
)
返回
假
返回
真实
def 设置标志(
启用=
无,
_基准测试=
无,
_基准测试限制=
无,
确定性=
无,
允许 TF32=
无,
):
原始标志 = (
PyTorch._C.
获取 cudnn 启用状态(),
PyTorch._C.
获取_cudnn_benchmark(),
无
如果
不
是否可用()
否则
PyTorch._C.
获取_cudnn_get_cudnn_benchmark_limit(),
PyTorch._C.
获取_cudnn_deterministic(),
PyTorch._C.
获取_cudnn_allow_tf32(),
)
如果
启用
是
不
无:
PyTorch._C.
设置 CUDNN 启用(
启用)
如果
基准测试
是
不
无:
PyTorch._C.
设置 CUDNN 基准测试(
基准测试)
如果
_基准限制
是
不
无
和
是否可用():
PyTorch._C.
_设置 CUDA 的 CUDNN 基准限制(
_基准限制)
如果
_确定性
是
不
无:
PyTorch._C.
设置 cudnn 确定性(
确定性)
如果
允许 tf32
是
不
无:
PyTorch._C.
设置 cudnn 允许 tf32(
允许使用 TF32)
返回
原始标志
@contextmanager
def 标志(
启用=False,
基准测试=False,
基准限制=10,
确定性=False,
允许使用 TF32=True,
):
替换为
允许非括号突变():
原始标志 =
设置标志(
启用,
基准测试,
基准限制,
确定性,
允许 TF32
)
尝试:
产生
最后:
# 恢复之前的值
替换为
__允许非括号突变():
设置标志(*
原始标志)
# 这里的魔法在于允许我们拦截如下代码:
#
# torch.backends.<cudnn|mkldnn>.enabled = True
类
Cudnn 模块(
Prop 模块):
def __init__(self, m, 名称):
超级().__init__(m,
名称)
启用 =
上下文属性(
PyTorch._C._get_cudnn_enabled,
PyTorch._C.
设置 CUDA 深度神经网络启用)
确定性 =
上下文属性(
PyTorch._C.
获取 CUDA 深度神经网络确定性,
PyTorch._C.
设置 CUDA 深度神经网络确定性
)
基准 =
上下文属性(
PyTorch._C._get_cudnn_benchmark,
PyTorch._C._set_cudnn_benchmark
)
基准限制 =
无
如果
是否可用():
基准限制 =
上下文属性(
PyTorch._C.
_cuda 获取 cudnn 基准限制,
PyTorch._C.
_cuda 设置 cudnn_benchmark_limit,
)
允许 tf32 = ContextProp(
PyTorch._C.
_get_cudnn 允许 tf32,
PyTorch._C.
_设置_cudnn_allow_tf32
)
# 这是 sys.modules 替换技巧,详见
# https://stackoverflow.com/questions/2447353/getattr-on-a-module/7668273#7668273
系统模块.
模块[__name__] =
Cudnn 模块(
系统模块.
模块[__name__
] __name__)
为替换的模块添加类型注解
启用:
布尔值
确定性:
布尔值
基准测试:
布尔值
允许使用 TF32:
布尔值
基准限制:
整型