当前位置:   article > 正文

解决Pytorch版本不匹配导致的一些问题_getthcstate

getthcstate

背景:

在用到mmdetection工程的时候,遇到了因为pytorch 版本不匹配导致无法编译的问题。网上的大部分建议是降低pytorch 版本解决问题,考虑到其他项目的兼容性,也不能总是这么做。在此总结一下,遇到的问题和解决办法:

环境:

ubuntu-18.04操作系统、cuda10.2,pytoch1.12.0+cu102,python3.7.0
mmdetection工程:libuyu/mmdetection :
https://github.com/libuyu/mmdetection/tree/be06992564cc6b995b1ae86a258568e9d7b7a599?tab=readme-ov-file
问题出现的步骤是:在mmdetection目录下执行命令:
./compile.sh 这里需要加sudo,因为编译脚本里面有目录的读取需要加权限。

问题1、No module named torch.utils.cpp_extension

原因:

python环境中缺少了torch.utils.cpp_extension模块,这个模块是Pytorch库的一部分,用于编写和加载C++扩展。或者没有正确安装、版本不兼容导致的。

解决办法1:

安装或更新Pytorch库,方法网上很多,但是更换好几个版本都不能解决问题;

解决办法2:

最后想到是不是本来有此模块,只是找不到而已,所以添加pytorch的环境变量,也没有解决问题。

解决办法3:

因为pytorch是安装在python路径下的,所以在编译脚本comile.sh里面,修改python路径,让其找到该模块,修改地方如下:
PYTHON=${PYTHON:-"python"}修改为:PYTHON=${PYTHON3:-"python"}
PYTHON setup.py build_ext --inplace 修改为:

Sudo  /home/liquan/anaconda3/envs/ghm/bin/python  setup.py build_ext --inplace
  • 1

至此该问题解决。

问题2、fatal error: THC/THC.h: No such file or directory

原因:

新版本删除THC/THC.h是因为用新函数实现了功能

解决办法:

代码中删除头文件:#include <THC/THC.h>
并且把所有的 THCudaCheck(cudaGetLastError());
替换成 AT_CUDA_CHECK(cudaGetLastError());

问题3、“THCCeilDiv” is undefined

原因:

pytorch后来没有对这个函数的定义了,因此需要进行更换。

解决办法:

即对每个.cu文件中调用THCCeilDiv(x,y)的地方,都把这个函数换成 (x+y-1)/y的形式,即可完成变换。类似如下:

//dim3 grid(std::min(THCCeilDiv(**, 512L), 4096L));
dim3 grid(std::min(((int)** + 512 -1) / 512, 4096));
  • 1
  • 2

问题4、THCudaMalloc、THCudaFree、THCState undefined

原因:

这三个问题本质是一个问题,就是在更新过程中pytorch不再需要malloc和free,也自然不需要state用于帮助申请空间。其实就是库废掉了,需要换一下使用的函数。

解决办法:

1)、首先在用到Malloc和Free函数的文件中加入头文件,有可能需要将THCThrustAllocator.cuh替换为该文件或直接加入:

#include <ATen/cuda/ThrustAllocator.h>
  • 1

2)、与之相关的共有三个语句,分别为用THCState构建一个state,再将state输入Malloc函数生成空间,随后通过free释放掉上述空间。此处我们注释掉THCState这句话,因为在新的pytorch中不需要使用该数据类型来生成Malloc所需空间。即注释下面函数

THCState *state = at::globalContext().lazyInitCUDA(); // TODO replace with getTHCState
  • 1

3)、将THCudaMalloc按照下文的形式修改(旧函数第二个参数作为新函数的唯一参数)

//mask_dev = (unsigned long long*) THCudaMalloc(state, boxes_num * col_blocks * sizeof(unsigned long long));
mask_dev = (unsigned long long*) c10::cuda::CUDACachingAllocator::raw_alloc(boxes_num * col_blocks * sizeof(unsigned long long));
  • 1
  • 2

4)、THCudaFree的替换方式如下:

// THCudaFree(state, mask_dev); 
c10::cuda::CUDACachingAllocator::raw_delete(mask_dev);
  • 1
  • 2

注意一定要在最前面include一下ThrustAllocator.h头文件,否则会报错!

问题5、error: identifier “THCudaCheck” is undefined

原因:

THCudaCheck 在 pytorch 1.11.0 版本被移除了,可以看文档 https://www.exxactcorp.com/blog/Deep-Learning/pytorch-1-11-0-now-available

解决方法:

THCudaCheck 替换成 C10_CUDA_CHECK
注意,最后必须加头文件:#include <ATen/cuda/ThrustAllocator.h>

问题6、src/roi_align_cuda.cpp:20:23: error: ‘AT_CHECK’ was not declared in this scope

原因:

高版本的pytorch不再使用AT_CHECK,

解决办法:

AT_CHECK 替换为 TORCH_CHECK
至此,上述问题全部解决,没有降低pytorch版本即可解决问题。我需要的内容也成功编译。

参考:

1、 https://www.iotword.com/10003.html
2 、https://wenku.csdn.net/answer/ead2c0f6dad5b4128181ece37e3ed17
  • 1
  • 2
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号