conda虚拟环境中安装CUDA的详细教程
conda虚拟环境中安装CUDA的详细教程
在深度学习开发中,正确配置CUDA环境是至关重要的一步。本文将详细介绍如何在conda虚拟环境中安装CUDA,解决安装过程中可能遇到的头文件缺失问题,并提供PyTorch运行时的CUDA版本检查方法。此外,文章还涵盖了其他相关问题的解决方案,如包冲突检查和nvcc与nvidia-smi版本不一致的处理方法。
前言
CUDA 11.8、CUDA 12.5指的就是CUDA Toolkit的版本。本篇文章写于安装mamba、causal-conv1d时遇到的问题。mamba要求CUDA>=11.6,而服务器是CUDA 11.3,又没有root权限。
用conda安装的cuda是精简版的,而精简版的cuda没有办法编译,会缺少头文件(这正是「cuda.h和cuda_runtime.h」部分提到的缺少的头文件)。而NVIDIA原版的CUDA Toolkit是完整版的CUDA,可以进行编译,且不缺少头文件。
而mamba之所以效率高是因为mamba使用cuda进行重新编译(并不是纯pytorch实现),而精简版的cuda没有办法编译,于是在conda虚拟环境中安装了cuda后运行项目会一直报编译错误(g++版本错误、缺少头文件等等错误)。【好消息: Mamba2已经出了,源码依旧在Mamba的库中。Mamba2提出的SSD不需要cuda编译了,并行化纯pytorch实现】
安装mamba、causal-conv1d;不使用root权限,在服务器上安装NVIDIA原版的CUDA Tookkit方法见视频:【Mamba安装】99%的人都出错!带你手把手解决selective_scan_cuda冲突问题。对应文档Mamba安装-基于mamba源码进行cuda编译。
如果是其他项目基于纯pytorch实现,不需要使用CUDA进行编译,那么可以在conda的虚拟环境中使用conda安装对应版本的CUDA。
conda虚拟环境中安装cuda
参考文章:使用conda管理CUDA。
在跑深度学习项目时,很多时候CUDA版本没达到要求,重新安装 CUDA 太麻烦,更何况一般都没有 root 权限。因此,需要调用 conda 自己安装的 CUDA 版本。
- 创建 conda 环境,并激活
# 创建虚拟环境环境
conda create -n 自己输入名称 python=版本号
# 激活虚拟环境
conda activate 名称
- 安装指定 CUDA 版本,例如 11.8:
conda install cudatoolkit==11.8 -c nvidia
- 安装支持 CUDA 的 PyTorch(需要去PyTorch官网找到对应版本),例如 2.4.1:
conda install pytorch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 pytorch-cuda=11.8 -c pytorch -c nvidia
- 安装 cuda-nvcc
conda install nvidia::cuda-nvcc
可以去https://anaconda.org/搜索所有cuda版本的nvcc。
注意:其中第 4 步是最容易遗漏的,也很少有博客提到。实测不安装 cuda-nvcc 会导致调用系统自带的 CUDA。
以上步骤完成后,conda就会将cuda添加到该虚拟环境的环境变量中,可以使用 echo $PATH 查看环境变量:
cuda.h和cuda_runtime.h
在「前言」部分提到,使用conda安装的cuda是精简版的,而精简版的cuda没有办法编译,会缺少头文件。缺少的头文件指的就是这部分提到的。而NVIDIA原版的CUDA Toolkit是完整版的CUDA,可以进行编译,且不缺少头文件。
参考文章:conda环境中安装cuda.h和cuda_runtime.h。
在conda的虚拟环境中安装cuda后,在运行项目时可能会提示缺少cuda.h和cuda_runtime.h文件:
解决方法:
在该虚拟环境中使用如下命令:
conda install nvidia::cuda-cudart-dev
# cudart是cuda runtime的缩写
亦可去https://anaconda.org/搜索cuda-cudart-dev对应于cuda的版本:
如提示还缺少 cusparse.h 和 cusparse_v2.h ,可以去https://anaconda.org/搜索libcusparse-dev对应于cuda的版本:
也可以直接下载文件:
下载下来后可以看到其中有这两个文件,复制到虚拟环境cuda路径下:
.h 文件在 conda/envs/虚拟环境名 的 include 文件夹下。
还可能会说缺少以下文件:
只要找到对应cuda版本的文件,复制到虚拟环境cuda路径下即可。
.h 文件在 conda/envs/虚拟环境名 的 include 文件夹下。
在「前言」部分提到,使用conda安装的cuda是精简版的,而精简版的cuda没有办法编译,会缺少头文件。缺少的头文件指的就是这部分提到的,上图中列出的文件是我在下载的NVIDIA原版CUDA Toolkit工具包目录下找到的(NVIDIA原版的CUDA Toolkit是完整版的CUDA,可以进行编译,且不缺少头文件。)
pytorch运行时的CUDA版本
查看cuda 运行版本 和 编译时的版本:
# Pytorch 实际使用的运行时的 cuda 目录
import torch.utils.cpp_extension
torch.utils.cpp_extension.CUDA_HOME
# 编译该 Pytorch release 版本时使用的 cuda 版本
import torch
torch.version.cuda
参考文章:一文讲清楚CUDA、CUDA toolkit、CUDNN、NVCC关系。
参考文章:python_deep_study系列。
(1)查看pytorch版本:
import torch
print(torch.__version__)
(2)查看Pytorch release 版本时使用的 cuda 版本:
import torch
print(torch.version.cuda)
(3)查看 Pytorch 实际使用的运行时的 cuda 目录,可以直接输出 cpp_extension.py 中的 CUDA_HOME 变量:
import torch
import torch.utils
import torch.utils.cpp_extension
print(torch.utils.cpp_extension.CUDA_HOME)
其他问题
检查包冲突
pip check #检查使用pip安装的包在当前环境中的兼容性
# 可以检查特定包的兼容性
pip check numpy #检查numpy在当前环境中的兼容性
nvcc -V和nvidia-smi显示的版本不一致
参考文章:【CUDA】nvcc和nvidia-smi显示的版本不一致?
nvcc 属于CUDA的编译器,将程序编译成可执行的二进制文件,nvidia-smi 全称是 NVIDIA System Management Interface ,是一种命令行实用工具,旨在帮助管理和监控NVIDIA GPU设备。
CUDA有 runtime api 和 driver api,两者都有对应的CUDA版本, nvcc -V 显示的就是前者对应的CUDA版本,而 nvidia-smi显示的是后者对应的CUDA版本。
用于支持driver api的必要文件由 GPU driver installer 安装,nvidia-smi就属于这一类API;而用于支持runtime api的必要文件是由 CUDA Toolkit installer 安装的。nvcc是与CUDA Toolkit一起安装的CUDA compiler-driver tool,它只知道它自身构建时的CUDA runtime版本,并不知道安装了什么版本的GPU driver,甚至不知道是否安装了GPU driver。
CUDA Toolkit Installer通常会集成了GPU driver Installer,如果你的CUDA均通过CUDA Tooklkit Installer来安装,那么runtime api 和 driver api的版本应该是一致的,也就是说, nvcc -V 和 nvidia-smi 显示的版本应该一样。否则,你可能使用了单独的GPU driver installer来安装GPU dirver,这样就会导致 nvidia-smi 和 nvcc -V 显示的版本不一致了。
通常,driver api的版本能向下兼容runtime api的版本,即 nvidia-smi 显示的版本大于nvcc --version 的版本通常不会出现大问题。
cuda路径
机器的cuda路径在 /usr/local 下。
conda虚拟环境的cuda路径在 conda/envs/虚拟环境名 的 lib 或 include 文件夹下。