赞
踩
在用到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,因为编译脚本里面有目录的读取需要加权限。
python环境中缺少了torch.utils.cpp_extension模块,这个模块是Pytorch库的一部分,用于编写和加载C++扩展。或者没有正确安装、版本不兼容导致的。
安装或更新Pytorch库,方法网上很多,但是更换好几个版本都不能解决问题;
最后想到是不是本来有此模块,只是找不到而已,所以添加pytorch的环境变量,也没有解决问题。
因为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
至此该问题解决。
新版本删除THC/THC.h是因为用新函数实现了功能
代码中删除头文件:#include <THC/THC.h>
并且把所有的 THCudaCheck(cudaGetLastError());
替换成 AT_CUDA_CHECK(cudaGetLastError());
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));
这三个问题本质是一个问题,就是在更新过程中pytorch不再需要malloc和free,也自然不需要state用于帮助申请空间。其实就是库废掉了,需要换一下使用的函数。
1)、首先在用到Malloc和Free函数的文件中加入头文件,有可能需要将THCThrustAllocator.cuh替换为该文件或直接加入:
#include <ATen/cuda/ThrustAllocator.h>
2)、与之相关的共有三个语句,分别为用THCState构建一个state,再将state输入Malloc函数生成空间,随后通过free释放掉上述空间。此处我们注释掉THCState这句话,因为在新的pytorch中不需要使用该数据类型来生成Malloc所需空间。即注释下面函数
THCState *state = at::globalContext().lazyInitCUDA(); // TODO replace with getTHCState
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));
4)、THCudaFree的替换方式如下:
// THCudaFree(state, mask_dev);
c10::cuda::CUDACachingAllocator::raw_delete(mask_dev);
注意一定要在最前面include一下ThrustAllocator.h
头文件,否则会报错!
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>
高版本的pytorch不再使用AT_CHECK,
将AT_CHECK
替换为 TORCH_CHECK
。
至此,上述问题全部解决,没有降低pytorch版本即可解决问题。我需要的内容也成功编译。
1、 https://www.iotword.com/10003.html
2 、https://wenku.csdn.net/answer/ead2c0f6dad5b4128181ece37e3ed17
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。