返回顶部
首页 > 资讯 > 后端开发 > Python >pytorch版本不匹配导致的THC.h: No such file or directory 、THCCudaMalloc not defined等问题解决方案
  • 647
分享到

pytorch版本不匹配导致的THC.h: No such file or directory 、THCCudaMalloc not defined等问题解决方案

pythonpytorch计算机视觉Poweredby金山文档 2023-09-10 22:09:58 647人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

在进行INSTALL.md安装maskrcnn-benchmark依赖项的过程中,遇见了PyTorch版本不匹配导致的无法安装的问题,现存的大多数内容都建议安装低版本的pytorch以解决问题,但也不能总是这么干,不然自己这兼容性也太差了,

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

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

本文中使用ubuntu-16.04.1操作系统,pytorch版本为1.13.1,cuda版本为11.6,如pytorch更新后有更多的修改,请参阅其他文章。

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代码中更新的内容。可以看到,代码中删除了头文件:

#include 

并且把所有的

 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的形式,即可完成变换。

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 

与之相关的共有三个语句,分别为用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。不过这个也是过去式了,了解下就好了。还是要向前看的。

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

来源地址:https://blog.csdn.net/code_zhao/article/details/129172817

--结束END--

本文标题: pytorch版本不匹配导致的THC.h: No such file or directory 、THCCudaMalloc not defined等问题解决方案

本文链接: https://lsjlt.com/news/402671.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作