拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

conda虚拟环境配置CUDA、cuDNN与PyTorch深度学习环境全指南

conda虚拟环境配置CUDA、cuDNN与PyTorch深度学习环境全指南

说实话,在conda虚拟环境里配置cuda、cudnn和pytorch这套深度学习环境,我已经被同一块石头绊倒过无数次了。每次帮别人排查环境问题,十有八九都是卡在版本对不上、装错位置、或者压根没搞清楚cuda和pytorch之间的对应关系上。这东西真不是靠死记硬背命令就能配好的,你得先明白它们之间是怎么协同工作的,再动手就不会慌。

这篇文章就是写给准备从零配置深度学习环境的新手,也适合被各种报错搞到心态爆炸的老哥。我会把这套流程拆开揉碎,讲清为什么这么做,再把每一步命令和验证方法都给你安排上。按照这个流程走,在conda虚拟环境里装好cuda、cudnn和pytorch,基本一次能过。

1. 为什么非要用conda虚拟环境来装深度学习环境

先说你可能会遇到的场景:你打开一个开源项目,它的依赖是pytorch 1.13 + cuda 11.7,另一个项目要pytorch 2.1 + cuda 12.1。如果你全装进系统环境,这两个项目大概率会互相打架——不是torch版本冲突,就是numpy、protobuf这些底层库被另一个项目覆盖,最后只能靠不停重装环境来续命。

1.1 系统环境里直接装库的三大痛点

第一个痛点是依赖冲突。深度学习生态里的库之间依赖关系极其脆弱,torch版本升级可能导致numpy API不兼容,tensorflow和pytorch共存时protobuf版本经常互踩。第二个痛点是权限问题。直接在系统Python里pip install,往往需要sudo权限,装完系统Python目录里一片混乱,想卸载又怕误删别的包。第三个痛点是环境隔离缺失。你没法按项目精确锁定版本,今天调通的项目,明天装个新库可能就崩了。

1.2 conda虚拟环境到底是怎么“隔离”的

conda虚拟环境本质上就是在你硬盘上创建一个独立的目录,里面装着属于这个环境的一套Python解释器、库文件和可执行程序。当你执行conda activate时,conda只是修改了当前终端的PATH环境变量,把环境目录的bin文件夹放到最前面。这样你在终端敲python、pip时,系统优先找的就是这个环境目录里的版本,而不是全局的那个。

这个机制的关键优势在于:环境之间完全独立,删掉某个环境只需要删掉对应目录,不碰其他任何东西。相比Python自带的virtualenv,conda还能管理Python解释器本身,甚至可以指定任意Python版本。比如conda create -n pytorch python=3.9会自动下载一个3.9的Python解释器到环境目录里,完全不依赖系统自带的Python版本。

1.3 conda对cuda/cudnn这类底层库的特殊意义

这一点很多人没意识到:conda不仅能管理Python包,还能管理非Python的底层二进制库。cudatoolkit和cudnn在conda里就是以库文件形式出现的,它们会被安装到环境的lib/目录里。这意味着你可以在不同conda环境里各装一套不同版本的cuda库,这个环境用cuda 11.7,那个环境用cuda 12.1,互不干扰。

这在传统做法里是不可思议的。以前你要在系统层面装cuda,装完就全局生效,想切换版本得改一堆PATH和软链接。conda把这一切变成了环境内的文件依赖,这也是为什么它能大幅降低深度学习的入门门槛。

2. 动手前先看清三件事:显卡、驱动和conda本身的准备

2.1 先用nvidia-smi确认显卡驱动状态

在开始配环境之前,第一件事是确认你的NVIDIA显卡驱动正常。终端敲这一行命令:

nvidia-smi

输出内容里你会看到两块关键信息:右上角的Driver Version是驱动版本,右上角CUDA Version是当前驱动支持的最高CUDA版本。注意,这个CUDA Version不是说你已经装好了cuda,它只表示驱动能支持到哪个版本。

比如显示CUDA Version: 12.4,说明你的驱动可以搭配任何≤12.4的cuda版本使用。如果你的PyTorch要求cuda 11.8,那完全没问题。如果你的驱动版本太老,顶多支持到cuda 11.0,那就得先更新驱动,否则后面可能识别不到GPU。

2.2 驱动CUDA和运行时CUDA的区别(新手最容易搞混的点)

这是新手最常踩的坑。nvidia-smi显示的CUDA Version是驱动层面的最大支持版本,而实际你编译、运行程序时用的是运行时CUDA,也就是你安装的CUDA Toolkit(或者在conda里装的cudatoolkit)。

举个例子:你的驱动显示CUDA Version: 12.4,但你在conda环境里装的PyTorch对应的是cuda 11.8,这时nvidia-smi照样显示12.4,你的PyTorch也能正常用。驱动是向下兼容的,cuda 11.8的运行时在12.4的驱动上没问题。

所以别被nvidia-smi的显示迷惑了。判断你这个环境到底用的哪个cuda版本,要在conda环境里看nvcc --version或者python -c "import torch; print(torch.version.cuda)",这些反映的才是实际运行时版本。

2.3 安装Miniconda与换源

如果你还没装conda,我建议装Miniconda而不是Anaconda。Anaconda预装了一堆你用不到的包,体积巨大,启动还慢。Miniconda只带conda本身和Python,其他包你按需自己装。

安装流程很简单,去官网下载对应系统的安装脚本,或者用命令行下载。装完以后有一步很重要:换源。不换源的话,conda和pip下载包的速度会让人崩溃。所谓换源,就是把包下载地址从官方服务器换成国内镜像服务器,这样可以显著提升下载速度。

conda换源是在用户目录下创建或修改~/.condarc文件:

channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

保存后执行conda clean -i清除索引缓存,再conda create -n test python=3.9试试看速度。

pip也要设置镜像,通常执行这两条命令即可:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

设置好之后,后续所有安装过程都会顺畅很多。

3. 创建conda虚拟环境并选对PyTorch安装命令

3.1 创建虚拟环境并确定Python版本

假设我们要建一个名为dl的深度学习环境,Python版本先选3.9。为什么不用最新的3.12?因为pytorch等深度学习库对最新Python版本的支持往往滞后几个月,很多第三方扩展库甚至在新版本Python上直接无法编译。3.9或者3.10是目前兼容性最稳的选择。

conda create -n dl python=3.9 -y conda activate dl

激活成功后你会在终端看到(dl)前缀,这就是进入虚拟环境的标志。之后所有操作都在这个环境里,不会污染其他环境。

在Pycharm里面使用该环境时,需要在解释器设置里找到对应conda环境的Python路径。一般点开Pycharm的设置 -> Project -> Python Interpreter,选择Conda Environment,然后在Conda executable处填Miniconda安装目录下的conda命令路径,它会自动识别已存在的环境供你选择。

3.2 看懂PyTorch官网的安装选择器

进入PyTorch官网首页,往下拉就能看到Install PyTorch的选项区。你需要选择你的系统、包管理器(pip还是conda)、以及CUDA版本。官网会给你生成对应的安装命令,比如:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

这里的cu118代表CUDA 11.8对应的PyTorch预编译版本。同理cu121代表CUDA 12.1。你要做的事很简单:先看你的显卡驱动最高支持到什么CUDA版本(用nvidia-smi查看),然后选择不超过这个版本的那个cu版本。

注意,现在官方主推pip安装方式,因为PyTorch官方优先发布pip包,conda渠道的包可能会有延迟,而且版本更新慢。但这不是说你不能从conda装。后面我会讲这两种方式的关键区别。

3.3 conda装和pip装PyTorch,到底有什么区别

这里需要重点讲清楚,因为选错了方向,你可能在后面浪费大量时间。

用pip安装PyTorch时,装的是官方预编译好的wheel包,里面只包含torch、torchvision、torchaudio这三个Python库。它不包含cuda运行时库和cudnn。所以用pip方式前,你需要确认系统里或conda环境里有对应的cuda和cudnn库,否则虽然能import torch,但torch.cuda.is_available()会返回False,等于装了个CPU版。

而用conda安装PyTorch时,例如:

conda install pytorch torchvision torchaudio cudatoolkit=11.8 -c pytorch

conda会自动把cudatoolkit和cudnn作为依赖一起装进当前环境里。你不需要手动去NVIDIA官网下载任何东西。这对于新手来说是最省事的方式。

我的建议是:如果你不想折腾,直接用conda方式安装。如果你想要最新的PyTorch版本,或者需要特定cu版本,就用pip方式,同时另装一个cudatoolkit来满足依赖。

4. CUDA和cuDNN到底要不要单独装

4.1 大部分PyTorch场景不需要单独装

有一种流传很广的说法:装PyTorch前必须去NVIDIA官网装好CUDA Toolkit和cuDNN。这个说法在很大一部分场景下是过时的。

如果你只是用PyTorch训练模型、推理,不搞源码级扩展,那通过conda安装时自动带上的cudatoolkit和cudnn完全够用。PyTorch项目底层是自己编译过的CUDA代码片段,它只依赖libcudart和libcudnn这两个运行时库,并不依赖完整的CUDA Toolkit开发套件。只要相关库文件存在,它就能正常工作。

4.2 必须单独装完整版CUDA的场景

但有一类场景必须在系统层面安装完整版CUDA Toolkit:你需要编译CUDA扩展代码。比如你在搞自定义的C++/CUDA算子,或者编译一些需要nvcc编译器的第三方库。

我之前就栽过一次:跑一个光流估计的项目,仓库要求必须本地编译一个CUDA extension,结果编译时报错找不到nvcc。一查才发现我只有conda环境里的运行时cudatoolkit,并没有开发版的CUDA Toolkit,里面不包含编译器。这种情况就只能去NVIDIA官网下载对应版本的CUDA Toolkit安装了。

另外,如果你的工作流涉及TensorFlow、JAX等同样依赖CUDA的框架,或者需要多个CUDA版本共存测试,那单独安装较为合理。

4.3 单独安装cuda和cudnn的标准流程(如果你需要)

先说多版本共存怎么处理。NVIDIA官网下载的CUDA Toolkit安装包默认安装到/usr/local/cuda-11.8这种带版本号的目录,然后软链接/usr/local/cuda指向其中一个。这样你想切换版本时,只要改下环境变量即可。

举个例子,先用nvcc --version查看当前cuda版本,如果是11.8,但你还需要12.1,就再装一个到不同目录,然后通过修改PATH和LD_LIBRARY_PATH来切换。

安装比较常用的方式是采用.run文件安装:

wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run sudo sh cuda_11.8.0_520.61.05_linux.run

安装过程中有一步会问你是否要安装驱动,这里务必取消,只保留CUDA Toolkit部分,避免把现有驱动搞挂。

装完之后设置环境变量,在你自己的~/.bashrc里追加:

export PATH=/usr/local/cuda-11.8/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

cuDNN的安装也简单,先去官网下载对应cuda版本的cuDNN压缩包,解压后把内容复制到CUDA目录下即可:

tar -xzvf cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/lib/* /usr/local/cuda-11.8/lib64/ sudo cp cudnn-linux-x86_64-8.9.7.29_cuda11-archive/include/* /usr/local/cuda-11.8/include/

4.4 gzip: stdin: invalid compressed># 查看当前环境中的cuda运行时版本 nvcc --version # 如果conda环境里没有nvcc,显示的是系统cuda,这就是很多人被误导的地方 python -c "import torch; print(torch.__version__)" python -c "import torch; print(torch.version.cuda)" python -c "import torch; print(torch.backends.cudnn.version())"

这里有个技巧:到底该以哪个为准?当你用conda装了cudatoolkit,环境里会有$CONDA_PREFIX/bin/nvcc,执行which nvcc看看结果路径在哪里。如果指向/usr/local/cuda/bin/nvcc而不是conda环境目录,说明你当前用的不是conda环境里的cuda编译器。但实际上PyTorch运行时用的库是import torch; print(torch.version.cuda)这个值,它以PyTorch内置的库为准。

查看cuDNN版本,通常用Python方式查最准:torch.backends.cudnn.version()会返回一个数字,比如8907代表cuDNN 8.9.7。

5.3 用一段代码验证GPU真的参与计算

打开Python交互式终端,执行如下代码:

import torch print("PyTorch版本:", torch.__version__) print("CUDA是否可用:", torch.cuda.is_available()) print("GPU名称:", torch.cuda.get_device_name(0)) # 构造两个GPU上的随机张量并做矩阵乘法 a = torch.randn(1000, 1000).cuda() b = torch.randn(1000, 1000).cuda() c = torch.matmul(a, b) print("GPU矩阵乘法结果:", c.sum().item())

如果在最后一步结果正常输出了一个数字,说明数据确实在GPU上计算了。同时开另一个窗口运行nvidia-smi,会看到你的Python进程占用了显存,那就彻底放心了。

6. 新手高频报错的排查思路与处理方法

6.1 conda error: run 'conda init' before 'conda activate'

这个报错几乎每个新手都会碰到一次。根源在于你的shell会话没有加载conda的初始化配置。安装Miniconda后,安装程序会提示是否帮你执行conda init,很多人这时候手滑跳过去了。

解决方案很直接,执行一次:

conda init bash

然后重新打开一个终端。如果执行后仍然无效,检查~/.bashrc里是否有conda的初始化代码块,没有就手动在文件末尾加入:

source /path/to/miniconda3/etc/profile.d/conda.sh

注意把/path/to/miniconda3替换成你的实际安装路径。

另外提醒一下,如果你用的是zsh而不是bash,执行conda init zsh即可,原理相同。

6.2 装完PyTorch后发现还是CPU版本

这个坑的典型表现是:torch.cuda.is_available()返回False,但nvidia-smi明明能看到显卡。原因通常有两个。

第一个是你pip安装的包是cpu版本。打开pip安装记录看看操作说明:如果安装命令里带cpu字样的索引源,装的就是CPU版。解决方式很简单,卸载重装,去PyTorch官网复制正确版本的命令,确保索引url里的cu开头且带数字。

第二个是conda环境里自带的cuda库和torch里的cuda库版本不匹配。常见于你混用了pip和conda安装方式。举例来说,用pip装了cu118的torch,然后又用conda装了个cudatoolkit=12.1,导致torch加载时找不到兼容的cuda库。解决方式是把环境里所有torch相关的包卸载干净,统一用同一个源重新安装。

6.3 想卸载重装但环境已经烂了,怎么办

环境有时候会越改越烂,依赖关系一团乱麻。如果实在查不出问题,最干净利落的办法是直接删除环境重建,耗时不多,还能彻底甩掉包袱。

conda deactivate conda remove -n dl --all conda create -n dl python=3.9 -y

然后重新按照第3章流程安装即可。这个操作我不建议在一开始就做,但当你试了各种修复都没用的时候,它是性价比最高的方案。

6.4 环境导出与迁移:下次重装不用再手动踩坑

环境配置好后,把依赖清单导出来存着是个好习惯。这能让你在换机器或环境崩了之后快速恢复:

conda env export > dl_env.yaml

以后恢复环境时执行:

conda env create -f dl_env.yaml

如果你不换机器,只换了目录或者想用uv这类新工具管理Python环境,也可以先把pip freeze导出的requirements.txt留一份,里面记录了所有pip包的精确版本号:

pip freeze > requirements.txt pip install -r requirements.txt

我从第一次配置深度学习环境到现在,被各种版本不匹配的问题反复折磨过。后来养成了一个习惯:每次配置环境时先想清楚“我最终要跑什么项目,这个项目的PyTorch版本要求是什么,我的显卡驱动支持哪个CUDA版本”,然后再动手。这个过程梳理清楚之后,配置环境就不再是一团乱麻,而是有章可循的流水线操作。

最后分享一个小技巧:不要把conda的默认环境(base)拿来装深度学习库。哪怕只在base里装了一个torch,将来你创建其他环境时,base环境的依赖变动很容易引发各种莫名问题。始终坚持“每个项目建独立conda环境”这个原则,你会少踩一大堆坑。

返回列表