1、特别的警告

conv2d_gradfix是 StyleGAN2 代码中用于修复卷积层梯度计算的工具,其设计仅兼容特定版本的 PyTorch(主要是 1.x 系列)。如果你当前使用的 PyTorch 版本为2.x.x+cu12.x,会超出该工具的支持范围,因此代码自动回退到 PyTorch 原生的torch.nn.functional.conv2d()函数。

回退到原生卷积函数通常不会破坏核心功能,但可能在梯度计算细节上与原设计有细微差异(实际影响极小,StyleGAN2-ADA 的训练 / 推理通常可正常进行)。

大家可以在代码中添加警告过滤,忽略此类提示。例如,在运行脚本的开头加入:

import warnings
# 过滤特定警告信息
warnings.filterwarnings("ignore", message="conv2d_gradfix not supported on PyTorch.*")

2.致命错误:PyTorch 版本与 StyleGAN2-ADA 代码不兼容

(1) 警告信息(非致命,但提示兼容性问题)

大量 conv2d_gradfix 和 grid_sample_gradfix 的警告,说明 StyleGAN2-ADA 中用于修复卷积和网格采样梯度计算的工具(gradfix)不支持你当前使用的 PyTorch 2.7.1+cu128 版本,代码自动退回到了 PyTorch 原生的 conv2d 和 grid_sample 函数。

这是因为 gradfix 工具是为旧版本 PyTorch(通常 1.7~1.13)设计的,而 PyTorch 2.x 之后的版本对底层算子进行了修改,导致旧的修复工具失效。

(2)致命错误(导致程序终止)

RuntimeError: derivative for aten::grid_sampler_2d_backward is not implemented

这个错误的核心是:PyTorch 2.x.x 中缺少 grid_sampler_2d_backward(网格采样的反向传播导数)的实现。StyleGAN2-ADA 在计算判别器 / 生成器梯度时调用了这个算子,但当前 PyTorch 版本不支持,导致反向传播失败。

StyleGAN2-ADA 官方推荐的 PyTorch 版本为 1.7~1.13(需匹配对应的 CUDA 版本),更高版本(如 2.x)存在兼容性问题。所以解决的核心就是降低 PyTorch 版本到兼容范围,但是降低 PyTorch 版本到兼容范围就会出现显卡与PyTorch 版本不兼容的情况,导致无法运行GPU,即PyTorch 不支持当前 GPU 架构,可是安装了新版pytorch之后StyleGAN2-ADA 又不支持了,就会出现一个两难问题

3.解决方案

StyleGAN2-ADA 对 PyTorch 2.x 的兼容性确实存在一些细节问题(主要是代码中依赖的旧版梯度修复工具与 2.x 不兼容),但可以通过微调代码解决。

StyleGAN2-ADA 的conv2d_gradfix.pygrid_sample_gradfix.py两个文件中,有针对旧版 PyTorch 的梯度计算修复逻辑,但这些逻辑在 PyTorch 2.x 中已失效,且会导致冲突。解决思路是直接禁用这些修复工具,改用 PyTorch 2.x 原生函数(2.x 已修复了大部分梯度问题)。

步骤 1:确认环境版本

确保stylegan2环境中:

  • PyTorch 版本:2.0.1+cu118(支持 sm_89,且稳定性较好)
  • NumPy 版本:1.26.4(1.x 版本,避免类型冲突)可通过以下命令验证:
conda list torch
conda list numpy

步骤 2:修改梯度修复工具代码

需要修改两个文件,禁用旧的梯度修复逻辑:

  1. 修改torch_utils/ops/conv2d_gradfix.py

找到文件中定义conv2d函数的部分(约30-40 行),将版本检查逻辑直接替换为返回 PyTorch 原生conv2d

原代码:

if _should_use_custom_op():
    return _conv2d_gradfix(*args, **kwargs)
else:
    warnings.warn(...)
    return torch.nn.functional.conv2d(*args, **kwargs)

修改为:(直接返回原生函数,跳过警告)

return torch.nn.functional.conv2d(*args, **kwargs)

如下图所示:

修改torch_utils/ops/grid_sample_gradfix.py

同理,找到grid_sample函数(约 30-40 行),替换为直接返回原生函数:

原代码:

if _should_use_custom_op():
    return _grid_sample_gradfix(*args, **kwargs)
else:
    warnings.warn(...)
    return torch.nn.functional.grid_sample(*args, **kwargs)

修改为:

return torch.nn.functional.grid_sample(*args, **kwargs)

如下图所示:

步骤 3:修复 NumPy 类型转换问题

之前的TypeError: full(): argument 'fill_value' must be Number是因为代码中使用了numpy.float32,而 PyTorch 2.x 更严格要求原生 Python 数值类型。修改training/networks.pyFullyConnectedLayer的初始化代码(约 91 行):

原代码:

self.bias = torch.nn.Parameter(torch.full([out_features], np.float32(bias_init))) if bias else None

修改为(转换为 Python 原生 float):

self.bias = torch.nn.Parameter(torch.full([out_features], float(np.float32(bias_init)))) if bias else None

重新运行训练脚本即可

原理说明

  1. 为什么禁用gradfixconv2d_gradfixgrid_sample_gradfix是针对 PyTorch 1.7-1.12 中梯度计算 bug 的修复工具,而 PyTorch 2.0 + 已原生修复了这些 bug,因此无需依赖旧工具。

  2. 为什么选择 PyTorch 2.0.1?2.0.1 是首个支持 sm_89(RTX 5060 属于该架构)的稳定版本,且对 StyleGAN2-ADA 的兼容性优于更高版本(2.1 + 改动更大)。

  3. NumPy 类型转换的作用?强制将numpy.float32转为 Python 原生float,避免 PyTorch 2.x 的类型检查报错。

4.终极大招:使用社区维护的兼容 PyTorch 2.x 的 StyleGAN2-ADA 分支

git clone https://github.com/NVlabs/stylegan2-ada-pytorch.git
cd stylegan2-ada-pytorch
git checkout pytorch2-compat  # 切换到兼容2.x的分支(若存在)

Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐