CUDA、Conda、PyTorch三者联系

系统CUDA与conda安装的cudatoolkit关系

PyTorch安装时,使用conda会安装对应版本的cudatoolkit与cudnn,而系统中也安装了cuda与cudnn,系统中的cuda是conda安装的cudatoolkit的超集
使用以下代码来查看cuda版本与路径

import os
import torch
from torch.utils import cpp_extension
# 查看CUDA安装路径
print(cpp_extension.CUDA_HOME)
print(cpp_extension.CUDNN_HOME)
# 当前cuda是否可用
print(torch.cuda.is_available())
# torch的cuda版本,该版本为cuda编译时的版本,不会改变,与运行时的版本不一致
print(torch.version.cuda)
# cudnn版本
print(torch.backends.cudnn.version())

CUDA_HOME获取顺序

  • 先取默认 cuda 安装目录 /usr/local/cuda
  • 如默认目录不存在(例如安装原生 cuda 到其他自定义位置),那么搜索 nvcc 所在的目录
  • 如果 nvcc 不存在,那么直接寻找 cudart 库文件目录(此时可能是通过 conda 安装的 cudatoolkit,一般直接用 conda install cudatoolkit,就是在这里搜索到 cuda 库的),库文件目录的上级目录就作为 CUDA_HOME
  • 如果最终未能得到 CUDA_HOME,返回为None

PyTorch调用顺序

CUDA_HOME返回为空不代表cuda不可用,PyTorch在安装时会安装对应版本的cuda与cudnn,下面通过实验查看PyTorch在运行时调用的cuda顺序
CUDA_HOME通常为cuda的安装目录/usr/local/cuda,该路径为系统内不同版本的cuda的软链接,通过链接到不同的cuda版本可以使用对应版本的cuda

# 通过软链接使用不同版本的cuda

# 将cuda10.1链接到/usr/local/cuda
ln -s /usr/local/cuda-10.1 /usr/local/cuda
# 将cuda11.1链接到/usr/local/cuda
ln -s /usr/local/cuda-11.1 /usr/local/cuda
# 删除/usr/local/cuda,取消链接(不要使用rm -rf /usr/local/cuda/,会把文件夹内容一起删除)
rm /usr/local/cuda

使用以下命令可以看到torch在运行时的版本情况,通过实验,更改系统cuda版本或者取消系统cuda,会对CUDA_HOME和NVCC版本造成影响,但是PyTorch在运行时始终会优先调用conda安装的cudatoolkit,而不是调用系统内的cuda,即使系统找不到cuda,torch也可以使用cuda来进行训练

# torch配置
print(torch.__config__.show())

取消/usr/local/cuda的链接,torch.__config__.show()输出PyTorch运行时配置,可以看到CUDA_HOME为None,但PyTorch依然可以使用cuda训练与测试,说明

sys.platform: linux
Python: 3.6.13 |Anaconda, Inc.| (default, Jun  4 2021, 14:25:59) [GCC 7.5.0]
CUDA available: True
CUDA_HOME: None
GPU 0: NVIDIA A100-SXM4-80GB
GCC: gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
PyTorch: 1.8.0
PyTorch compiling details: PyTorch built with:
  - GCC 7.3
  - C++ Version: 201402
  - Intel(R) Math Kernel Library Version 2020.0.2 Product Build 20200624 for Intel(R) 64 architecture applications
  - Intel(R) MKL-DNN v1.7.0 (Git Hash 7aed236906b1f7a05c0917e5257a1af05e9ff683)
  - OpenMP 201511 (a.k.a. OpenMP 4.5)
  - NNPACK is enabled
  - CPU capability usage: AVX2
  - CUDA Runtime 11.1
  - NVCC architecture flags: -gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_60,code=sm_60;-gencode;arch=compute_61,code=sm_61;-gencode;arch=compute_70,code=sm_70;-gencode;arch=compute_75,code=sm_75;-gencode;arch=compute_80,code=sm_80;-gencode;arch=compute_86,code=sm_86;-gencode;arch=compute_37,code=compute_37
  - CuDNN 8.0.5
  - Magma 2.5.2
  - Build settings: BLAS_INFO=mkl, BUILD_TYPE=Release, CUDA_VERSION=11.1, CUDNN_VERSION=8.0.5, CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/c++, CXX_FLAGS= -Wno-deprecated -fvisibility-inlines-hidden -DUSE_PTHREADPOOL -fopenmp -DNDEBUG -DUSE_KINETO -DUSE_FBGEMM -DUSE_QNNPACK -DUSE_PYTORCH_QNNPACK -DUSE_XNNPACK -O2 -fPIC -Wno-narrowing -Wall -Wextra -Werror=return-type -Wno-missing-field-initializers -Wno-type-limits -Wno-array-bounds -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wno-unused-function -Wno-unused-result -Wno-unused-local-typedefs -Wno-strict-overflow -Wno-strict-aliasing -Wno-error=deprecated-declarations -Wno-stringop-overflow -Wno-psabi -Wno-error=pedantic -Wno-error=redundant-decls -Wno-error=old-style-cast -fdiagnostics-color=always -faligned-new -Wno-unused-but-set-variable -Wno-maybe-uninitialized -fno-math-errno -fno-trapping-math -Werror=format -Wno-stringop-overflow, LAPACK_INFO=mkl, PERF_WITH_AVX=1, PERF_WITH_AVX2=1, PERF_WITH_AVX512=1, TORCH_VERSION=1.8.0, USE_CUDA=ON, USE_CUDNN=ON, USE_EXCEPTION_PTR=1, USE_GFLAGS=OFF, USE_GLOG=OFF, USE_MKL=ON, USE_MKLDNN=ON, USE_MPI=OFF, USE_NCCL=ON, USE_NNPACK=ON, USE_OPENMP=ON, 

参考链接

为什么电脑装了pytorch没有安装cuda,还是能够使用gpu? - AIChiNiurou的回答 - 知乎
https://www.zhihu.com/question/378419173/answer/1153666140
conda安装的cudatoolkit, cudnn与在主机上安装的cuda, cudnn有何关系? - tsuka okami的回答 - 知乎 https://www.zhihu.com/question/344950161/answer/819075473
Pytorch 使用不同版本的 cuda - yhjoker - 博客园
Linux 硬链接与软链接
https://mmdetection.readthedocs.io/zh_CN/v2.18.1/faq.html

你可能感兴趣的:(pytorch,conda,python)