现场是这样的。编译自定义算子时报错,提示检测到的 CUDA 版本与 PyTorch 编译时使用的版本不同,nvcc 是 11.8 而 torch 显示 12.1。
中间走过弯路,把「环境变量 CUDA_HOME 指向旧目录」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。系统 PATH 里的 nvcc 来自另一套 CUDA 工具包;conda 环境里装了 cudatoolkit 但没装对应编译器;PyTorch 是通过 pip 安装的预编译包,与本地工具链无关。
动手时先对比两个版本号
nvcc --version; python -c "import torch;print(torch.version.cuda)"
接着把 CUDA_HOME 指向匹配的工具包
$env:CUDA_HOME='C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.1'
通过 conda 安装匹配的编译工具链
conda install -c nvidia cuda-toolkit=12.1
等前面都确认过,再重新编译并确认没有版本告警
python setup.py build_ext --inplace
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。编译过程没有版本不一致的提示,扩展能 import 成功,算子调用结果与参考实现一致。
提醒一点。预编译的 torch 轮子自带运行时,不依赖本地 nvcc,只有编译扩展时才需要版本对齐,别为了对齐去重装 torch。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。