2024-04-11
tinycudann的编译问题
记录在 CUDA 版本映射不一致时编译 tiny-cuda-nn 的报错原因与环境配置处理方法。
问题描述
虚拟环境已安装:
- torch 1.12.1+cu113
- torchaudio 0.12.1+cu113
- torchvision 0.13.1+cu113
在虚拟环境中,安装tinycudann:
pip install git+https://github.com/NVlabs/tiny-cuda-nn/#subdirectory=bindings/torch
报错:
error: [Errno 2] No such file or directory: ':/usr/local/cuda-11.3:/usr/local/cuda-11.3/bin/nvcc'
问题是找不到cuda11.3对应的nvcc。
成功解决的方法
查看当前的cuda映射:
cd /usr/local
stat cuda
返回:
File: cuda -> /usr/local/cuda-11.8/
表明当前映射到了11.8,需要切换成11.3:
sudo rm -rf cuda
sudo ln -s /usr/local/cuda-11.3 /usr/local/cuda
看一下当前的nvcc版本:
nvcc -V
返回的是11.5,需要切换成11.3。
查看和更改nvcc映射:
cd /usr/bin
stat nvcc
发现当前没有映射,于是添加软连接:
sudo rm -rf /usr/bin/nvcc
sudo ln -s /usr/local/cuda-11.3/bin/nvcc /usr/bin/nvcc
但报错:/usr/bin/nvcc已存在,此路不通。
于是在/usr目录下,查找所有nvcc命名文件:
find /usr -type f -iname nvcc
返回:
/usr/bin/nvcc
/usr/local/cuda-11.8/bin/nvcc
/usr/local/cuda-11.3/bin/nvcc
/usr/lib/nvidia-cuda-toolkit/bin/nvcc
用which指令在环境变量$PATH设置的目录里查找nvcc:
which nvcc
返回:
/usr/bin/nvcc
说明实际上执行的是/usr/bin/nvcc这个文件,打开它查看其中的内容:
cat /usr/bin/nvcc
返回:
exec /usr/lib/nvidia-cuda-toolkit/bin/nvcc "$@"
说明/usr/bin/nvcc这个文件的作用是指定执行哪个nvcc。可以看出,真正执行的是/usr/lib/nvidia-cuda-toolkit/bin/nvcc而不是需要的/usr/local/cuda-11.3/bin/nvcc。下面就把它改过来。
vim打开/usr/bin/nvcc:
sudo vi nvcc
键入o,新建一行,将执行文件改成/usr/local/cuda-11.3/bin/nvcc,并把原来的一行注释掉(方便改回来)。最终的文件内容是:
# exec /usr/lib/nvidia-cuda-toolkit/bin/nvcc "$@"
exec /usr/local/cuda-11.3/bin/nvcc "$@"
按下esc , 退出编辑模式,回到命令模式。然后键入:wq保存并退出。
检查当前的nvcc版本,切换成功:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Mar_21_19:15:46_PDT_2021
Cuda compilation tools, release 11.3, V11.3.58
Build cuda_11.3.r11.3/compiler.29745058_0
接下来又出现一个问题:
raise RuntimeError(
RuntimeError: The current installed version of g++ (10.5.0) is greater than the maximum required version by CUDA 11.3 (10.0.0). Please make sure to use an adequate version of g++ (>=5.0.0, <=10.0.0).
也就是说当前g++的版本是10.5,但要求是5.0-10.0。
查看所有可供选择的g++:
sudo update-alternatives --config g++
返回:
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/g++-11 50 auto mode
* 1 /usr/bin/g++-10 20 manual mode
2 /usr/bin/g++-11 50 manual mode
3 /usr/bin/g++-9 30 manual mode
切换到g++-9即可。
如果有已经安装的g++版本,但是列表中并没有呈现,可通过下面的指令添加:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 40
然后成功安装tinycudann。