目录
简介
- cuda:完整版的cuda
- cuda动态链接库:阉割版的cuda,只有cuda运行时需要的动态链接库。
- cudatoolkit:是conda提供的阉割版的cuda,只有cuda运行时需要的动态链接库。
pytorch选择cuda的顺序
- 分为编译时的查找顺序和执行时的查找顺序
- 编译时的查找顺序由 torch/utils/cpp_extension.py的_find_cuda_home()决定。
- 执行的查找顺序由动态库的搜索路径决定
一、编译时的查找顺序
1、顺序总览
- (1)环境变量CUDA_HOME 或 CUDA_PATH
- (2)/usr/local/cuda
- (3)which nvcc的上级上级目录(which nvcc 会在环境变量PATH中找)
- (4)如果上述都不存在,则torch.utils.cpp_extension.CUDA_HOME为None,会使用conda安装的cudatoolkit,其路径为cudart 库文件目录的上级目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的)。
2、验证过程
验证过程可参考我的之前的文章一文讲清楚CUDA、CUDA toolkit、CUDNN、NVCC关系
3、编译pytorch时的使用过cuda版本
python -c "import torch;print(torch.version.cuda )"
pytorch可能不是在你的电脑上编译的,这个版本代表pytorch在编译时,使用过的cuda版本。
这时候,我们只在本地有相应版本的cuda动态链接库,就可以使用别人已经编译好的pytorch,非常方便。
4、当编译一个新程序,会使用的cuda版本
python -c "import torch.utils.cpp_extension; print(torch.utils.cpp_extension.CUDA_HOME)"
在很多时候,(比如安装apex,precious roipooling),我们需要使用cuda重新编译,这时候,我们需要的不仅仅是一个阉割版的cuda动态链接库,我们需要一个完整的cuda,以上的CUDA_HOME就是完整cuda的路径。
二、执行的查找顺序
1、执行的查找顺序由动态库的搜索路径决定,搜索so文件的顺序如下
- (1)gcc编译时指定的运行时库路径,如-rpath
- (2)LD_LIBRARY_PATH
- (3)/etc/ld.so.cache
- (4)/lib,/usr/lib等
2、conda的查找顺序
envname=my_env_pytorch17
objdump -x ~/miniconda3/envs/$envname/bin/python | grep RPATH
# out:
# RPATH $ORIGIN/../lib
可以看到,conda是通过(1)rpath的方式实现的,先去查找lib
ls ~/miniconda3/envs/$envname/lib/ | grep libcudart.so
# out:
# libcudart.so.10.2.89
可以看到,lib中包含一个libcudart.so.10.2.89,这就是安装的cudatoolkit,是10.2版本的。