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