原帖环境是 PyTorch 1.5、Python 3.7、Ubuntu 18.04,显卡为 GTX 770,失败发生在首层卷积:
RuntimeError: Unable to find a valid cuDNN algorithm to run convolution
老显卡是线索,支持范围还要查对应构建
原题的 GTX 770 与 PyTorch 1.5 环境,不能直接套用面向新 GPU 的安装建议。错误只说当前条件下找不到可用 cuDNN 算法,仍需把 GPU 架构、torch/cuDNN 构建、卷积参数和内存分别核对。驱动能列出显卡不等于所有二进制都包含它的实现。
这道题有老 GPU 这一额外线索。cuDNN 算法不可用可能涉及架构支持、卷积配置或工作空间;只看到驱动支持 CUDA 10.2,不能证明所装 torch/cuDNN 包包含这张卡的实现。
在新进程检查实际构建和设备:
import torch
print("josh050608")
print("versions:", torch.__version__, torch.version.cuda, torch.backends.cudnn.version())
print("device:", torch.cuda.get_device_name(0), torch.cuda.get_device_capability(0))
get_arch_list = getattr(torch.cuda, "get_arch_list", None)
print("compiled arch:", None if get_arch_list is None else get_arch_list())
老版本没有 get_arch_list 时,应查对应二进制的官方构建信息和相关后端支持范围。不能用今天的 wheel 架构列表反推 1.5 的内容,也不能承诺升级到最新一定支持更老显卡。
接着在失败 Conv2d 前检查输入 [N,C,H,W]、权重、stride、padding、dilation 和 groups。用小输入单独运行相同卷积,再观察是否受尺寸或显存影响。
在独立诊断进程临时关闭 cuDNN 后若能跑通,可定位为后端路径差异;这是排查手段,速度与支持情况都需要重新评估。若确认构建不支持 GPU,需要选取可核实兼容的历史构建/源码编译,或使用 CPU/受支持 GPU。不要盲目替换某一个 cuDNN 动态库。
最后在选定环境恢复预期设置,完成小输入前向、反向,再验证真实 batch。原帖没有完整卷积参数,无法仅凭状态码给出唯一原因。
把卷积参数缩成独立对照
在失败层前打印输入 shape、stride,以及该 Conv2d 的 in_channels、out_channels、kernel_size、padding、groups 和 dilation。只给 cuDNN 状态码,无法判断是不是某种布局或工作空间条件。
下面用 CPU 合成卷积展示如何验证参数与反向;实际排查应替换为失败层的真实设置,而不是宣称这个小卷积代表原模型:
import torch
from torch import nn
conv = nn.Conv2d(3, 8, kernel_size=3, stride=2, padding=1)
x = torch.randn(2, 3, 16, 16)
assert x.shape[1] == conv.in_channels
y = conv(x)
assert y.shape == (2, 8, 8, 8)
y.mean().backward()
assert conv.weight.grad is not None
print("conv config:", conv.kernel_size, conv.stride, conv.padding, conv.groups)
print("input/output:", x.shape, y.shape)
若 CPU 成功,GPU 小卷积也成功,而真实输入失败,继续按原形状逐步增加 batch 或空间尺寸并观察显存。若关闭 cuDNN 后成功,仅说明后端路线不同;仍需判断性能与支持范围,不能把它当作已证明的版本缺陷。
架构支持应按当时 wheel 与 cuDNN 的资料核对,现代 get_arch_list 输出只说明当前安装。若确认所选构建不覆盖设备,应选择可核实的历史兼容构建、源码构建或替换执行设备,不要盲目升级到“最新”。完成后再在预期设置下验证完整小批次的前向、反向及参数更新。
参考:原始求助帖;技术依据:CUDA 构建架构列表(2.5)、PyTorch 后端设置(2.5)、Conv2d(2.5)、PyTorch 历史安装组合。