Maskrcnn/Faster-rcnn依赖项安装过程中THC.h: No such file or directory/THCeilDiv Undefined/分配内存空间等问题的解决方案

在论文复现安装maskrcnn-benchmark依赖项的过程中,遇见了pytorch版本不匹配导致的无法安装的问题,现存的大多数内容都建议安装低版本的pytorch以解决问题,但也不能总是这么干,不然自己这兼容性也太差了,顺便也吐槽一下pytorch的兼容性问题。在此总结一下,方便遇到相似问题进行参考。

主要遇到的问题在于与THC相关的包很多都在pytorch更新的过程中被抛弃了,导致很多.cu文件在安装依赖项时出现了不匹配的问题。

本文中使用ubuntu-16.04.1操作系统,pytorch版本为1.13.1,cuda版本为11.6,如pytorch更新后有更多的修改,请参阅其他文章。(以下问题基本是由于pytorch由10.x更新为11.x后产生的不兼容问题。)

Q1 fatal error: THC/THC.h: No such file or directory

开始时首先遇到了头文件无法引用的问题,这个问题参考了博客(138条消息) fatal error: THC/THC.h: No such file or directory_thc/thc.h: 没有那个文件或目录_o0stinger0o的博客-CSDN博客的内容,时间在22年3月-4月之间,以及博客中提到的github代码中更新的内容。

可以看到,在/maskrcnn_benchmark/csrc/cuda文件夹中的所有以.cu结尾的代码文件中删除了下述头文件:

#include <THC/THC.h>

并且把所有的

THCudaCheck(cudaGetLastError());

替换成了

AT_CUDA_CHECK(cudaGetLastError());

Q2 "THCCeilDiv" is undefined

之后又找到出现了这个问题,再调查一番,发现pytorch后来没有对这个函数的定义了,因此需要进行更换。

基于这样的想法,查阅资料找到Faster RCNN pytorch 1.0版调试(踩坑)过程记录 | 码农家园 (codenong.com)中这样的一段代码:


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

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

--2023.10.5--

在翻看的过程中找到了官方对此函数不再支持使用的文档。

Migrate remainder of THCDeviceUtils.cuh to ATen by peterbell10 · Pull Request #65472 · pytorch/pytorch · GitHub

在所有使用此函数的文件中加入头文件:

#include<ATen/ceil_div.h>

随后进行代码替换:


//dim3 grid(std::min(THCCeilDiv(**, 512L), 4096L));
dim3 grid(std::min(at::ceil_div(**, 512), 4096));

即可实现与上面方法相同的修改。

--2023.10.5--

Q3 THCudaMalloc、THCudaFree THCState undefined

这三个问题本质是一个问题,就是在更新过程中pytorch不再需要malloc和free,也自然不需要state用于帮助申请空间。这里参考了PyTorch 1.11 发布,带来 TorchData 和 functorch 两个新库_支持_linalg_Tensor (sohu.com)(138条消息) 项目环境由pytorch1.10升级1.11中间要改的东西_pytorch1.11和1.10_小随风_hi的博客-CSDN博客两个文档,其中后一个文档的2成功帮助我解决了Q3这个问题。其实就是库废掉了,需要换一下使用的函数。

首先在用到Malloc和Free函数的文件中加入头文件

(有可能需要将THCThrustAllocator.cuh替换为该文件或直接include)


#include <ATen/cuda/ThrustAllocator.h>

与之相关的共有三个语句,分别为用THCState构建一个state,再将state输入Malloc函数生成空间,随后通过free释放掉上述空间。

此处我们注释掉THCState这句话,因为在新的pytorch中不需要使用该数据类型来生成Malloc所需空间。


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

之后我们将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));

THCudaFree的替换方式如下:


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

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

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

对于THC本身,在这个过程中我也了解了一下,可移步参考(138条消息) PyTorch源码浅析(2):THC_邵政道的博客-CSDN博客_thcstate。不过这个也是过去式了,了解下就好了。还是要向前看的。

若后续还有什么新的相关内容再更新一下子吧。

ERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1011"' -DTORCH_EXTENSION_NAME=sparse_conv_ext -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_86,code=compute_86 -gencode=arch=compute_86,code=sm_86 FAILED: /tmp/pip-install-2orq3ccd/mmdet3d_bedd1fa9197349c4b23a2ae1df261803/build/temp.linux-x86_64-cpython-38/mmdet3d/ops/spconv/src/indice_cuda.o /usr/local/cuda/bin/nvcc -DWITH_CUDA -I/tmp/pip-install-2orq3ccd/mmdet3d_bedd1fa9197349c4b23a2ae1df261803/mmdet3d/ops/spconv/include -I/root/miniconda3/envs/open-mmlab/lib/python3.8/site-packages/torch/include -I/root/miniconda3/envs/open-mmlab/lib/python3.8/site-packages/torch/include/torch/csrc/api/include -I/root/miniconda3/envs/open-mmlab/lib/python3.8/site-packages/torch/include/TH -I/root/miniconda3/envs/open-mmlab/lib/python3.8/site-packages/torch/include/THC -I/usr/local/cuda/include -I/root/miniconda3/envs/open-mmlab/include/python3.8 -c -c /tmp/pip-install-2orq3ccd/mmdet3d_bedd1fa9197349c4b23a2ae1df261803/mmdet3d/ops/spconv/src/indice_cuda.cu -o /tmp/pip-install-2orq3ccd/mmdet3d_bedd1fa9197349c4b23a2ae1df261803/build/temp.linux-x86_64-cpython-38/mmdet3d/ops/spconv/src/indice_cuda.o -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_BFLOAT16_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ --expt-relaxed-constexpr --compiler-options ''"'"'-fPIC'"'"'' -w -std=c++14 -D__CUDA_NO_HALF_OPERATORS__ -D__CUDA_NO_HALF_CONVERSIONS__ -D__CUDA_NO_HALF2_OPERATORS__ -DTORCH_API_INCLUDE_EXTENSION_H '-DPYBIND11_COMPILER_TYPE="_gcc"' '-DPYBIND11_STDLIB="_libstdcpp"' '-DPYBIND11_BUILD_ABI="_cxxabi1011"' -DTORCH_EXTENSION_NAME=sparse_conv_ext -D_GLIBCXX_USE_CXX11_ABI=0 -gencode=arch=compute_86,code=compute_86 -gencode=arch=compute_86,code=sm_86 /tmp/pip-install-2orq3ccd/mmdet3d_bedd1fa9197349c4b23a2ae1df261803/mmdet3d/ops/spconv/src/indice_cuda.cu:16:10: fatal error: spconv/indice.cu.h: No such file or directory 16 | #include <spconv/indice.cu.h> | ^~~~~~~~~~~~~~~~~~~~ compilation terminated.
最新发布
03-26
从您提供的错误信息来看,这是一个与CUDA相关的编译失败问题。以下是详细的分析和解决建议: --- ### 错误原因分析 1. **核心提示**: ``` fatal error: spconv/indice.cu.h: No such file or directory ``` 这表明编译器无法找到 `spconv/indice.cu.h` 文件。 2. **上下文背景**: 您正在尝试安装一个深度学习库 (如 mmdet3d),其中涉及到自定义 CUDA 扩展模块的构建。这个过程需要依赖于特定路径下的头文件 (`*.h`) 和源代码文件 (`*.cu`)。 3. **可能的原因**: - 缺少必要的依赖项或第三方库。 - 安装过程中未正确指定某些环境变量(例如 `INCLUDE_PATH` 或 `LIBRARY_PATH`)。 - 系统上缺少 NVIDIA 的 CUDA 工具链支持(包括正确的版本匹配)。 - PyTorch 版本、CUDA 驱动程序版本以及 GPU 架构之间的兼容性问题。 4. **关键配置检查点**: - CUDA 相关选项:`-gencode=arch=compute_86,code=sm_86` 表示目标硬件架构为 Ampere (计算能力 8.6)。如果您的显卡并非此型号,则可能导致不必要地生成无效指令集。 - C++ 标准设置为 `-std=c++14`,通常足以满足大多数现代框架需求;但如果项目强制要求更高标准(比如 C++17),则可能会引发其他潜在冲突。 5. **进一步推测**: 如果确实存在上述任一因素干扰到正常流程运转的话,那么很可能是由于以下情况导致了此次 build 失败: * 开发者忘记将预处理好的 `.cu.h` 包含进发布包里; * 使用 pip install 方式获取最新版源码仓库内容而跳过了官方推荐稳定分支; * 当前操作系统平台缺乏对所有功能全面的支持(尤其是针对 windows 平台而言尤为明显). --- ### 解决方案 #### 方法一:确认是否遗漏重要组件 确保已经下载完整的 spConv 库及其对应的 include 路径已添加至 NVCC 命令行参数内(-I标志)。如果您是从 git clone 得来的原始资源,请务必按照文档说明完成初始化步骤后再试一次。 ```bash # 示例命令 git submodule update --init --recursive ``` 同时验证本地是否有类似结构存放该丢失头部声明的位置: * .../mmdetection3d/mmdet3d/ops/spconv/include/ 假如依然缺失对应标题档案夹(`include`)及底下资料成员们时考虑手动拉取完整压缩包解压替换掉旧目录即可恢复常态运作状况啦! --- #### 方法二:调整编译选项适配当前设备规格 修改 Makefile 中关于 target arch 属性设定值部分使之更贴近实际运行机器物理属性描述形式如下所示例子可供参考借鉴作用喔~ 原样貌呈现样子大概是这样子滴呢:`ARCH=-gencode arch=compute_60,code=sm_60 -gencode arch=compute_61,...`,更改之后的样子应该长成这样子才对哦~`(假设有 Pascal Titan X)`: ```makefile NVCC_FLAGS += $(EXTRA_NVCC_FLAGS) ifeq ($(strip $(TARGET_ARCH)),pascal) ARCH := -gencode arch=compute_60,code=[sm_60,compute_60] \ -gencode arch=compute_61,code=[sm_61,compute_61] endif ``` 然后重新执行 make all 即可顺利进入下一环节咯~ --- #### 方法三:切换适合自身系统的Pytorch/CUDA组合搭配模式试试看吧! 有时候仅仅是因为相互之间版本号差异太大才会造成诸如此类麻烦的事情发生嘛...所以不妨试着降低一点先前选用过高或者过低版本数值看看效果怎么样?比如说如果你现在用的是cuda11.x+pytoch nightly version ,那就不妨换成相对保守一些的选择组合策略吧!像这样子操作会比较稳妥安全些哈~ ```shell script conda create python=3.8 pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch pip install mmcv-full==latest.* -f https://download.openmmlab.com/mmcv/dist/cu102/torchx.y/html/ pip install open-mmlab/mmdetection3d.git@master ``` > 注释: cu102代表使用nvidia cuda toolkit vesion 10.2; torchx.y需依据实际情况填写准确数字串序列. ---
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值