之前写过两篇文章:
“export CUDA_HOME=” 与 “export CUDA_HOME=$CUDA_HOME:”的区别
一直没搞明白:
- 为什么会出现
/usr/local/cuda-12.1:/usr/local/cuda-12.1:/usr/local/cuda-12.1/bin/nvcc
这种重复了一堆的情况。
今天花了一下午终于搞明白了里面的弯弯绕绕!
先把网上见得最多的CUDA环境变量配置放这里,这也是所有的罪魁祸首!(不过也怪自己,本来网上的信息很多就是纷繁杂乱,需要自己分辨,知其然而不知其所以然万万不可取)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.2/lib64
export PATH=$PATH:/usr/local/cuda-10.2/bin
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.2
上一篇提到,export CUDA_HOME=xxx
是设置变量,而 export CUDA_HOME=$CUDA_HOME:xxx
追加变量,中间用冒号(:
)隔开。
重点!!!
而有些代码在写的时候,他不跟系统环境变量一样直接在 $PATH
里找,而是在 $CUDA_HOME
后加上 /bin/nvcc
来运行CUDA命令。那么问题就来了,由于在 .bashrc
中写的是 CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.2
,就会在运行代码的时候一直往已有的 $CUDA_HOME
后加 :/usr/local/cuda-10.2
,最终出现 /usr/local/cuda-12.1:/usr/local/cuda-12.1:/usr/local/cuda-12.1/bin/nvcc
这种情况。
然后!!!
我就没细想直接改成了
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64
export PATH=/usr/local/cuda-10.2/bin
export CUDA_HOME=/usr/local/cuda-10.2
这种,发现会出现
"Command 'dirname' is available in the following places
* /bin/dirname
* /usr/bin/dirname
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
dirname: command not found
Command 'dirname' is available in the following places
* /bin/dirname
* /usr/bin/dirname
The command could not be located because '/usr/bin:/bin' is not included in the PATH environment variable.
dirname: command not found".
这种错误。
刚开始一直没想明白,后来突然开窍了……$PATH
这种重量级的变量(环境变量),他还真是得追加,而非直接赋值,要不直接可不就是把之前 $PATH
里的东西全给覆盖了吗……
所以最终,正确的配置方式:
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64
export CUDA_HOME=/usr/local/cuda-10.2
export PATH=$PATH:/usr/local/cuda-10.2/bin
其实是分两部分,一个是将CUDA的 bin
文件夹下的文件都加入系统路径(PATH
),另外是创建两个CUDA独特的变量 CUDA_HOME
以及 LD_LIBRARY_PATH
以供某些代码(如PyTorch框架)访问。