news 2026/9/18 18:54:45

PyTorch安装避坑指南:驱动、CUDA、conda/pip与GPU验证

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PyTorch安装避坑指南:驱动、CUDA、conda/pip与GPU验证

1. 显卡驱动、CUDA 和 PyTorch 之间的三层关系

装 PyTorch 这件事,绝大多数人第一次都会栽在同一个地方:看到官网那行conda install pytorch pytorch-cuda=12.1就复制粘贴,结果跑起来发现torch.cuda.is_available()返回False。问题往往不在 PyTorch 本身,而在于没搞清驱动、CUDA、框架这三者到底谁管谁。

打个比方,NVIDIA 驱动就像家里的插座电压,CUDA Toolkit 像一整套电工工具箱,而 pip/conda 装下来的 PyTorch 则是一台自带电池的电器。插座电压够高,电器就能直接用;那个工具箱摆在那儿,其实大多数时候根本用不上。

1.1 nvidia-smi 显示的那个 CUDA 版本是什么

执行下面这条命令,右上角会出现一行CUDA Version: 12.4

nvidia-smi

很多人误以为这是"本机已安装 CUDA 12.4",其实它表示的是当前驱动所能支持的最高 CUDA Runtime 版本。也就是说,你能跑 CUDA 12.4 及以下编译的任何程序,但驱动本身并不包含完整 CUDA Toolkit。想确认本机到底装没装 Toolkit,得看编译器:

nvcc --version

如果这条命令报command not found,说明你没装 Toolkit。这时候别急着去 NVIDIA 官网下一个 3GB 的安装包,因为通过 pip 或 conda 安装的 PyTorch wheel 里已经打包了运行所需的 CUDA Runtime 和 cuDNN 动态库,你只需要驱动版本够新就行。真正需要本地 Toolkit 的场景,是自己写 CUDA 算子、编译自定义扩展(比如某些检测库的 NMS 算子)或者用 nvcc 编译东西的时候。日常跑训练和推理,装 Toolkit 属于额外的负担。

1.2 驱动版本和可用的 CUDA 上限对照

驱动版本决定了你能装哪个 CUDA 版本的 PyTorch。下面这张表是 Linux 下的近似对应关系(Windows 的驱动号段略有差异),实际以官方 release notes 为准:

驱动版本区间支持的 CUDA Runtime 上限
450.80.02 及以上11.0
470 及以上11.4
515 及以上11.7
520 及以上11.8
525 及以上12.0
535 及以上12.2
550 及以上12.4
560 及以上12.6
570 及以上12.8

查驱动的办法,Linux 下可以直接读文件:

cat /proc/driver/nvidia/version

Windows 下最省事的就是看 NVIDIA 控制面板里的"系统信息",或者直接跑nvidia-smi,第一行括号里就是驱动号。比如显示Driver Version: 546.33,那对应 CUDA 12.3,往前兼容 12.x 和 11.x 的 PyTorch 都没问题。

注意:驱动是向下兼容 CUDA Runtime 的。你完全可以在驱动力支持 12.4 的机器上装 CUDA 11.8 版本的 PyTorch,反向则不行。装机时选一个比驱动上限低一到两个小版本的 CUDA,往往比顶格选更省心。

1.3 没有 N 卡的时候该怎么选

不是所有场景都需要 GPU 版本。手里只有核显、用 Apple Silicon 的 Mac、或者干脆是办公笔记本,装 CPU 版本一样能把张量基础、自动求导、网络搭建这些内容跑通。CPU 版轮子小得多,几十兆,也不会有驱动和 CUDA 的各种纠葛。

Mac 用户还有一条路:M 系列芯片可以使用 MPS 后端。安装方式就是普通的 pip 安装,然后代码里把设备指定为mps

import torch device = "mps" if torch.backends.mps.is_available() else "cpu" x = torch.randn(3, 3, device=device)

AMD 显卡在 Linux 下可以走 ROCm 版本,但支持的卡型有限,消费级里主要是部分 6000、7000 系列,Windows 基本没有官方支持。选这条路之前,先明确知道自己到底要干什么。如果是跟着教程学基础,CPU 版完全够;如果是要跑实际的训练任务,那必须有一张算力在 6.0 以上、显存别太小的 N 卡。算力太老的卡(比如 Maxwell 架构)在新版 PyTorch 里已经被逐步移出支持列表了,装上去会报no kernel image is available for execution on the device

2. 环境准备阶段最容易做错的几件事

装 PyTorch 之前,先把环境基础打牢,比后面反复重装要划算得多。这一节聊三件事:用什么管理环境、Python 版本怎么定、下载源怎么配。

2.1 Miniconda 和 Anaconda 到底选哪个

Anaconda 装完动辄占三四个 G,预装了几百个包,其中九成你一辈子都用不到。Miniconda 只带 conda 和 Python,装完两三百兆,后面缺什么装什么。我个人的选择一直是 Miniconda,理由很直接:体积小、启动快、环境干净,不会出现"我明明没装过这个包,它怎么在这儿"的情况。

Windows 下装 Miniconda 有个细节值得注意:安装向导里会问是否勾选"Add to PATH"和"Register as system Python"。建议两个都不要勾,装完后用开始菜单里的 Anaconda Prompt 或者自己配的终端来操作。原因是避免和系统里已有的 Python 打架,也避免某些依赖系统 Python 的软件出问题。Linux 下就简单了,下载 sh 脚本执行,一路回车,最后conda init一下就行。

如果实在不想装 conda,Python 自带的venv也完全能用:

python -m venv .venv source .venv/bin/activate # Linux / macOS .venv\Scripts\activate # Windows

venv的缺点是只能管 Python 包,装非 Python 依赖(比如某些版本的编译工具链)就不如 conda 方便。但对于只装 PyTorch 这件事来说,两者都能胜任。

2.2 环境命名和 Python 版本的选择

创建环境时把用途和关键版本写进名字里,是能省下大量后期困惑的习惯:

conda create -n torch24-py310 python=3.10 -y conda activate torch24-py310

这样看一眼环境名就知道里面是 PyTorch 2.4 配 Python 3.10。以后机器上同时有三四个环境时,不至于每次都conda env list再一个个猜。

Python 版本方面,PyTorch 2.x 系列目前支持 3.9 到 3.12。我一般推荐 3.10 或 3.11:够新,第三方库支持齐全,又不像 3.13 那样有些包还没跟上。有一个容易被忽略的点——创建环境时就要把 Python 版本定下来,不要装好 PyTorch 之后再改 Python 版本,那基本等于把环境搞废,不如删了重建:

conda deactivate conda env remove -n torch24-py310

另外,不要把包装进 base 环境。base 里装了一堆东西以后,conda 的依赖解析会变得极慢,而且一旦某个包装崩了,整个 conda 都可能用不了。保持 base 干净,所有工作都放在独立环境里。

2.3 下载源和常见的网络报错

官方源在国内下载速度往往很慢,几百兆的包能拖上半小时。配一下国内镜像,速度能提升一个量级。pip 的配置方式:

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

conda 则在用户目录下建.condarc

channels: - defaults default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r show_channel_urls: true

这里有个坑需要提前说清楚:配置了 conda 镜像之后,安装时如果还带-c pytorch -c nvidia,conda 会优先去官方 pytorch 频道找包,速度又慢回去了。这种情况要么去掉-c参数(镜像里同步了 pytorch 频道的话)、要么明确用--override-channels指定只用镜像。我踩过几次网络超时之后,现在装 GPU 版基本都走 pip 加官方 wheel 源,见下一节。

还有一类报错是 SSL 相关的,比如SSL: CERTIFICATE_VERIFY_FAILED,通常出现在公司内网或者装了抓包工具的环境里。临时绕过的办法是加--trusted-host,长期方案是把对应的根证书装进系统的证书库,或者干脆换成不走 HTTPS 的镜像地址。

3. GPU 版本的完整安装与验证流程

这一节是核心操作。从版本匹配开始,到装完之后的验证结束,中间每一步都会说明为什么这么做。

3.1 先确定 torch、Python、CUDA 的版本组合

PyTorch 官网的选择器会生成一条命令,但你要理解这条命令里的版本是怎么定的。大致对应关系如下:

PyTorch 版本可用 CUDA 版本推荐 Python 版本
2.0.x11.7 / 11.83.8 - 3.11
2.1.x11.8 / 12.13.8 - 3.11
2.2.x11.8 / 12.13.8 - 3.12
2.3.x11.8 / 12.13.8 - 3.12
2.4.x11.8 / 12.1 / 12.43.8 - 3.12
2.5.x11.8 / 12.1 / 12.43.9 - 3.12
2.6.x11.8 / 12.4 / 12.63.9 - 3.13

选定策略是:先看驱动上限,再从表里挑一个不高于上限的 CUDA 版本,最后确定 PyTorch 版本。比如驱动是 535,对应 CUDA 12.2,那就选 CUDA 12.1 的 PyTorch,稳稳当当。

还有一个常被忽略的点:torchvision 和 torchaudio 的版本必须和 torch 对应,不能随便挑。比如 torch 2.4.0 要配 torchvision 0.19.0,差一个次版本就可能报undefined symbol之类的错误。最省事的做法是安装时三个一起写,让解析器自己去匹配。

3.2 conda 路线和 pip 路线的实际差异

conda 路线长这样:

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

它的特点是会额外安装cudatoolkitcudnn这些包到环境里,环境体积大,但依赖关系由 conda 统一管理,包之间的二进制兼容性有保障。缺点是解析慢,尤其是频道配多了以后,Solving environment能转好几分钟。

pip 路线:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

pip 装的是官方预编译 wheel,里面自带了 CUDA Runtime 和 cuDNN 的 so 文件,所以环境更"自包含"。速度通常比 conda 快不少,而且不需要本地有 Toolkit。需要注意的是--index-url会替换掉默认的 PyPI 源,如果你之前配了国内镜像,这条命令会让它失效。想加速的话,可以用镜像站提供的 pytorch wheel 镜像地址,格式类似https://mirrors.aliyun.com/pytorch-wheels/cu121,把--index-url换成它。

选哪条?我的习惯是:能用 pip 就用 pip。除非项目本身依赖 conda 生态里的某个包(比如某些科学计算库只有 conda 版本),否则 pip 装 PyTorch 更轻更快,出问题也更好定位。

3.3 装完必须做的四步验证

装完不算完,一定要验证。四行代码,缺一不可:

import torch print("torch 版本:", torch.__version__) print("编译时 CUDA 版本:", torch.version.cuda) print("CUDA 是否可用:", torch.cuda.is_available()) print("设备名:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "无 GPU")

然后跑一次真实的矩阵乘法,确认 kernel 能正常加载:

import time import torch a = torch.randn(4096, 4096, device="cuda") b = torch.randn(4096, 4096, device="cuda") # 预热,第一次执行会触发 CUDA 上下文初始化和 kernel 加载,耗时明显偏长 c = a @ b torch.cuda.synchronize() start = time.time() c = a @ b torch.cuda.synchronize() print(f"4096 方阵乘法耗时: {time.time() - start:.3f} 秒")

第一次运算慢是正常的,CUDA 上下文初始化、kernel 加载、显存分配都要时间,做基准测试前必须预热。如果这段代码能稳定跑完,说明环境真的通了。

3.4is_available()返回 False 的排查链路

这是遇到最多的问题。按下面的顺序查,基本能覆盖九成情况。

现象可能原因处理方式
nvidia-smi正常但is_available()为 False装成了 CPU 版 wheeltorch.version.cuda,如果是None就是 CPU 版,重装对应 CUDA 版本
libcudart.so.12: cannot open shared object filetorch 的 CUDA 版本与系统 CUDA 冲突检查LD_LIBRARY_PATH是否指到了别的 CUDA Toolkit,临时清空再试
no kernel image is available显卡算力不在当前 torch 的支持范围内换更匹配的 torch 版本,或换卡
conda list里有cpuonlyconda 安装时被 cpuonly 元包锁定conda remove cpuonly后重装 GPU 版
显存不足CUDA out of memory显存被其他进程占用nvidia-smi看占用进程,必要时torch.cuda.empty_cache()

还有一个隐蔽的情况:装完之后pip list里同时存在torchtorch-cpu之类的包,两个版本的动态库互相干扰。这种多半是之前装过 CPU 版没卸干净,pip uninstall torch torchvision torchaudio逐个清掉再重装。

4. 编辑器怎么正确挂到 conda 环境上

环境装好了,代码编辑器却用不上这个环境,是另一类高频问题。这一节分别说 PyCharm、VSCode 和远程开发三种场景。

4.1 PyCharm 绑定 conda 解释器的具体路径

打开Settings → Project → Python Interpreter → Add Interpreter → Conda Environment。选"使用已存在的环境"时,需要指定 conda 可执行文件的位置,以及环境路径。

Windows 上 conda 可执行文件通常在:

C:\Users\<用户名>\miniconda3\Scripts\conda.exe

环境路径则是C:\Users\<用户名>\miniconda3\envs\torch24-py310。Linux 下是~/miniconda3/bin/conda~/miniconda3/envs/torch24-py310/bin/python

有个坑要特别注意:用 PyCharm 的"新建环境"功能时,它会用conda create -p <项目路径>的方式创建,这种带路径创建的环境不会出现在conda env list里,只挂在这个项目上。项目一删,环境就成了孤儿包占着磁盘。我现在的做法是一律先在终端里conda create -n建好,再让 PyCharm 去选已有环境。

另外,如果 PyCharm 里选不中 conda 环境、或者报权限错误,多半是终端激活策略的问题。可以在 PyCharm 设置里把终端 Shell 改成cmd.exe而不是 PowerShell,PowerShell 的执行策略有时候会挡住 conda 的激活脚本。

4.2 VSCode 里选解释器和注册 Jupyter 内核

VSCode 侧的流程简单:Ctrl+Shift+P调出命令面板,输入Python: Select Interpreter,在列表里找到带环境名的那个路径。如果找不到,说明 VSCode 没识别到 conda,可以在设置里手动加:

{ "python.condaPath": "C:\\Users\\<用户名>\\miniconda3\\Scripts\\conda.exe" }

想在 VSCode 的 Jupyter 里用这个环境,光选解释器还不够,得把环境注册成内核:

conda activate torch24-py310 pip install ipykernel python -m ipykernel install --user --name torch24-py310 --display-name "Python (torch24-py310)"

--display-name是你在 Notebook 右上角内核列表里看到的名字,建议写清楚一点,别用默认的python3,不然环境一多就分不清谁是谁。反过来,想删掉某个注册过的内核:

jupyter kernelspec list jupyter kernelspec remove torch24-py310

还有一个细节:VSCode 的 Python 扩展在 Windows 上偶尔找不到 conda 环境,尤其是从普通 cmd 启动 VSCode 的时候。解决办法是先conda activate目标环境,再从同一个终端里执行code .启动 VSCode,这样它会继承当前的环境变量。

4.3 服务器和容器里的开发习惯

在远程服务器上装环境,有两条经验值得记住。

第一条:先起 tmux 再干活。SSH 断线导致 pip 装到一半中断,环境就处于半残状态,比装不上更麻烦。tmux new -s setup之后再执行安装,断线重连tmux attach -t setup接着看。

第二条:服务器上不要动 base 环境。多人共用的机器上,base 环境往往是运维配的,动它可能影响到别人的任务,也不要往里面pip install --user,那会污染所有人。

容器场景下,GPU 直通要注意启动参数:

docker run --gpus all -it --rm pytorch/pytorch:2.4.0-cuda12.1-cudnn9-runtime bash

宿主机的驱动版本要满足容器内 CUDA 的要求,同时宿主机需要装好容器运行时对 GPU 的支持组件。官方镜像已经装好了 PyTorch,适合快速验证;如果要自己装,选-devel后缀的镜像,里面有编译工具链。

5. 装完之后绕不开的维护问题

环境搭好了不是终点。用一段时间之后,磁盘爆了、依赖冲突了、换机器要重装,这些都会遇到。提前知道怎么处理,能省下很多重来的时间。

5.1 pip 和 conda 混用造成的依赖错乱

在一个环境里既用 conda 装又用 pip 装,是混乱的主要来源。原因在于:conda 完全看不到 pip 装了哪些包,它维护的是一份自己的依赖图。当 conda 想升级某个包时,它不知道自己动的这个包被 pip 装的另一堆东西依赖着,结果就是一升级就崩。

我的原则是:一个环境里尽量只用一种包管理器,且顺序固定为先 conda、后 pip。也就是说,能用 conda 解决的包先用 conda 装完,剩下 conda 里没有的、或者版本太旧的,再用 pip 补。装完之后如果想记录环境状态,两个都导出:

conda env export --no-builds > env.yml pip freeze > requirements-pip.txt

--no-builds是关键参数。不加的话,导出的 yml 里会带上每个包的 build 字符串(比如py310h6a678d5_0),这些字符串跟平台强绑定,换一台机器基本装不上。

5.2 磁盘占用和缓存清理

PyTorch 相关的东西占磁盘特别快,主要有三块:pip 缓存、conda 包缓存、模型缓存目录。

pip 缓存的清理:

pip cache dir # 查看位置 pip cache purge # 清空

conda 的:

conda clean -a -y

这个命令会清掉未使用的包和索引缓存,动辄能回收几个 G。不过要清楚一点,清掉之后下次装同样的包还得重新下载。

模型和数据的缓存目录默认都在用户主目录下,Windows 上就是 C 盘,跑几个预训练模型下载,几十 G 就没了。可以通过环境变量挪到大盘上:

export HF_HOME=/data/cache/huggingface export TORCH_HOME=/data/cache/torch export TORCH_HOME=/data/cache/torch

Windows 上在系统环境变量里加,Linux 上写进.bashrc。这个改动越早做越好,等 C 盘红了再迁,得先搞清楚哪些文件能删哪些不能。

5.3 环境复现和换机迁移

把自己调好的环境搬到另一台机器上,直接复制 env.yml 往往会失败,因为里面可能包含 pip 装的包、平台专属的依赖。我一般用两步走:先看 conda 部分:

conda env create -f env.yml

如果报冲突,就退而求其次,只新建一个干净的 Python 环境,然后按 requirements 装:

conda create -n torch24-py310 python=3.10 -y conda activate torch24-py310 pip install -r requirements-pip.txt

还有一个更彻底的办法:用 Dockerfile 把整个环境固化下来。这对需要长期维护、多人协作的项目特别值得,一次写好,处处一致。

FROM nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04 RUN apt-get update && apt-get install -y python3.10 python3-pip && rm -rf /var/lib/apt/lists/* RUN pip3 install --no-cache-dir torch torchvision torchaudio \ --index-url https://download.pytorch.org/whl/cu121

写 Dockerfile 的时候,把pip install放在文件靠后的位置,这样改代码时不用重装依赖,构建缓存能复用,迭代速度快很多。

我个人在这些年的反复折腾里,最深的体会其实就一句:装之前先花五分钟确认驱动版本和要用的 CUDA 版本,比装完之后花两小时排查要划算得多。遇到过太多次"先装了再说",最后都是删环境重来。另外,每次装完顺手把nvidia-smi和那四行验证的输出截图存一份,以后出问题时有个对照,能快速判断是环境变了还是代码变了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 18:48:27

PyMC 贝叶斯分位数回归:3 步让安全库存不再只靠均值

PyMC 贝叶斯分位数回归&#xff1a;3 步让安全库存不再只靠均值 【免费下载链接】pymc Bayesian Modeling and Probabilistic Programming in Python 项目地址: https://gitcode.com/GitHub_Trending/py/pymc 备多少货才不缺货&#xff1f;均值预测永远答不准&#xff1…

作者头像 李华
网站建设 2026/9/18 18:45:51

速度、路程与时间:从求导到积分的微积分实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:44:40

编译原理核心考点全梳理:从词法分析到代码生成复习指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:43:52

Win10开机慢?从快速启动到启动项清理的系统优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/18 18:41:43

用 garak LLM 漏洞扫描器检测你的模型会不会被越狱

用 garak LLM 漏洞扫描器检测你的模型会不会被越狱 【免费下载链接】garak the LLM vulnerability scanner 项目地址: https://gitcode.com/GitHub_Trending/ga/garak 你的客服 AI 突然把内部系统提示词原样吐给了用户&#xff0c;这就是提示注入越狱现场。garak 是一个…

作者头像 李华