您的当前位置:首页正文

编译报错记录 subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1

2024-11-17 来源:个人技术集锦

在执行

python setup.py install

编译一些库时,由于torch版本过高导致的一些问题,本可以通过创建低版本torch环境解决,但由于涉及到CUDA版本更换过于麻烦,可以采取下面的方法

1.  报错 subprocess.CalledProcessError: Command ‘[‘ninja‘, ‘-v‘]‘ returned non-zero exit status 1

出现这个错误主要原因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,这里把它禁用掉就好了,可能会现警告但不妨碍正常编译成功

2.  报错 THC/THC.h: No such file or directory 没有那个文件或目录

出现错误原因,由于 PyTorch 的升级导致 CUDA 相关的 THC 库的头文件 THC/THC.h 被整合到了 ATen 库之中,相关的代码需要相应的更新以适配新的库结构 可行方法如下:

1.降低pytorch版本

2.更换THC/THC.h 的函数 为 ATen/ATen.h 的函数,操作如下:

(1) 定位程序可以直接将所有 include <THC/THC.h> 头文件(和THC相关)注释掉

// #include <THC/THC.h>
// extern THCState *state;

再次运行可能会编译成功,也可能会报出该头文件引用的方法没有定义等等,请继续修改

3.  继续报错error: ‘THCudaMalloc’ was not declared in this scope; error: ‘state’ was not declared in this scope;

修改方法 ,首先加入头文件

#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));

4.  继续报错‘THCudaFree’ was not declared in this scope;

THCudaFree的替换方式如下(旧函数参数state 删除不要):

//THCudaFree(state, dist_dev);
c10::cuda::CUDACachingAllocator::raw_delete(dist_dev);

5.  继续报错error: ‘THError’ was not declared in this scope

编译时不再链接到老的 THC 库相关的错误处理,而是使用标准的 C++ 库,THError替换方式如下

#include <stdexcept>
// 代码前添加相关头文件

// THError("aborting");  
throw std::runtime_error("aborting");

以上就是我遇到的错误及修改替代方法,运行后编译可能会出现警告,但是不妨碍编译通过,还有一下函数更换替代没有提及,大家可以参考我下面的参考贴,看看有没有你的错误,请大家学会阅读报错内容合理选择修改方式

参考:

显示全文