在安裝使用 detectron2 的時候碰到**Kernel not compiled with GPU support **問題,前后拖了好久都沒解決,現總結一下以備以后查閱。
不想看心路歷程的可以直接跳到最后一小節,哈哈哈。
environment
因為我使用的是實驗室的服務器,所以很多東西沒法改,我的 cuda 環境如下:
- ubuntu
nvcc
默認版本是 9.2nvidia-smi
版本又是 10.0 的
我之前一直沒搞清楚這
nvcc
和nvidia-smi
版本為什么可以不一樣,想了解原因的可以看一下我之前的文章顯卡,顯卡驅動,nvcc, cuda driver,cudatoolkit,cudnn 到底是什么?。
reproduce
我一般都用 Anaconda 來安裝 pytorch,第一次安裝的時候使用的如下命令安裝的:
conda create -n myenv python=3.7
conda activate myenv
conda install pytorch torchvision cudatoolkit=10.1 -c pytorch
按理說這個命令會給myenv
環境安裝 cuda 編譯器和驅動等,但是在運行代碼的時候還是會出現標題中的報錯信息。我猜可能是因為 detectron2 在 build 的時候使用的是/usr/local
路徑下的 cuda compiler(即 nvcc),而不是我的虛擬幻境下的 compiler。所以我重新安裝了 cuda-9.2 版本的 pytorch,
conda install pytorch torchvision cudatoolkit=9.2 -c pytorch
但是運行的時候還是出現同樣的錯誤,這更加說明 detectron2 的編譯使用的不是虛擬環境路徑下的編譯器,所以我在想是不是我沒有正確設置系統路徑下的 CUDA,於是我用官方提供的檢驗代碼查看 CUDA 路徑:
python -c 'import torch; from torch.utils.cpp_extension import CUDA_HOME; print(torch.cuda.is_available(), CUDA_HOME)'
輸出的結果是
true /usr/local
可以看到CUDA_HOME
對應的輸出結果有問題,照理來說輸出結果應該是/usr/local/cuda
或者/usr/local/cuda-9.2
之類的,於是我又查看了~/.bashrc
文件,找到與 CUDA 有關的代碼部分,發現我並沒有設置CUDA_HOME
這個環境變量,於是我做了如下修改:
# vim ~/.bashrc
export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda/lib64
之后 souce 一下
source ~/.bashrc
再運行python -c 'import torch; from torch.utils.cpp_extension import CUDA_HOME; print(torch.cuda.is_available(), CUDA_HOME)'
輸出的結果變為true /usr/local/cuda
此時Kernel not compiled with GPU support
的問題就解決了,代碼正常運行了。
總結
步驟總結
- 安裝相關庫
conda create -n myenv python=3.7
conda activate myenv
conda install pytorch torchvision cudatoolkit=9.2 -c pytorch
pip install opencv-python
pip install 'git+https://github.com/facebookresearch/fvcore'
pip install cython; pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
- 編譯 detectron2
python setup.py build develop
可能出現的問題和解決辦法
出現標題中的錯誤的原因主要是因為你的 cuda 版本或者路徑除了問題,你可以按照如下幾個步驟排查可能是那個地方出了問題:
- 運行
nvcc --version
查看你的 cuda 編譯器版本,那么你的 pytorch-gpu 也建議安裝對應版本。當然如果你nvcc
都沒安裝。。。那你就先找教程安裝。 - 如果安裝的 pytorch 版本和
nvcc
版本一致,你可以看一下你的 CUDA 路徑是否在~/.bashrc
中設置正確,參考的配置路徑如下:
# vim ~/.bashrc
export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/lib
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda/lib64
設置好后source ~/.bashrc
,然后刪除detectron2/build
文件夾(如果你之前已經編譯過一遍了),然后重新編譯dete2tron2
。
感謝xiedian一句話總結了上面的問題根本原因:
上述問題其實是因為 conda 安裝的 cudatools 只是一個子集,里面是沒有 nvcc 的,要用 nvcc 就必須用系統裝的