在执行
python setup.py install
编译一些库时,由于torch版本过高导致的一些问题,本可以通过创建低版本torch环境解决,但由于涉及到CUDA版本更换过于麻烦,可以采取下面的方法
出现这个错误主要原因pytorch 版本大于1.5,可行方法如下
1.降低pytorch版本
2.csdn一些方法是将torch库中[‘ninja‘, ‘-v‘] 更换为[‘ninja‘, ‘--version‘],此方法一般不可行,不建议随便修改库函数,会导致其他正常程序出问题,可以采取以下更换,将setup.py中
# cmdclass={'build_ext': BuildExtension} #原来代码
cmdclass={'build_ext': BuildExtension.with_options(use_ninja=False)} # 改后代码
原理:pytorch默认使用ninjia作为backend,这里把它禁用掉就好了,可能会现警告但不妨碍正常编译成功
出现错误原因,由于 PyTorch 的升级导致 CUDA 相关的 THC 库的头文件 THC/THC.h
被整合到了 ATen
库之中,相关的代码需要相应的更新以适配新的库结构 可行方法如下:
1.降低pytorch版本
2.更换THC/THC.h 的函数 为 ATen/ATen.h 的函数,操作如下:
// #include <THC/THC.h>
// extern THCState *state;
再次运行可能会编译成功,也可能会报出该头文件引用的方法没有定义等等,请继续修改
修改方法 ,首先加入头文件
#include <ATen/cuda/ThrustAllocator.h>
将THCudaMalloc按照下文的形式修改(旧函数参数state 删除不要)
// float *dist_dev = (float*)THCudaMalloc(state, ref_nb * query_nb * sizeof(float));
float *dist_dev = (float*)c10::cuda::CUDACachingAllocator::raw_alloc(ref_nb * query_nb * sizeof(float));
THCudaFree的替换方式如下(旧函数参数state 删除不要):
//THCudaFree(state, dist_dev);
c10::cuda::CUDACachingAllocator::raw_delete(dist_dev);
编译时不再链接到老的 THC 库相关的错误处理,而是使用标准的 C++ 库,THError替换方式如下
#include <stdexcept>
// 代码前添加相关头文件
// THError("aborting");
throw std::runtime_error("aborting");
以上就是我遇到的错误及修改替代方法,运行后编译可能会出现警告,但是不妨碍编译通过,还有一下函数更换替代没有提及,大家可以参考我下面的参考贴,看看有没有你的错误,请大家学会阅读报错内容合理选择修改方式
参考: