
Windows 10 系统上配置 PyTorch GPU 环境说难不难说简单也不简单。我见过太多人卡在torch.cuda.is_available()返回 False 这一步也见过不少人在 conda 里装了半天最后发现模型一直在 CPU 上跑。这篇文章就按我平时给机器装环境的完整流程来写包括为什么这么做、命令怎么敲、出错了怎么排查。适合还没装过环境的新手也适合被各种报错折腾到崩溃的老手翻一翻。整套流程走完你的 win10 电脑就能用显卡来跑深度学习了。1. 安装前先搞明白的三件事1.1 GPU版本和CPU版本差在哪很多人第一次装 PyTorch 都很懵不都是pip install torch吗怎么还有 GPU 版和 CPU 版的区别这里说白了就是计算发生在哪里。CPU 擅长复杂的逻辑控制但做大规模矩阵乘法效率不高。深度学习训练过程中像卷积、全连接这些操作全是矩阵运算GPU 有上千个计算核心可以同时做大量并行计算。举个生活化的例子CPU 像一个博士生处理复杂问题很强但一次只能做一件事GPU 像一个千人工厂每个工人只能做简单加减法但几千个工人同时开工算矩阵乘法的速度能比 CPU 快几十倍。所以如果你只是用 PyTorch 跑跑小 demo、学习一下张量操作CPU 版也能凑合。但只要你打算训练哪怕很小的图像分类模型或者跑一跑 Hugging Face 上的预训练模型GPU 版就是刚需。我见过太多人拿 CPU 版跑了一天结果换上 GPU 版之后发现一个小时的活十几分钟就完事了。1.2 驱动、CUDA Toolkit、PyTorch到底谁管谁这是最容易搞混的地方。很多人以为要自己安装 CUDA Toolkit 和 cuDNN其实在 PyTorch 官方的 conda 安装方案里PyTorch 是自带 CUDA 运行时的不需要你单独装 CUDA Toolkit。你真正需要的是显卡驱动。整个依赖关系是这样显卡驱动负责操作系统和显卡硬件之间的通信驱动版本决定了最高支持到哪个 CUDA 版本。用nvidia-smi命令查看右上角有个 “CUDA Version”代表当前驱动最高支持的 CUDA 版本。CUDA Toolkit是完整的开发工具包包含编译器、运行时库等。对于跑 PyTorch 来说绝大多数场景不需要你手动装 Toolkit因为 PyTorch 安装包会带上自己编译好的 CUDA 运行时。PyTorch在安装时选择 CUDA 版本比如 cu118、cu121意思是这个版本的 PyTorch 是基于 CUDA 11.8 或 12.1 编译的。你的显卡驱动只要支持对应版本的 CUDA就能跑起来。一句话总结驱动是地基CUDA Toolkit 不是必须要装PyTorch 自带运行时但驱动版本不能太老不然 PyTorch 用不起来。注意驱动版本的兼容性往下兼容。比如 PyTorch 要求 CUDA 12.1你的驱动显示支持 CUDA 11.8通常也能跑因为新版驱动一般兼容更旧版本的 CUDA 运行时。但反过来驱动太老就真不行了。1.3 为什么非要用conda装 PyTorch 有很多种方式裸 Python pip 其实也能装那为什么要套一层 conda第一个理由是环境隔离。你不可能只有一个深度学习项目。这个项目可能要 Python 3.10 PyTorch 2.1另一个项目可能要 Python 3.8 TensorFlow。如果全装在系统 Python 里今天升级这个包明天就搞挂另一个项目。conda 虚拟环境相当于给每个项目安排了一个独立的小房间互不干扰。第二个理由是依赖管理。conda 不只是管 Python 包还管系统层面的依赖库比如 CUDA 运行时、MKL 这些数学库。用 conda 安装 PyTorch GPU 版的时候它会自动把匹配的 CUDA 运行时一并拉进来省去了大量手工折腾。第三个理由是 Windows 上的 Python 管理本来就混乱。直接去 python.org 下载的 Python、Windows 商店版本的 Python、Anaconda 自带 Python三个如果用混了pip 指不定装到哪去。用 conda 之后所有环境都在 conda 的管理范围内路径清晰删也删得干净。2. 环境准备系统检查与conda安装2.1 先确认显卡与驱动装之前一定要先搞清楚自己的显卡型号和驱动状态这一步能避免后面走很多弯路。在 win10 桌面左下角搜索框输入设备管理器打开后找到“显示适配器”能看到你的显卡型号。NVIDIA 的显卡基本都能支持 CUDAAMD 显卡和 Intel 核显用不了 CUDA只能装 CPU 版 PyTorch想要 GPU 加速得走其他框架。确认是 NVIDIA 显卡后打开命令行工具Win R输入cmd执行nvidia-smi这个命令会输出显卡信息、驱动版本、显存占用最上面有一行 “CUDA Version: 12.x”。这个数字是驱动支持的 CUDA 最高版本不是说你系统里装了 CUDA 12。如果这个命令提示找不到说明驱动没装好先去 NVIDIA 官网下载对应型号的驱动。如果驱动版本显示太老比如只有 CUDA 10.x建议直接去 NVIDIA 官网下载最新驱动。装完重启再继续往下走。2.2 安装Miniconda并激活condaAnaconda 和 Miniconda 功能上完全一致区别只是 Anaconda 预装了几百个科学计算包体量巨大Miniconda 只保留 conda 核心和 Python体量小很多后续要什么装什么。我的建议是用 Miniconda理由很简单预装全家桶很少都用到而且包版本冲突起来非常头疼。到官网下载 Windows 安装包安装时有两个勾选项值得注意“Add Miniconda to PATH”新版默认会勾选建议保持勾选这样你可以在任何终端直接使用 conda 命令。安装路径尽量不选 C 盘根目录下带空格和中文的目录比如D:\Miniconda这种简单路径后面配环境变量和换源都省心。装完之后重新打开一个终端输入conda --version能看到版本号就说明 conda 已经可用了。接下来顺手把 conda 自身升级一下conda update -n base conda这一步看着不起眼但跳过的话后面创建环境时可能遇到 “Solving environment: failed” 这种玄学报错多半是 conda 版本太旧导致的。2.3 把conda源和pip源换成国内镜像安装 PyTorch 的时候要下载很多依赖包如果直接访问官方源速度特别考验网络。换国内镜像源是最实用的加速手段合法合规也没有任何风险。配置清华 conda 源在终端里依次执行conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --set show_channel_urls yes为了让 pip 也跟着走国内源可以运行pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple注意换的是 conda 的通用软件源跟 PyTorch 的 pytorch channel 不完全是一回事。后面安装 PyTorch 时如果指定了-c pytorch或-c nvidiaconda 还是会去官方源拉取 PyTorch 专属包。这时候如果速度慢可以单独把 pytorch channel 的镜像地址加上比如https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/。但更省心的方式是下面这种思路先用命令查好官方源里的可用版本再结合国内镜像配置。3. conda创建PyTorch GPU环境一步步走3.1 创建并激活虚拟环境我习惯每个项目一个独立环境名字起得有意义一点比如pytorch、torch2、nlp这种。创建环境时把 Python 版本也定好省得后面手滑装错。以 PyTorch 2.x Python 3.10 为例执行conda create -n pytorch python3.10 -y为什么选 Python 3.10不是越新越好。PyTorch 官方对 Python 3.12 的支持在早期版本里并不完整3.10 和 3.11 是兼容性最稳的选择。如果你后续要跑一些老项目、依赖某些旧版本的包3.10 更是稳妥。等待提示完成后激活环境conda activate pytorch激活成功之后终端前面会出现(pytorch)字样代表你已经在虚拟环境里了。后续所有安装操作都要保证终端最前面有这个环境名。3.2 用conda还是pip装PyTorch这是很多教程忽略的问题。PyTorch 官方实际上同时提供 conda 和 pip 两种安装方式我推荐 conda理由有两条。第一conda 会自动解析和安装 CUDA 运行时、MKL 这些底层依赖匹配关系更完整。用 pip 的话虽然新版 PyTorch 也会带上 CUDA 库文件但偶尔会出现某依赖版本对不上导致torch.cuda.is_available()返回 False 的情况。第二conda 的统一管理体验更好。后面你还要装 torchvision、torchaudio 这类配套包conda 会保证它们和 torch 的核心版本号匹配不会出现 torch 和 torchvision 一个装 2.1.0 一个装 2.0.1 这种拉扯。如果你确实习惯 pip那我建议一定要用 PyTorch 官网生成的完整 pip 命令例如pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121千万不要在激活环境后直接裸敲pip install torch这样大概率装到的是 CPU 版本而且版本还不一定和 torchvision 联动。3.3 安装命令与版本选择到这一步最关键的是搞清楚当前 PyTorch 官方支持哪些 CUDA 版本。以 PyTorch 2.1 和 2.2 时代为例常见的版本有 cu118、cu121、cu122。具体以 PyTorch 官网 Get Started 页面实时展示的为准。在 conda 环境下典型的安装命令长这样conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia这里pytorch-cuda12.1是给 conda 一个明确指示为 PyTorch 搭配 CUDA 12.1 运行时。如果只写conda install pytorchconda 很可能会从默认源装一个完全没有 CUDA 支持的版本这也是很多人装完发现用不了 GPU 的元凶。命令解析-c pytorch从 PyTorch 官方 conda channel 拉包。-c nvidia从 NVIDIA 官方 conda channel 拉 CUDA 运行时相关包。pytorch-cuda12.1锁定 CUDA 运行时版本确保和 PyTorch 的编译版本匹配。如果你觉得官方源慢可以尝试 pytorch channel 的国内镜像。比如先添加清华 pytorch 镜像 channelconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/再执行安装命令。但要注意部分 nvidia channel 的包不一定同步在镜像里这时候会报PackagesNotFoundError。遇到就用回官方源或者把超时时间调大一些。实在不行检查一下网络后重试两次PyTorch 安装包挺大偶尔断一次也正常。3.4 验证GPU能不能被PyTorch调用装完之后不要急着跑模型先做个最小化验证。在终端里输入python -c import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))如果一切正常你会看到类似下面的输出2.1.0cu121 12.1 True NVIDIA GeForce RTX 3060几个字段的含义torch.__version__这里显示2.1.0cu121加号后面的cu121就说明这个 PyTorch 包编译时带了 CUDA 12.1 支持。torch.version.cuda是 PyTorch 运行时使用的 CUDA 版本。torch.cuda.is_available()返回True才是真正的重点。torch.cuda.get_device_name(0)返回显卡型号能显示型号说明 PyTorch 成功识别到了你的 GPU。如果torch.cuda.is_available()返回False不要慌后面专门有一节讲排查方法。3.5 一个简短的速度对比测试验证 GPU 可用之后我建议再做一个小测试直观感受一下 CPU 和 GPU 的差距顺便确认 CUDA 不是只停留在 “True” 这个字面上。下面这段代码在环境中执行可以对比两种情况下的矩阵乘法耗时import torch import time def run(device, size1024): a torch.randn(size, size, devicedevice) b torch.randn(size, size, devicedevice) # 预热 for _ in range(3): torch.mm(a, b) torch.cuda.synchronize() if device cuda else None start time.time() for _ in range(10): torch.mm(a, b) torch.cuda.synchronize() if device cuda else None return time.time() - start cpu_time run(cpu) print(fCPU time: {cpu_time:.4f}s) if torch.cuda.is_available(): gpu_time run(cuda) print(fGPU time: {gpu_time:.4f}s) print(fSpeedup: {cpu_time / gpu_time:.2f}x)大多数独立显卡上GPU 会比 CPU 快一个数量级以上。如果 GPU 时间和 CPU 时间几乎一样那要怀疑 PyTorch 是不是还在 CPU 上跑检查一下张量创建的device参数有没有生效。4. 常见报错与排查经验4.1 torch.cuda.is_available()返回False这个报错出现的频率最高而且原因千奇百怪。我根据排查顺序列一下第一确认 PyTorch 装的是不是 GPU 版。前面验证步骤里torch.__version__如果不带cu后缀比如直接显示2.1.0说明装的是 CPU 版。这种情况下重新按 3.3 节的命令安装并且盯着终端看它是否真的从 pytorch 和 nvidia channel 拉了包。如果发现连了清华源但始终没出现pytorch-cuda相关字样就得考虑回退官方源。第二显卡驱动太老。检查nvidia-smi的 CUDA Version如果是 11.x 甚至更低装 cu121 的 PyTorch 有可能会失败。这个时候两条路去官网更新驱动或者装一个和驱动匹配的旧版 PyTorch比如驱动只支持 CUDA 11.8就装 cu118 版本。第三conda 解析异常。之前有人遇到 conda 提示装好了但import torch的时候报错找不到某个 DLL。这种情况建议直接把环境删了重建conda deactivate conda env remove -n pytorch conda create -n pytorch python3.10 -y conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia重建环境的成本远低于各种碰运气式的修补。4.2 conda自动安装了CPU版这是最容易踩的坑尤其是我在前面提到过的裸敲pip install torch。conda 命令如果有问题也可能出现这种结果。排查方法很简单conda list | findstr torch看安装的 torch 是不是带pytorch-cuda或者cuda相关的依赖。如果 torch 包版本后面跟的是cpu_0这种字符串那就说明 conda 解析到了 CPU 变体。出现这种情况通常是命令没写全或者源里面有 CPU 版本的包而没明确指定 CUDA 版本。解决办法就是把pytorch-cuda12.1明确写出来同时确认命令里带了-c pytorch -c nvidia。4.3 显存不足或OOM环境跑通只是第一步真正训练的时候经常碰到 “CUDA out of memory”。这个问题的核心是显存有限不像内存不够还能靠磁盘交换。刚上手时最粗暴的应对方式就是调小 batch sizedataloader DataLoader(dataset, batch_size8)把 32 改成 8甚至改成 2显存占用会立刻降下来。另外可以用torch.cuda.empty_cache()清掉缓存碎片它能把 PyTorch 缓存池里的显存释放一部分但不会减少模型本身占用的显存。更重要的一个检查点是确认模型真的在 GPU 上。初学者常见的错误是数据放到了 GPU但模型参数还在 CPU或者反过来。统一的做法是model model.to(cuda)同时训练循环里的每个批次数据也要做batch batch.to(cuda)。4.4 老显卡和不常见显卡如果你的显卡比较老比如十年前的低端卡可能不支持新版 PyTorch 依赖的 GPU 计算能力compute capability。此时torch.cuda.is_available()可能返回 True但一运行就报no kernel image is available之类的错。这种情况就别硬刚新版了去 PyTorch 官网查一下老版本兼容性装一个对应年代的 PyTorch 版本。比如 CUDA 10.x 时代的 PyTorch 1.7、1.8 对老显卡的支持就好很多。如果你用的是 AMD 显卡、Intel 核显或者 N 卡但显存极小比如只有 2G我的建议是直接放弃本地 GPU去用云服务器或者 Google Colab。强扭的瓜不甜本地跑不动还耽误时间。5. 装好之后IDE、Jupyter与日常使用建议5.1 PyCharm里配置conda环境环境在命令行里跑通之后很多人下一步就是用 IDE 写代码。PyCharm 配置 conda 环境其实很简单打开 Settings - Project - Python Interpreter点击右上角的设置齿轮选 Add Interpreter - Add Local Interpreter。在弹出的窗口里选择 Conda Environment然后点 Existing environment在列表里找到你刚才创建的pytorch环境对应的 Python 解释器。如果不确定环境路径可以在终端里执行conda env list会显示类似C:\Users\你的用户名\miniconda3\envs\pytorch的路径。选择这个环境下的python.exe就好。配置完成后在 PyCharm 底端打开 Python Console先运行一下import torch print(torch.cuda.is_available())看到True就说明 IDE 已经正确接入了 GPU 环境。5.2 Jupyter Notebook使用当前环境Jupyter 默认启动的是 base 环境如果不做任何配置进了 notebook 之后import torch会直接报 ModuleNotFoundError因为 base 环境里根本没装 PyTorch。让 Jupyter 识别 conda 环境需要装一个内核扩展。在激活你的pytorch环境之后执行conda install ipykernel python -m ipykernel install --user --name pytorch --display-name PyTorch GPU后面启动 Jupyterjupyter notebook新建 notebook 的时候在 Kernel - Change Kernel 里选择 “PyTorch GPU”这样 notebook 里跑的代码就是使用你 conda 环境里的 PyTorch 了。5.3 日常使用建议别手贱升级环境环境装好能跑之后最大的敌人是“手贱升级”。PyTorch 环境和普通软件不一样今天conda update --all把环境里一堆包升了明天可能就发现某个项目 import 报错。我的几条实操习惯一个项目一个环境不要共用。哪怕你觉得只是个小测试也单独建环境用完直接删。用conda env export environment.yml把环境依赖导出来放到项目里。这个文件是项目复现的关键换电脑之后一条conda env create -f environment.yml就能恢复。尽量固定 PyTorch 大版本。比如项目是基于 PyTorch 2.1 写的就别贸然升级到 2.3。升级大版本之前先看 Release Note 里有没有 breaking change。下面是一个常见的环境检查命令可以查当前环境关键包的版本conda list | findstr torch cuda特别要盯住 torch、torchvision、torchaudio 三个版本是否匹配。PyTorch 官网每个稳定版本都会同时发布这三个包版本号一般保持一致。如果发现 torch 是 2.1.0、torchvision 是 0.16.0 这种不同的数字也不用慌因为 torchvision 的版本号体系就是跟随 torch 的0.16.0 对应 torch 2.1.00.17.0 对应 torch 2.2.0。最后再分享一个我实际使用中的体会win10 上装 PyTorch GPU 环境最大的坑往往不是硬件而是软件源和版本选择的问题。只要你别图省事装 CPU 版、别忽略nvidia-smi的驱动版本、别在环境里胡删乱升基本上按上面这套流程走一遍都能顺利跑通。如果真的遇到奇怪的问题最快的解决方式是删掉环境重建这比在网上翻各种陈旧教程高效得多。