Back to Blog

2024-04-11

tinycudann的编译问题

记录在 CUDA 版本映射不一致时编译 tiny-cuda-nn 的报错原因与环境配置处理方法。

  • 配置
  • CUDA
  • tinycudann

问题描述

虚拟环境已安装:

  • 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。