ARTICLE DETAIL

资讯详情

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

PyTorch GPU环境配置:CUDA、conda与PyCharm排查

PyTorch GPU环境配置:CUDA、conda与PyCharm排查 装完 PyTorch 兴冲冲敲下torch.cuda.is_available()屏幕上回你一个冷冰冰的False——这大概是我见过最多人卡住的地方。从本科生的笔记本独显到机房里 8 卡的训练服务器我前前后后帮人配过几十次环境翻车的姿势五花八门真正的原因来来回回就那么几个。Anaconda 加 PyCharm 加 PyTorch GPU 版本这套组合本身没有任何玄学难的地方在于链条上任意一环对不上你看到的现象都是同一个False而报错信息几乎从不告诉你断在哪。这篇东西写给三类人第一次配深度学习环境、被 conda 和 pip 搞晕的新手昨天还能跑今天突然CUDA out of memory、想搞明白自己机器到底发生什么的半熟手以及需要给实验室、给团队批量配环境想找一套可复用流程的人。我会把版本对应关系、conda 环境规划、PyTorch GPU 包安装与验证、PyCharm 解释器接入、最小训练例子跑通、环境导出迁移这几件事按依赖顺序拆开讲每一步都说明为什么这么做而不是甩一串命令让你自己猜。命令你抄走就能用背后的逻辑你得懂不然下次换个机器还是原地打转。1. 版本三角驱动、CUDA 运行时、PyTorch 到底谁管谁1.1 显卡驱动是唯一不能靠 conda 解决的一环很多人配环境的第一反应是缺什么装什么于是上来就去 NVIDIA 官网下载 CUDA Toolkit 安装包装完发现还是不行又把 cuDNN 也装上折腾一下午。问题的根源在于没搞清楚这三者的从属关系。整条链路是自下而上的显卡驱动 → CUDA 运行时 → PyTorch 二进制包。最底层的驱动必须装在操作系统里它是操作系统和显卡对话的翻译官conda 管不了它pip 更管不了它。中间层的 CUDA 运行时提供libcudart、cuBLAS、cuDNN 这些计算库PyTorch 调用它们去做矩阵运算。最上层才是你import torch时加载的那堆.so或.dll。关键认知从 PyTorch 1.8 前后开始官方发布的 GPU 版本就已经把 CUDA 运行时和 cuDNN 打包进去了。你pip install下来的那个几百 MB 甚至两三个 GB 的 wheel解压后torch/lib/目录下就躺着cudart、cublas、cudnn系列库文件。conda 路线同理pytorch-cuda11.8这个虚拟包会把对应的运行时库拉进你的环境目录里。所以除非你要自己编译 PyTorch、编译自定义 CUDA 算子比如某些检测库的扩展否则你不需要单独安装 CUDA Toolkit也不需要单独下载配置 cuDNN。这是新手最大的时间黑洞我见过有人为此重装三次系统。1.2 驱动版本的硬约束与向下兼容驱动是唯一有够不够这个概念的环节。判断方法很简单打开终端敲nvidia-smi输出右上角那一行CUDA Version: 12.4是什么意思它不是你机器上装的 CUDA 版本而是当前驱动所能支持的最高 CUDA 运行时版本。这个数字是上限不是必须。你的驱动显示 12.4那么装 cu118、cu121 的 PyTorch 包都能跑但如果你硬要装 cu124 以后的版本就可能因为运行时版本高于驱动支持上限而初始化失败典型症状是torch.cuda.is_available()返回 False或者直接抛CUDA error: no kernel image is available。下面这张表是我在实测中总结的粗略对应关系实际以nvidia-smi输出为准驱动版本区间大致支持的 CUDA 运行时上限建议的 PyTorch 安装轮子470.x ~ 495.xCUDA 11.4cu113 / cu116510.x ~ 525.xCUDA 11.6 ~ 12.0cu116 / cu118530.x ~ 545.xCUDA 12.1 ~ 12.4cu118 / cu121550.x 及以上CUDA 12.4cu121 / cu124另一个容易踩的点是笔记本的双显卡切换。搭载 NVIDIA 独显的轻薄本默认可能走核显输出nvidia-smi里显示正常但 PyTorch 用不了需要到系统显示设置或显卡控制面板里把 Python 进程指定为独显运行。这个坑我在帮人远程排查时遇到过至少五次表现和驱动版本不匹配几乎一模一样。1.3 三条命令摸清机器的底牌动手装东西之前先把机器的现状摸清楚。我习惯先跑这三条nvidia-smi # 看驱动版本、显卡型号、显存容量、当前占用 nvcc -V # 看是否装了完整 CUDA Toolkit可能不存在正常 python -V # 看系统 Python 版本nvcc -V报command not found完全不用慌因为按上面的思路你根本不需要它。真正需要确认的是显卡型号和显存4GB 显存的卡跑 ResNet-50 的 batch size 开到 64 基本必炸这跟环境配得对不对没关系是物理上限。同时看一眼机器内存RAM——后面讲哪儿都不忙但卡的时候会用到这个信息。2. Anaconda 装完之后环境规划才是重头戏2.1 安装包选择与那两个勾选项Anaconda 的安装流程本身没什么技术含量但有两个勾选项值得说一下。第一个是Add Anaconda3 to my PATH environment variable。官方安装程序默认不勾理由是会干扰系统里已有的 Python。我个人的建议是不勾需要的时候用开始菜单里的 Anaconda Prompt。原因很实际——如果你机器上还有别的软件依赖系统 Python把 Anaconda 塞进 PATH 有可能让那些软件莫名报错排查起来极其痛苦。当然如果你就是想图方便勾了也不会出大问题只是要记住以后所有python命令都会指向 Anaconda虚拟环境失效时容易误判。第二个是Register Anaconda3 as my default Python这个可以放心勾。它只是登记文件关联不会强行改系统 PATH。安装路径我强烈建议避开中文和空格。C:\Program Files\下面带空格某些老版本的编译工具链处理不了用户名是中文的比如C:\Users\张三\anaconda3更麻烦conda 在处理路径编码时偶尔会出岔子报一些莫名其妙的 Unicode 错误。我的习惯是直接装在C:\anaconda3或D:\anaconda3这种干净路径下。macOS 上装完记得跑一次conda init zsh或者conda init bash否则终端里conda activate会提示没有这个命令。Windows 上如果是用 Anaconda Prompt一般开箱即用。2.2 建虚拟环境Python 版本别追最新环境规划的核心思路是一个项目一个环境绝不往 base 环境里塞东西。base 环境是 Anaconda 自带的管理员环境装崩了修起来很麻烦把它当成一个干净的调度中心就好。conda create -n pygpu python3.10 -y conda activate pygpuPython 版本怎么选我的经验是比最新版落后一到两个小版本。比如现在最新是 3.13那选 3.10 或 3.11 最稳。原因很直接PyTorch 的 wheel 是按 Python 版本、操作系统、CUDA 版本多维度编译的新版本 Python 刚出来那段时间生态里的包适配往往滞后你可能会发现某个必须用的库没有对应版本这时候要么降级要么从源码编译纯属自找麻烦。环境名也建议有点意义pygpu、torch211-cu118这种一眼能看出用途。我见过有人环境名叫test、test2、newtest半年后完全记不清哪个是哪个最后只能全删重建。2.3 换源这件事能省下大量等待时间官方源在国内的下载速度懂的都懂。不换源的话conda 拉一个 PyTorch 包可能要卡上半小时甚至中断。常规做法是配置国内镜像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不过这里有个必须提醒的坑PyTorch 官方 conda 包在pytorch和nvidia这两个 channel 里镜像站对这两个 channel 的同步可能有延迟。你按官网命令写-c pytorch -c nvidia的时候如果源配置把默认 channel 换掉了可能会报PackagesNotFoundError。我的实际处理方式是镜像源只用来装 numpy、pandas 这类通用包PyTorch 本体老老实实走官方源或者干脆改用 pip 路线配合官方 index-url。别为了省十分钟把环境搞出玄学问题后面排查的时间远超这点等待。提示把show_channel_urls设为 yes 之后conda 在安装时会打印每个包的实际来源地址。装 PyTorch 时瞄一眼能立刻确认它到底是从哪儿拉的对排查为什么装成了 CPU 版特别有用。3. 在虚拟环境里装 PyTorch GPU 版命令、验证与翻车排查3.1 官网命令生成器别凭记忆敲命令这是我最想强调的一条不要靠记忆或从旧博客里复制 PyTorch 安装命令。不同版本、不同平台、不同 CUDA 组合的命令都不一样抄错一个参数就是 CPU 版或者装不上。正确做法是打开 PyTorch 官网的 Get Started 页面用它的选择器点出你的配置PyTorch 版本、操作系统、包管理器conda 或 pip、语言Python、计算平台选带 CUDA 的那个版本号。生成出来的命令直接复制执行。conda 路线长这样conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidiapip 路线长这样pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118两条路线我的取舍是这样的新手、Windows 用户、需要长期维护环境的走 conda因为它对依赖关系的处理更稳卸载也干净需要特定小版本、或者要用较新的 CUDA 组合官方 conda 包更新稍慢走 pip。最忌讳的是在同一个环境里 conda 装一遍、pip 再装一遍这样会产生两套并存的包记录conda list和pip list显示不一致之后卸载时残留一堆文件环境基本就废了。有一个细节值得单独说在 Windows 上用 pip 从默认 PyPI 源执行pip install torch装下来的很可能是 CPU 版本。这个坑极其隐蔽因为 pip 不会给你任何警告装完import torch完全正常只有torch.cuda.is_available()是 False。所以 pip 路线一定要带上--index-url https://download.pytorch.org/whl/cuXXX这个参数指向 PyTorch 官方的轮子仓库。3.2 装完必做的三层验证装完之后别急着写模型。先做三层验证从粗到细import torch print(torch.__version__) # 第一层版本号确认包本身加载成功 print(torch.version.cuda) # 第二层这个包是拿哪个 CUDA 编译的 print(torch.cuda.is_available()) # 第三层运行时能不能真正看到显卡 print(torch.cuda.device_count()) # 能看到几张卡 print(torch.cuda.get_device_name(0))# 第一张卡的型号我一般把这五行存成一个check_env.py以后每配一个新环境都先跑它比任何文档都直观。输出解释大致是这样torch.__version__形如2.1.2cu118加号后面就是 CUDA 版本标识看到cpu就说明装错了。torch.version.cuda打印11.8这类数字代表编译时用的 CUDA 运行时版本。如果这里是None说明装的是 CPU 版本。torch.cuda.is_available()是最终裁判。device_count()在多卡机器上特别有用能告诉你驱动是否完全识别了所有卡。再补一条渲染一下计算能力print(torch.cuda.get_device_capability(0)) # 例如 (8, 6)这个数字代表显卡的算力等级sm_86 之类。某些自定义算子编译时需要指定对应的架构参数报错no kernel image is available for execution on the device通常就是编译时指定的算力架构和实际显卡不匹配造成的。3.3is_available()返回 False 的七种原因与排查顺序到了这一步还是 False别急着重装系统。按下面的顺序排查从成本最低的开始排查项具体动作典型症状环境激活错了conda env list确认星号在哪个环境再which pythonWindows 用where python在 base 环境里跑验证脚本装成了 CPU 版conda listgrep torch或pip list驱动版本过低nvidia-smi看右上角 CUDA Version 是否低于 PyTorch 要求的运行时版本驱动数字明显偏小显卡被独占关掉正在跑训练的其他进程或nvidia-smi看是否有僵尸进程占着显存被占满双显卡切换未生效系统显示设置中把 Python 指定为独显运行笔记本上尤其常见WSL / 容器环境未透传检查是否有设备映射容器需加--gpus all容器里nvidia-smi直接不认源码编译的包架构不匹配get_device_capability与编译参数比对报 no kernel image 类错误排查的核心原则是现象相同原因不同必须用输出定位而不是用猜测。torch.version.cuda为 None那问题 100% 在包本身跟驱动一点关系没有它能打印出11.8但is_available是 False那问题就跑到驱动或硬件层了。这一条分界线能帮你砍掉一半的排查工作量。4. 把 conda 环境接进 PyCharm解释器路径是唯一的钥匙4.1 解释器指向的具体路径PyCharm 本身不提供解释器它只是个挂载工具。你要做的是把项目解释器指向 conda 环境里的那个python可执行文件。路径规律是固定的WindowsC:\anaconda3\envs\pygpu\python.exemacOS / Linux~/anaconda3/envs/pygpu/bin/python操作路径是File → Settings → Project: xxx → Python Interpreter → Add Interpreter → Conda Environment → Existing environment然后在 Interpreter 那一栏点开找到上面那个路径。新版 PyCharm 也支持Conda Environment → New environment让 IDE 帮你建环境。我不太推荐这种方式原因是 IDE 建环境时你没法精细控制 Python 小版本和源配置出问题也不好排查。自己用命令行建好再挂进去可控性高得多。挂载成功之后PyCharm 底部的包列表里应该能看到torch并且版本号后面带 cuda 标识。如果列表里没有说明解释器指错了——这是最高频的错误绝大多数PyCharm 里跑不了 GPU 但终端里可以的情况都是这一条。4.2 社区版与专业版的取舍以及为什么不碰激活工具PyCharm 分社区版和专业版。对纯本地深度学习开发来说社区版完全够用代码补全、调试器、虚拟环境管理、Git 集成全都有这些都是免费功能。专业版多出来的是远程解释器、数据库工具、Web 框架支持、科学计算模式这些主要面向需要连远程服务器调试的场景。热词里常出现的激活我的态度很明确别用来路不明的激活工具和破解补丁。这不是什么道德说教纯粹是从工程风险角度考虑——这类工具几乎都要你临时关闭杀毒软件、下载可执行文件、甚至修改 hosts 文件而你是在一台准备跑训练、存数据、连内网的机器上做这些事。我见过不止一次因为这类操作导致系统里被塞了挖矿程序GPU 被后台吃满训练慢得莫名其妙。学生和教育工作者可以通过正规渠道申请免费的教育授权或者直接用社区版两条路都比折腾破解省心。4.3 三个高频的IDE 里不对问题第一个内置终端和系统终端不一致。PyCharm 底部的 Terminal 默认会用项目解释器对应的环境但如果你之前手动改过 PATH 或者装 Anaconda 时勾了 PATH 选项终端里conda activate可能生效在另一个环境。判断方法是在 PyCharm 的 Terminal 里敲where pythonWindows或which python对比解释器设置里的路径。不一致的话在Settings → Tools → Terminal里把 Shell path 改成cmd.exe或指定 Anaconda Prompt 的启动脚本。第二个运行配置里残留了旧解释器。换过环境之后已有的 Run Configuration 可能还在用老解释器。到Run → Edit Configurations里检查每个配置的 Python interpreter 那一栏手动改过来。这个坑很隐蔽因为代码能跑只是慢——跑在 CPU 上而已。第三个环境变量传递。有些库比如涉及特定计算后端选择的依赖环境变量系统终端里设置了但 IDE 里读不到。可以在 Run Configuration 的 Environment variables 栏手动补上。养成在代码里显式os.environ.setdefault(...)的习惯比依赖外部配置可靠得多。5. 跑通一个最小的 GPU 训练例子5.1 device 统一写法让代码自己找卡环境验证通过之后第一个要养成的习惯是用统一的 device 变量管理张量和模型的位置而不是到处硬编码.cuda()。import torch device torch.device(cuda if torch.cuda.is_available() else cpu) print(using device:, device) x torch.randn(1024, 1024, devicedevice) w torch.randn(1024, 1024, devicedevice) y x w torch.cuda.synchronize() # 强制同步确保计时/报错发生在正确的位置 print(y.mean().item())这里有两个细节值得展开。第一torch.cuda.synchronize()在调试阶段非常有用。CUDA 的运算默认是异步下发的Python 这边在核函数实际执行完之前就返回了。如果你不手动同步报错堆栈会指向一行完全不相干的代码排查起来极其抓瞎。等定位到问题之后再把它去掉避免影响性能。第二devicedevice这种写法比x.cuda()更值得推荐因为它让你的代码天然支持 CPU 回退。换一台没有独显的机器代码不用改一行就能跑只是慢。5.2 一个最小 CNN 在 CIFAR-10 上跑通光跑矩阵乘法还不够得验证整个训练循环能在 GPU 上转起来。下面这段代码是能直接复制运行的完整骨架import torch import torch.nn as nn from torch.utils.data import DataLoader from torchvision import datasets, transforms device torch.device(cuda if torch.cuda.is_available() else cpu) transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,) * 3, (0.5,) * 3), ]) train_set datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform) train_loader DataLoader(train_set, batch_size128, shuffleTrue, num_workers4, pin_memoryTrue) class SmallCNN(nn.Module): def __init__(self, num_classes10): super().__init__() self.features nn.Sequential( nn.Conv2d(3, 32, 3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, 3, padding1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(64, 128, 3, padding1), nn.ReLU(), nn.AdaptiveAvgPool2d(1), ) self.classifier nn.Linear(128, num_classes) def forward(self, x): x self.features(x) return self.classifier(x.flatten(1)) def main(): model SmallCNN().to(device) criterion nn.CrossEntropyLoss() optimizer torch.optim.AdamW(model.parameters(), lr1e-3) model.train() for epoch in range(2): running 0.0 for i, (imgs, labels) in enumerate(train_loader): imgs imgs.to(device, non_blockingTrue) labels labels.to(device, non_blockingTrue) optimizer.zero_grad(set_to_noneTrue) logits model(imgs) loss criterion(logits, labels) loss.backward() optimizer.step() running loss.item() if i % 50 0: print(fepoch {epoch} iter {i} loss {running / (i 1):.4f} fmem {torch.cuda.memory_allocated() / 2**20:.1f}MB) if __name__ __main__: main()几个贯穿全文的要点都塞进这段代码里了。optimizer.zero_grad(set_to_noneTrue)比默认写法省一点显存和时间pin_memoryTrue配合non_blockingTrue让主机到显存的拷贝能重叠进行if __name__ __main__这层保护在 Windows 上是必须的因为num_workers 0时 DataLoader 用 spawn 方式启动子进程没有这层保护会无限递归地重新导入模块表现为一运行就刷屏或者直接崩掉。pin_memory这个参数值不值得开取决于你的数据加载是否是瓶颈。它会把数据先拷到锁页内存让 GPU 的 DMA 引擎能绕过 CPU 直接搬运代价是占用一部分系统内存。如果你的瓶颈在计算上开了也没坏处如果系统内存本来就紧张那就要权衡。5.3 用 nvidia-smi 看懂哪儿都不忙但就是卡训练跑起来之后开一个终端盯住nvidia-smi -l 1-l 1表示每秒刷新一次。重点看两列显存占用Memory-Usage和GPU 利用率GPU-Util。显存占用稳定在某个值说明 batch size 设置合理如果一路爬升直到崩溃就是典型的显存泄漏通常原因是在训练循环里累积了带梯度的张量比如把每个 batch 的 loss 存进一个 list 里。解决办法是存loss.item()而不是loss本身.item()会把张量拉到 CPU 变成普通数字不再持有计算图。GPU 利用率这条线更值得琢磨。热词里出现过GPU、CPU、内存占用都不高但卡这种情况我遇到过几次原因通常有三类第一类是数据加载是瓶颈。GPU-Util 在 0% 和 90% 之间锯齿状跳变说明 GPU 大部分时间在等数据。这时候num_workers给得太小尤其num_workers0或者数据在慢速机械硬盘上都会造成这个现象。把num_workers调到 CPU 核心数的一半左右试试同时确认 SSD 状态良好。第二类是同步点太多。循环里频繁调用.item()、print()、torch.cuda.synchronize()每次都会强制等待 GPU 算完异步流水线被打断。调试阶段可以忍正式训练时要把这类操作按 epoch 而不是按 iteration 做。日志信息攒一攒再打印比每个 batch 打一次快得多。第三类是模型太小、数据搬运占主导。小模型 CPU 侧开销本来就高DataParallel之类的多卡封装还会额外增加主卡负担。这种情况下增大 batch size、或者直接放弃多卡改用单卡反而更快。还有一个容易被忽略的现象nvidia-smi里看不到 Python 进程但显存被占了。这通常是上一次异常退出的僵尸进程残留用nvidia-smi打印出的 PID 直接 kill 掉即可。Windows 上如果 kill 不掉重启一次是最快的解法。6. 环境如何搬到另一台机器导出、复现与远程调试6.1 environment.yml 和 requirements.txt 的取舍配好的环境要能复现否则换机器一切重来。conda 提供导出功能conda env export --no-builds environment.yml--no-builds是关键参数它去掉了每个包的构建编号。带上构建编号导出的文件在另一台机器上尤其是不同操作系统基本装不上因为构建号是平台相关的。去掉之后只保留包名和版本跨平台成功率大幅提升。但 conda 导出的文件有个毛病它会把整个环境的依赖树都列出来包括那些你从没主动装过的间接依赖。在新机器上重建时如果某个间接依赖的小版本缺失conda 就可能开始漫长的求解甚至失败。我的做法是双轨并行用conda env export --from-history environment.yml只导出你显式安装过的包再补一个pip freeze requirements.txt作为完整快照。前者用来重建骨架后者用来核对细节。conda env create -f environment.yml conda activate pygpu pip install -r requirements.txt # 注意只补漏别整个覆盖顺带一提environment.yml里如果包含pytorch-cuda11.8这类字段在目标机器上需要对应操作系统支持。Linux 上重建 Windows 导出的环境CUDA 相关的包名会完全对不上这种情况老老实实按官网生成器重装 PyTorch其他包靠 requirements 补。6.2 远程服务器解释器与 Jupyter kernel 注册实验室的机器、云上的实例通常比本机强得多本地写代码、远程跑训练是很常见的做法。PyCharm 的远程解释器功能在专业版里社区版没有不过你可以退而求其次用 SSH 终端加同步工具或者装一个 Jupyter 环境。要把 conda 环境注册成 Jupyter kernelconda activate pygpu pip install ipykernel python -m ipykernel install --user --name pygpu --display-name Python (pygpu)之后jupyter kernelspec list就能看到注册结果。这一步的价值在于避免在 notebook 里 import 的 torch 是 CPU 版这种鬼故事——只要 kernel 指向的是你那个配好 GPU 的环境就不会出问题。启动远程 notebook 时记得加--no-browser --port之类的参数指向正确的监听地址然后通过 SSH 端口转发在本地浏览器访问这样 notebook 就从远程那台机器的角度运行了。6.3 多卡与 DataLoader 的两个关键参数拿到多卡机器的时候第一反应往往是堆DataParallel。我的建议是先确认单卡能跑满再考虑多卡。很多时候你以为是算力不够实际上是单卡的 GPU 利用率只有 30%加了卡也只是把浪费放大。如果确实要上多卡DataParallel单进程多线程写法简单但性能一般主卡要负责汇总梯度容易成为瓶颈DistributedDataParallel多进程性能好但配置复杂需要配合torchrun之类的启动器。两者都需要显式指定device_ids不指定的话默认用所有可见卡而可见卡由CUDA_VISIBLE_DEVICES环境变量控制。CUDA_VISIBLE_DEVICES0,1 python train.py这个环境变量在调试时特别有用你想只用第二张卡又不想改代码设成CUDA_VISIBLE_DEVICES1就行。代码里的device_count()会诚实地反映 1 张卡device(0)对应的就是物理上的第二张卡。这个技巧在多人共用的服务器上几乎是必备技能。7. 环境用久了必然要面对的两件事7.1 环境膨胀与版本回退跑一段时间之后环境会以肉眼可见的速度膨胀。今天试一个库明天试另一个每个pip install都可能顺带升级一堆依赖。等到某天发现训练突然报错、或者精度莫名其妙下降回头想找是哪个包升级导致的基本无从查起。我的应对方式是阶段性打快照。在环境稳定、能跑通完整训练流程之后立刻导出一次conda list --explicit spec-file.txt这个文件记录了包含构建号在内的精确包清单配合离线包缓存可以做到完全一致的环境重建。虽然不能跨平台但在同一台机器上回滚非常可靠。conda create -n pygpu_backup --clone pygpu--clone是最省事的快照方式直接复制整个环境目录。代价是占磁盘一个深度学习环境动辄 5 到 10 GB但比起环境炸掉后从头配两小时这点空间花得值。我在做重要实验之前一定会 clone 一份实验用副本主环境保持稳定。版本回退的话单个包用conda install package1.2.3或pip install package1.2.3如果是整个环境出问题直接删了从 spec 文件重建更快。7.2 删环境重建的标准动作最后说说怎么干净地删环境这个操作看起来简单但残留问题很常见。conda deactivate conda env remove -n pygpu conda clean --all第一步必须先deactivate否则在环境被占用的情况下删除可能失败或删不干净。conda clean --all清理的是下载缓存和索引缓存能回收几 GB 到几十 GB 不等的空间。如果你确定某个环境再也不会用删掉它之后顺手清一次缓存磁盘压力会小很多。还有一点PyCharm 里如果还挂着被删掉的解释器打开项目时会报解释器无效的警告。到Settings → Python Interpreter里把失效的那条移除再重新添加新的就行。这个提示不用慌它只是找不到原来的路径而已。我个人在实际操作中体会最深的一点是环境问题的排查成本和你记录的详细程度成反比。每次配完一个新环境把nvidia-smi的输出、conda list的关键几行、验证脚本的运行结果存成一个env-notes.txt放在项目根目录看起来有点笨但下次换机器或者半年后回来接着做的时候这几行字能省下大半天。另外分享一个小技巧把前面那段环境验证代码做成了一个可执行的check_env.py再加一个批处理或 shell 脚本内容就是依次打印 conda 环境名、Python 路径、torch 版本、CUDA 可用性、显卡型号。以后每次打开项目第一件事就是跑它三秒钟确认环境状态能把大量代码没问题但就是跑不对的困惑提前扼杀掉。
返回列表