最近打算跑一下Neural-Motifs文章代码 MotifNet,但是遇到了标题这个错误,记录一下解决过程。这份代码需要CUDA 9.0、Python 3、torchvision=0.2.0的环境。
原因
根据这篇的指导github,原因很可能是pytorch中的cuda版本与系统安装的CUDA版本号不一致导致的。先用以下命令查询该版本号:
python -c "import torch;print(torch.version.cuda)"
可以查看到pytorch的cuda版本号。这里我安装了pytorch 0.4.1,该语句输出对应的CUDA版本是9.0.176
nvcc --version
可以查看到当前环境的CUDA版本号,我用的是服务器自身安装的CUDA 10.2。
解决方法
如果这两个不一致,那就考虑把这两者的版本调整到一致,使得两者兼容。本文选择更改CUDA版本来解决这个问题。
pytorch 0.4.1、1.0.0、1.0.1、1.1.0这几个版本对应的CUDA版本都是9.0.176,因此安装这几个中的哪个版本的pytorch都ok。
如果想直接用已安装的CUDA 10.2,可以安装pytorch 1.5.0。pytorch 1.4.0对应的CUDA版本为10.1
-
安装CUDA 9.0
解决了pytorch的版本问题再安装CUDA 9.0到自己的环境中,也就是不用系统自身安装的CUDA (一般系统的会安装在/usr/local/cuda-x.x的目录中)
安装CUDA可以按照多版本CUDA安装与切换这个教程操作。
在NVIDIA官网上,下载对应系统的CUDA可执行文件的时候只有Ubuntu 16.04和17.04的系统,
下载地址:https://developer.nvidia.com/cuda-toolkit-archive
虽然我的是Ubuntu 18.04,但是没关系,目前亲自尝试了ubuntu18.04安装cuda9.0、cuDNN这个教程,以及非root用户更改gcc版本的教程,在自己的目录(/home/my_name/)下安装了gcc 5.5.0、cuda9.0和cuDNN7.6.4的环境。 -
使用虚拟环境时需要将相应的路径添加到环境变量
先启动虚拟环境,motif-net是我的环境名称。
source motif-net/bin/activate
添加cuda 9.0 和gcc 5.5.0 路径到PATH环境变量,“~/cuda/cuda9.0”是我上一步安装CUDA 9.0的路径,“~/gcc-5.5.0/bin”是我安装的gcc 5.5的bin目录,你需要根据你自己的设置修改以下命令。
export PATH=~/cuda/cuda9.0/bin:~/gcc-5.5.0/bin:$PATH
cuda的bin目录中包含了nvcc,使用nvcc -V可以查看该cuda的版本;类似地,gcc的bin目录包含了gcc、g++、cpp、c++等命令,使用gcc -v可以查看该gcc的版本。
- 在Neural-Motifs工程中的相关目录下执行以下操作
进入到工程中的“lib/fpn/nms”目录,新建一个bash文件,假设命名为build.sh
cd lib/fpn/nms
vi build.sh
在build.sh中输入以下内容,注意cuda_path要写之前安装的cuda9.0所在目录
#!/usr/bin/env bash
cuda_path=/home/your_name/cuda/cuda9.0
cd src/cuda
echo "Compiling stnn kernels by nvcc..."
nvcc -c -o nms.cu.o nms_kernel.cu -x cu -Xcompiler -fPIC -arch=sm_52
cd ../../
python build.py
然后按Esc,:wq 保存文件并退出
接着修改build.sh文件的权限为777,才能运行build.sh,否则该文件无法执行
chmod 777 build.sh
./build.sh
然后再次运行工程的pretrain_detector.sh就没有nms.so: undefined symbol: __cudaRegisterFatBinaryEnd的问题了,类似的处理lib/fpn/roi_align文件夹的内容也是类似的,先新建个bash文件,写入上述内容(注意修改nvcc那条语句的两个文件名),再修改文件权限,最后执行就ok。
转载请注明出处,谢谢。
参考:
https://github.com/rowanz/neural-motifs/issues/65