在論文復(fù)現(xiàn)安裝maskrcnn-benchmark依賴(lài)項(xiàng)的過(guò)程中,遇見(jiàn)了pytorch版本不匹配導(dǎo)致的無(wú)法安裝的問(wèn)題,現(xiàn)存的大多數(shù)內(nèi)容都建議安裝低版本的pytorch以解決問(wèn)題,但也不能總是這么干,不然自己這兼容性也太差了,順便也吐槽一下pytorch的兼容性問(wèn)題。在此總結(jié)一下,方便遇到相似問(wèn)題進(jìn)行參考。
主要遇到的問(wèn)題在于與THC相關(guān)的包很多都在pytorch更新的過(guò)程中被拋棄了,導(dǎo)致很多.cu文件在安裝依賴(lài)項(xiàng)時(shí)出現(xiàn)了不匹配的問(wèn)題。
本文中使用ubuntu-16.04.1操作系統(tǒng),pytorch版本為1.13.1,cuda版本為11.6,如pytorch更新后有更多的修改,請(qǐng)參閱其他文章。(以下問(wèn)題基本是由于pytorch由10.x更新為11.x后產(chǎn)生的不兼容問(wèn)題。)
Q1 fatal error: THC/THC.h: No such file or directory
開(kāi)始時(shí)首先遇到了頭文件無(wú)法引用的問(wèn)題,這個(gè)問(wèn)題參考了博客(138條消息) fatal error: THC/THC.h: No such file or directory_thc/thc.h: 沒(méi)有那個(gè)文件或目錄_o0stinger0o的博客-CSDN博客的內(nèi)容,時(shí)間在22年3月-4月之間,以及博客中提到的github代碼中更新的內(nèi)容。
可以看到,在/maskrcnn_benchmark/csrc/cuda文件夾中的所有以.cu結(jié)尾的代碼文件中刪除了下述頭文件:
#include <THC/THC.h>
并且把所有的
THCudaCheck(cudaGetLastError());
替換成了
AT_CUDA_CHECK(cudaGetLastError());
Q2 "THCCeilDiv" is undefined
之后又找到出現(xiàn)了這個(gè)問(wèn)題,再調(diào)查一番,發(fā)現(xiàn)pytorch后來(lái)沒(méi)有對(duì)這個(gè)函數(shù)的定義了,因此需要進(jìn)行更換。
基于這樣的想法,查閱資料找到Faster RCNN pytorch 1.0版調(diào)試(踩坑)過(guò)程記錄 | 碼農(nóng)家園 (codenong.com)中這樣的一段代碼:
//dim3 grid(std::min(THCCeilDiv(**, 512L), 4096L));
dim3 grid(std::min(((int)** + 512 -1) / 512, 4096));
可以用這樣的方式進(jìn)行替換:即對(duì)每個(gè).cu文件中調(diào)用THCCeilDiv(x,y)的地方,都把這個(gè)函數(shù)換成 (x+y-1)/y的形式,即可完成變換。
--2023.10.5--
在翻看的過(guò)程中找到了官方對(duì)此函數(shù)不再支持使用的文檔。
Migrate remainder of THCDeviceUtils.cuh to ATen by peterbell10 · Pull Request #65472 · pytorch/pytorch · GitHub
在所有使用此函數(shù)的文件中加入頭文件:
#include<ATen/ceil_div.h>
隨后進(jìn)行代碼替換:
//dim3 grid(std::min(THCCeilDiv(**, 512L), 4096L));
dim3 grid(std::min(at::ceil_div(**, 512), 4096));
即可實(shí)現(xiàn)與上面方法相同的修改。
--2023.10.5--
Q3 THCudaMalloc、THCudaFree THCState undefined
這三個(gè)問(wèn)題本質(zhì)是一個(gè)問(wèn)題,就是在更新過(guò)程中pytorch不再需要malloc和free,也自然不需要state用于幫助申請(qǐng)空間。這里參考了PyTorch 1.11 發(fā)布,帶來(lái) TorchData 和 functorch 兩個(gè)新庫(kù)_支持_linalg_Tensor (sohu.com)和(138條消息) 項(xiàng)目環(huán)境由pytorch1.10升級(jí)1.11中間要改的東西_pytorch1.11和1.10_小隨風(fēng)_hi的博客-CSDN博客兩個(gè)文檔,其中后一個(gè)文檔的2成功幫助我解決了Q3這個(gè)問(wèn)題。其實(shí)就是庫(kù)廢掉了,需要換一下使用的函數(shù)。
首先在用到Malloc和Free函數(shù)的文件中加入頭文件
(有可能需要將THCThrustAllocator.cuh替換為該文件或直接include)
#include <ATen/cuda/ThrustAllocator.h>
與之相關(guān)的共有三個(gè)語(yǔ)句,分別為用THCState構(gòu)建一個(gè)state,再將state輸入Malloc函數(shù)生成空間,隨后通過(guò)free釋放掉上述空間。
此處我們注釋掉THCState這句話(huà),因?yàn)樵谛碌膒ytorch中不需要使用該數(shù)據(jù)類(lèi)型來(lái)生成Malloc所需空間。
THCState *state = at::globalContext().lazyInitCUDA(); // TODO replace with getTHCState
之后我們將THCudaMalloc按照下文的形式修改(舊函數(shù)第二個(gè)參數(shù)作為新函數(shù)的唯一參數(shù))
//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頭文件,否則會(huì)報(bào)錯(cuò)!
至此,上述問(wèn)題全部解決,沒(méi)有降低pytorch版本即可解決問(wèn)題。我需要的內(nèi)容也成功編譯。
對(duì)于THC本身,在這個(gè)過(guò)程中我也了解了一下,可移步參考(138條消息) PyTorch源碼淺析(2):THC_邵政道的博客-CSDN博客_thcstate。不過(guò)這個(gè)也是過(guò)去式了,了解下就好了。還是要向前看的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-417395.html
若后續(xù)還有什么新的相關(guān)內(nèi)容再更新一下子吧。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-417395.html
到了這里,關(guān)于pytorch版本不匹配導(dǎo)致的THC.h: No such file or directory 、THCCudaMalloc not defined等問(wèn)題解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!