Linux服务器从零配置PyTorch GPU环境:驱动、conda与CUDA版本全攻略
有的朋友拿到一台Linux服务器第一件事不是装PyTorch而是先犯了难驱动装没装、Python用哪个版本、CUDA到底该选哪个、pip装完怎么一import就报错。配环境这件事看着简单实际坑不少尤其是服务器上多个用户共用、GPU型号新旧不一、之前的人装过乱七八糟依赖的情况。我在实验室和公司线下机器上折腾过很多次这篇就把Linux服务器上从零配好PyTorch环境的完整过程、版本取舍、实测踩坑点全部写清楚。这篇内容适合这几类人看刚接触服务器的新手、需要给团队统一配置深度学习环境的人、以及明明照网上教程装完却跑不起来的老哥。我会用到Linux常用命令、conda环境管理、CUDA与驱动的对应关系尽量把每个环节的“为什么”也讲透避免你只会照抄命令换个版本就抓瞎。1. 动手前先摸底确认服务器硬件与驱动决定PyTorch版本很多教程上来就让你pip install torch结果装完发现torch.cuda.is_available()返回 False问题就出在开头没做服务器摸底。这一节非常重要属于那种“省了会返工、做了能保命”的步骤。1.1 查看系统版本、架构、显卡与驱动登录服务器后先把这几条命令挨个敲一遍确认底子是什么样# 操作系统版本 cat /etc/os-release # CPU架构x86_64还是ARM这个影响后面选安装包 uname -m # 内核版本 uname -r # 显卡型号与驱动信息 nvidia-smi # 如果nvidia-smi不存在先看有没有NVIDIA显卡硬件 lspci | grep -i nvidia这里重点说下nvidia-smi的输出。它会直接告诉你两件事显卡驱动版本以及驱动支持到的最高CUDA版本。比如我见过很多新手的服务器显示CUDA Version: 12.1这句话的意思是当前驱动最多能兼容到 CUDA 12.1不代表你已经装好了 CUDA 12.1。PyTorch 的 GPU 版本安装包里自带 CUDA runtime只要它要求的CUDA版本小于等于驱动支持的版本通常就能运行。所以看到nvidia-smi里的CUDA版本是12.1再去看 PyTorch 官网选cu118或cu121的安装包都是没问题的。如果你的服务器比较老显示CUDA Version: 11.4那你就别死磕最新版 PyTorch老老实实找 CUDA 11.x 对应的旧版本安装包越新版本越容易报driver too old的错误。1.2 理解CUDA、cuDNN、PyTorch三者的关系减少版本焦虑这里我得花点篇幅讲清楚一个很多新手搞混的概念。在 PyTorch 环境里有三样东西和“GPU加速”有关NVIDIA显卡驱动运行在系统底层负责和显卡硬件通信CUDA Toolkit包含编译器和运行库PyTorch 需要它提供的库函数来调用GPUcuDNN深度神经网络的加速库PyTorch 默认会捆绑一个版本。而实际安装 PyTorch 时你做的操作是什么用pip install torch装的那个大包里面其实已经包含了一套 CUDA runtime 和 cuDNN不需要你再手动去系统层面装一套 CUDA Toolkit。这也是为什么我只强调“看驱动支持的最高CUDA版本再反推选择哪个PyTorch安装包”而不是叫你去单独下载CUDA安装包的原因。当然有些场景确实需要完整安装 CUDA Toolkit比如你要编译自定义的CUDA算子、用nvcc编译扩展这时才需要去官网下载和驱动版本匹配的 Toolkit 装到系统里。但对于绝大多数跑深度学习模型场景直接用 PyTorch 自带的 CUDA runtime 就足够了还能避免系统里装多个CUDA版本导致的环境混乱。1.3 确认已装NVIDIA驱动必要时手动安装驱动很多服务器拿到手系统是别人装的可能根本没有NVIDIA驱动。验证方法就是跑nvidia-smi如果提示command not found先别急看看/dev/nvidia*设备节点是否存在ls /dev/nvidia*如果设备节点存在只是命令不在系统 PATH 里说明驱动可能装了需要添加环境变量或者安装nvidia-utils之类的工具包。如果设备节点根本不存在那大概率是驱动没装或者内核模块加载失败这种情况就得先处理驱动。以 Ubuntu/Debian 系为例装驱动最稳妥的方式是通过包管理器安装而不是去NVIDIA官网下载.run文件硬装# 先查看推荐的新驱动版本 ubuntu-drivers devices # 一键安装推荐驱动会同时安装 nvidia-driver-xxx sudo apt update sudo apt install -y nvidia-driver-535 sudo reboot装完重启再跑nvidia-smi看到类似下面的输出就说明驱动工作了--------------------------------------------------------------------------------------- | NVIDIA-SMI 535.154.05 Driver Version: 535.154.05 CUDA Version: 12.2 | ---------------------------------------------------------------------------------------如果是 CentOS/Rocky Linux 这类系统装驱动会稍微麻烦点通常需要先把内核开发包和 gcc 装好再借助dkms安装。这种情况下建议直接参考发行版官方文档或者请运维同事协助别自己在生产服务器上乱搞内核模块。小节要点服务器配置 PyTorch 环境第一步不是装 PyTorch而是查驱动。nvidia-smi驱动的CUDA版本决定你能选的PyTorch版本上限没有驱动一切免谈。2. 构建Python隔离环境为什么我推荐Miniconda而不是直接pip装服务器上通常不止跑一个项目如果每个项目都直接把依赖装到系统 Python 里很快就会遇到“A项目要 torch1.13B项目要 torch2.1”的惨案。更麻烦的是系统很可能同时存在 Python 3.8 和 3.10不同软件依赖不同Python版本直接乱套。2.1 virtualenv/venv与conda的选型对比有人会问我用python3 -m venv不也能隔离环境吗能但不推荐在服务器上作为主力方案原因有几个venv 创建的环境默认不隔离 CUDA 相关的系统库配置GPU环境时容易和系统 Python 纠缠conda 不光能管理 Python 环境还能管理 CUDA Toolkit、cuDNN、MKL 这些非 Python 依赖这对深度学习环境非常有用conda 在安装大型二进制包比如 torch、cudnn时会自动处理依赖冲突venv 做不到。对比表格一下对比项conda/minicondavenv环境隔离程度能隔离Python版本和非Python库只能隔离Python包安装二进制库CUDA/cuDNN原生支持需要手动搞多版本Python共存轻松支持靠系统自带版本团队统一环境容易通过environment.yml复现需要手动记录requirements.txt上手门槛略高一点简单所以在服务器这种“要长期跑、多项目并存、需要GPU加速”的场景我个人的习惯是一律用 Miniconda 管理所有Python环境。不管你是做PyTorch、TensorFlow还是单纯写点数据处理脚本都放进conda环境里。2.2 Miniconda安装的完整过程与目录规划到 Miniconda 官网或国内镜像站下载对应架构的安装脚本。服务器如果是 x86_64 架构选Miniconda3-latest-Linux-x86_64.sh如果是ARM架构比如华为鲲鹏服务器选Miniconda3-latest-Linux-aarch64.sh。这里有个实际经验别把conda装到/root目录下更别一路默认回车装在~目录后就完事。服务器上通常多个用户共用装到/opt/anaconda这类公共目录更合适。但前提是当前用户有权限写这个目录或者用sudo执行安装# 以root身份安装到/opt目录允许所有用户使用 sudo sh Miniconda3-latest-Linux-x86_64.sh -b -p /opt/miniconda3解释一下参数-b表示静默安装不交互-p指定安装路径。装完之后把conda初始化到全局环境变量里让所有用户登录就能直接使用# 在/etc/profile.d/下新建一个脚本写入环境变量 echo export PATH/opt/miniconda3/bin:$PATH | sudo tee /etc/profile.d/miniconda.sh # 让配置立即生效 source /etc/profile.d/miniconda.sh # 验证成功 conda --version接着执行conda init把conda基础环境写进每个用户的shell配置里不然以后每次登录还得手动sourceconda init bash这里注意一点如果你安装时用的是sudoconda init可能只对root用户生效。其他用户要使用conda要么登录后手动source /etc/profile.d/miniconda.sh要么在各自的~/.bashrc里加上路径。更好的做法是在/etc/skel/.bashrc里也写上初始化代码这样以后新建用户时shell配置会自动包含conda路径。2.3 conda加速配置更换国内镜像源服务器在国内的话一定要换conda源不换的话创建环境、安装包时速度真的能让你崩溃。网上有一堆换源教程这里给出我实际在用的.condarc配置存放在用户目录下cat ~/.condarc EOF 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 EOF这个配置对 conda-forge 和 pytorch 频道也做了镜像映射之后直接用conda install pytorch torchvision torchaudio -c pytorch时速度会快很多。特别提醒如果你用sudo执行 conda 命令~/.condarc指的是 root 用户目录下的配置。普通用户使用conda时则会读取各自的~/.condarc。所以换源要对每个实际使用环境的用户都做一遍或者直接把配置放到/etc/conda/.condarc全局路径下。2.4 创建PyTorch专用虚拟环境锁定Python版本conda装好、源也配好了接下来就是创建环境。这一步推荐隔离出一个独立的pytorch环境不要用 conda 自带的 base 环境跑项目。原因很简单base环境里你可能会装各种工具依赖一多就容易和项目依赖打架比如 base 里的OpenSSL版本变了某个老项目就编译不过去了。# 创建名为pytorch的环境指定Python版本 conda create -n pytorch python3.10 -y # 激活环境 conda activate pytorchPython版本怎么选我的经验是PyTorch 2.x 官方全面支持 Python 3.9-3.12选 3.10 或 3.11 最稳妥不要一上来就选最新的 Python 3.12哪怕官方说支持也可能有些老项目第三方库没跟上尽量不要选 EOL 的 Python 3.7 及以下现在很多包已经不提供对应版本的轮子了。另外建议在conda create时就把Python锁死后面再用conda install python3.11升级的话容易触发大量依赖重装得不偿失。激活环境后用python --version和which python确认一下应该指向/opt/miniconda3/envs/pytorch/bin/python这就说明隔离成功了。3. PyTorch安装实操CPU版还是GPU版pip还是conda环境创建好之后重头戏来了安装PyTorch。这一步的选择题很多装CPU版还是GPU版、用pip装还是conda装、加哪个--index-url、要不要单独装CUDA Toolkit。下面我一个一个拆开讲。3.1 区分CPU版与GPU版避免白忙一场先明确一个最常见的误区pip install torch默认安装的是哪个版本在没有额外指定--index-url的情况下PyPI 上的torch包默认是包含 CUDA 支持的也就是说装下来的是GPU版。但在某些平台或某些特殊索引源上默认可能变成CPU版。怎么确认装的是CPU版还是GPU版方法很简单进入环境后跑一句python -c import torch; print(torch.__version__); print(torch.cuda.is_available())如果输出类似2.1.0cu121说明是带CUDA的GPU版如果输出2.1.0cpu或根本没有cu后缀说明装的是CPU版。再配合torch.cuda.is_available()返回TrueGPU版并且能正常识别到显卡返回False要么装成了CPU版要么驱动/版本不匹配。如果你的服务器只是用来做数据处理、普通模型推理或者没有NVIDIA显卡那直接用CPU版就行省心还不占空间。但正常训练模型的话CPU版跑起来会让人怀疑人生一定得用GPU版。3.2 PyTorch官网安装命令的隐藏信息量打开 PyTorch 官网pytorch.org首页会给你一个命令生成器选择你的系统、包管理器、CUDA版本自动生成安装命令。界面示例pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121很多人直接复制这条命令去装装完也能用但这里有几个细节值得注意--index-url指定的是 PyTorch 官方 wheel 源不是默认的 PyPI。cu121表示这个源上都是 CUDA 12.1 对应版本的包torchvision是视觉库torchaudio是音频库。如果你只做CV可以不装 torchaudio只做NLP也可以只装 torch 一个包。按需安装能省不少磁盘空间cu121中的版本号要和nvidia-smi显示的驱动CUDA版本对应起来。比如驱动显示CUDA Version: 12.1那选cu121或cu118都能用如果驱动只支持到 11.4那官网生成的默认命令大概率装完跑不起来。3.3 为什么我更推荐用pip而不是conda装PyTorch网上很多教程让用conda install pytorch torchvision torchaudio -c pytorch我一开始也是这么干的后来踩过几次坑现在统一改用pip。原因主要有三个第一版本同步速度。PyTorch 出新版的速度非常快pip 的 PyPI 源基本当天就能跟上但 conda 频道经常慢半拍有时候一两个星期过去conda上的torch还是旧版本。第二依赖控制更清晰。conda 安装 big packages 时需要做 SAT solver 依赖解析经常会为了一个不相关的依赖把整个环境的包升降级有时候还把Python版本给带偏了。pip 的行为相对简单直接基本是“缺什么装什么”很少出现那种装完一堆东西之后环境被改得面目全非的情况。第三国内下载速度。pip 可以直接指定镜像源比如用清华源或阿里源速度远比 conda 从官方频道拉包快。特别是 PyTorch 和 torchvision 这种几个GB的大包用pip配镜像源基本能拉满带宽。给出一份我实际用的安装命令直接把 CUDA 版本和镜像源都指定好# 激活环境 conda activate pytorch # 用清华源安装PyTorch 2.1.0 CUDA 12.1GPU版 pip install torch2.1.0 torchvision0.16.0 torchaudio2.1.0 \ --index-url https://download.pytorch.org/whl/cu121 \ --extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple解释一下--index-url指定 PyTorch 官方源确保拿到的是带CUDA的GPU包--extra-index-url加上清华源是为了让 torch 的依赖比如 numpy、pillow、sympy 这些能快速下载。如果不用--extra-index-url你会发现主包下载飞快但依赖包去官方源一个个拉慢得离谱。如果服务器没有外网访问条件某些内网环境你需要提前在同事电脑上把.whl文件下载好再传到服务器上用pip install /path/to/torch.whl离线安装。这种方式我试过很多次只要版本选对效果和在线装完全一样。3.4 安装完成后进行实用验证装完不要急着欢呼先把验证跑一遍。我一般会用一条命令字符串一起测python - EOF import torch print(PyTorch 版本:, torch.__version__) print(CUDA 是否可用:, torch.cuda.is_available()) if torch.cuda.is_available(): print(GPU 名称:, torch.cuda.get_device_name(0)) print(当前显存使用:, torch.cuda.memory_allocated() / 1024**2, MB) x torch.rand(3, 3).cuda() y torch.rand(3, 3).cuda() print(GPU 矩阵运算结果:, x y) EOF如果输出中 CUDA 可用并且矩阵运算没有报错说明 PyTorch 的 GPU 链路已经通了。另外建议再用nvidia-smi实时看一眼进程的显存占用确认程序真的把显存用起来了。很多时候torch.cuda.is_available()返回 True但实际没跑在GPU上一查发现是环境变量没配好这种情况我在后面问题排查章节细说。4. 远离开发困境VSCode远程开发与Jupyter Lab的服务器连接PyTorch 环境配好了接下来就是日常开发。服务器上直接在终端里跑python train.py当然可以但你要调试代码、查看变量、可视化数据总不可能在纯命令行里硬凑。这里推荐两种主流方式VSCode Remote SSH 和 Jupyter Lab。4.1 VSCode Remote SSH打造本地写码远端训练的工作流VSCode 的 Remote-SSH 扩展是现在服务器开发的事实标准。安装方法本地VSCode装好Remote - SSH扩展后按CtrlShiftP打开命令面板输入Remote-SSH: Connect to Host填入你服务器的SSH连接信息比如ssh user192.168.1.100回车即可登录。第一次连接后VSCode 会在服务器上自动安装一个 server 端组件。如果服务器是内网环境可能下不动这个组件这时候需要在本地下载 VSCode Server 压缩包手动传到服务器指定目录解压具体路径是~/.vscode-server/bin/commit-id/。这个问题在网络受限环境时很常见手动传一次后续就不用了。连接之后最关键的一步是让 VSCode 使用 conda 里的 Python 解释器。打开一个.py文件按CtrlShiftP选择Python: Select Interpreter然后选/opt/miniconda3/envs/pytorch/bin/python即可。选完之后调试、代码补全、终端激活环境都会自动使用正确解释器。再说说免密登录这个对体验影响很大。每次输密码虽然不麻烦但频繁重连的时候很烦。配置方式# 本地生成密钥没有的话先执行 ssh-keygen -t rsa -b 4096 # 把公钥拷贝到服务器让服务器端信任你 ssh-copy-id user192.168.1.100执行完上述操作之后再连接服务器就不用输密码了。同时你还可以在VSCode的配置文件~/.ssh/config里给服务器起个简短别名Host my_server HostName 192.168.1.100 User admin Port 22之后连接时直接输my_server就行不用记IP、用户名和端口。4.2 Jupyter Lab的远程启动与访问密码配置VSCode 适合写完整项目但遇到需要看着数据可视化边改边跑的活儿Jupyter Lab 更顺手。在 conda 环境里装好 Jupyter 后启动时注意几个关键参数conda activate pytorch # 生成jupyter配置文件首次运行 jupyter lab --generate-config # 设置访问密码会写入~/.jupyter/jupyter_server_config.json jupyter server password然后修改配置文件~/.jupyter/jupyter_server_config.pyc.ServerApp.ip 0.0.0.0 # 允许所有IP访问按需修改 c.ServerApp.port 8888 c.ServerApp.open_browser False c.ServerApp.allow_remote_access True启动jupyter lab --no-browser本地浏览器打开http://服务器IP:8888输入之前设置的密码就能进入。这里有个安全提醒允许远程访问后等于给服务器开了一个明文端口建议使用密码加密并且不要把端口暴露到公网。如果你在云服务器上记得在安全组里限制访问来源IP只放行你自己的IP。4.3 多用户场景下的conda环境共享与权限管理服务器不像个人电脑经常有多个人一起用。有时候我用pytorch环境同事也用但大家装包的习惯不一样容易把环境搞乱。我比较推荐的做法是让管理员统一创建环境并安装基础依赖普通用户只通过conda activate使用不轻易往里装新包如果确实需要装新包优先在当前项目目录用pip install --user或者单独建环境避免污染公共环境。另外多个用户使用同一个 conda 安装目录时如果都用同一个pytorch环境有个注意点conda环境的写权限归属于创建者。如果普通用户想往公共环境里装包得让管理员用conda run -n pytorch pip install xxx执行或者给环境目录设置用户组写权限# 给pytorch环境目录递归设置用户组写权限 sudo chgrp -R developers /opt/miniconda3/envs/pytorch sudo chmod -R gw /opt/miniconda3/envs/pytorch这样developers组的成员就能共同维护这个环境了。如果只想让少数几个特定用户有权修改也可以把developers组替换成实际的用户组或用户名。5. 常见问题与排查技巧实录从驱动到环境变量逐个击破这部分内容是我在配置各种 Linux 服务器过程中积攒下来的问题清单基本覆盖 80% 以上的踩坑场景。遇到报错时建议按下面思路一步步排查而不是盲目卸载重装。5.1 import torch 报 libtorch_cuda.so 错误这是一个非常典型的问题报错信息大概长这样ImportError: libtorch_cuda.so: cannot open shared object file: No such file or directory出现这个问题的原因通常有两种你装的是 GPU 版 PyTorch但系统的动态库加载路径里找不到 PyTorch 自带的.so文件某些系统库的版本和 PyTorch 自带的库不兼容。排查第一步用ldd查看 torch 扩展模块依赖了哪些动态库python -c import torch; print(torch.__file__) # 进入torch安装目录找到lib目录 ldd /opt/miniconda3/envs/pytorch/lib/python3.10/site-packages/torch/lib/libtorch_cuda.so | grep not found如果看到一堆not found很大概率是系统缺少某些CUDA相关的库或者路径没有正确包含。这时检查环境变量echo $LD_LIBRARY_PATH如果为空把 CUDA 库路径补上试试export LD_LIBRARY_PATH/opt/miniconda3/envs/pytorch/lib/python3.10/site-packages/torch/lib:$LD_LIBRARY_PATH如果这样能解决那就把这条加到~/.bashrc里。但注意如果是正常通过conda环境跑一般不需要手动设LD_LIBRARY_PATH设了反而可能干扰其他软件。这个解法只是临时手段。5.2 torch.cuda.is_available() 返回 False 的最全排查看板这个问题的原因不像上面那么直接我把可能的原因按频率排序排查项检查方法解决思路驱动没装好nvidia-smi是否正常输出重新安装驱动PyTorch装成CPU版torch.__version__是否带cu后缀重新用GPU源安装CUDA版本超出驱动支持对比驱动支持版本和PyTorch的cu版本降低PyTorch版本或升级驱动当前shell环境变量没生效新开终端测试source ~/.bashrc或重登系统路径残留老版本库echo $LD_LIBRARY_PATH有无关项清空或修正环境变量其中有个很容易忽略的坑你明明之前装过 CPU 版的 torch后来用 pip 安装了 GPU 版结果pip install torch时发现“已安装”而不重新覆盖。这种时候进程列出已安装版本强制重新安装pip list | grep torch pip install --force-reinstall torch2.1.0 --index-url https://download.pytorch.org/whl/cu121另一类坑是 conda 环境恢复了旧状态。如果你用了conda install装东西conda 可能会把 torch 回滚到 CPU 版本因为 conda 在解析依赖时会重新评估所有包版本很有可能在某个步骤悄悄把包版本变掉。所以装完 PyTorch 后如果再用 conda 安装其他库建议装完后再验证一次torch.cuda.is_available()我踩过好几次这种坑。5.3 网络下载慢或者超时的应对策略服务器在国内的话直接从 PyPI 或者 PyTorch 官方源下载大包速度随缘还经常超时。没有好网络环境的时候我的办法有三个第一pip 使用清华源或者阿里源作为主要下载源pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set global.extra-index-url https://download.pytorch.org/whl/cu121这样 pip 默认走清华源同时保留 PyTorch 官方源作为补充。不过要注意如果两个源里存在同名包pip 有可能会从任意一个源拉取这会导致 GPU 版和 CPU 版混用。稳妥做法还是前面提过的安装 torch 主包时用--index-url显式指定官方源其他依赖走镜像。第二使用wget提前下载 wheel 包再本地安装。比如想装 torch 2.1.0 cu121先用迅雷或者其他下载工具把对应的.whl文件拉下来再在服务器上执行pip install ./torch-2.1.0cu121-cp310-cp310-linux_x86_64.whl这种方法最适合大包。我每次搭环境都习惯先把包下载好再传到服务器装避免反复超时。第三如果是在虚拟环境里遇到Collecting torch卡住不动有些情况不是网速问题而是 DNS 解析慢。可以临时指定使用公共 DNSsudo vim /etc/resolv.conf # 添加 nameserver 223.5.5.55.4 conda init 后 shell 仍不识别 conda 命令有时候装完 conda却提示conda: command not found。最常见原因是安装时用了sudo -s切换到 root但 conda 初始化写入的是 root 的.bashrc其他用户没有执行路径。排查流程# 确认conda是否真的装好 ls /opt/miniconda3/bin/conda # 手动执行一次 /opt/miniconda3/bin/conda --version # 如果正常补上环境变量 echo export PATH/opt/miniconda3/bin:$PATH ~/.bashrc source ~/.bashrc另外conda init默认只对当前 shell 用户的 rc 文件生效。如果是新创建的用户需要复制/etc/skel里的配置或者在新用户 shell 里手动执行conda init bash。这点在多用户服务器上特别要注意。5.5 显存不足与多进程冲突不要全赖在环境头上环境配好之后开始跑程序报CUDA out of memory或者RuntimeError: CUDA error: out of memory很多人第一反应是“显存不够”。确实如果模型很大、显存很小那是硬伤。但很多时候是你忘了释放之前的显存或者多个进程同时占用了同一块卡。排查方法# 查看当前哪些进程在占用GPU nvidia-smi # 查看具体是哪个python进程占了显存 fuser -v /dev/nvidia*如果是自己之前的残留进程直接kill掉。如果多人共用服务器最好在代码里指定用哪张卡CUDA_VISIBLE_DEVICES0 python train.py这样即使旁边的人把你的两张卡都占了你只要指定空闲的卡就不会互相影响。也可以在代码开头写import os os.environ[CUDA_VISIBLE_DEVICES] 0,1 # 指定使用第0、1号GPU另外还有一个常见的“坑”就是 PyTorch 的缓存机制。即使程序退出某些情况下显存不会立刻释放尤其是有 CUDA 异步操作时。这时候过几分钟再nvidia-smi看看或者直接重启一下相关服务能解决很多奇怪的问题。5.6 cuDNN相关的启动报错报错信息类似RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED这个一般有三个原因GPU驱动版本过旧和 cuDNN 要求不匹配PyTorch 自带的 cuDNN 和驱动冲突系统里手动安装了旧版 cuDNN污染了环境。前面说过正常用 pip 安装的 PyTorch 自带 cuDNN不需要单独装。如果你曾经给系统手动装过 cuDNN建议检查一下/usr/local/cuda里的版本必要时用 conda 环境变量把库路径强制指向 conda 环境内的版本。如果还是不行就升级 NVIDIA 驱动到官方要求的最低版本。我遇到过一次特别诡异的情况同一份代码在A服务器驱动535上跑正常在B服务器驱动470上报 cuDNN 错误最后排查发现B服务器驱动版本太老PyTorch 2.1 自带的 cuDNN 需要新驱动支持。解决办法很简单升级驱动到535以上或者把 PyTorch 换成老版本。遇到跨服务器的环境迁移问题时最好先看一眼两台机器的驱动版本能省很多排查功夫。6. 关于环境迁移与复现把conda环境固定成可交付的状态环境配好、代码能跑了这只是第一步。过两个月后再来一个新同事或者换一台训练机器总不能让人家再从头踩一遍坑吧所以环境和依赖的“可复现性”非常重要这里分享几个实用做法。6.1 用environment.yml与requirements.txt双重固定PyTorch 相关项目通常用两个文件同时管理依赖第一个是 conda 环境的environment.yml记录主要依赖和 Python 版本name: pytorch channels: - defaults dependencies: - python3.10 - pip - pip: - torch2.1.0 - torchvision0.16.0 - torchaudio2.1.0 - numpy - pandas - scikit-learn创建环境时conda env create -f environment.yml第二个是精确到哈希的requirements.txt方便在别人已有 conda 环境里精确恢复版本pip freeze requirements.txt恢复pip install -r requirements.txtpip freeze会把所有依赖及其精确版本记录下来甚至包括一些通过镜像源安装的包。这个文件基本能做到“还原现场”。6.2 conda-pack打包整个环境离线迁移有时候目标机器没有外网连镜像源都访问不到环境文件装不了。这种场景我推荐用conda-pack把整个环境压缩成一个压缩包拷贝过去直接解压就能用。使用方法# 源机器上 conda install conda-pack -c conda-forge conda pack -n pytorch -o pytorch_env.tar.gz # 拷贝到目标机器解压后直接作为python目录使用 mkdir -p /opt/pytorch_env tar -xzf pytorch_env.tar.gz -C /opt/pytorch_env source /opt/pytorch_env/bin/activate这里注意conda-pack 打包的是 Python 环境和相关库不包含 NVIDIA 驱动。目标机器的驱动和 CUDA 版本仍然要满足 PyTorch 的要求。所以迁移完之后第一件事还是跑一遍分快验证确定torch.cuda.is_available()正常。6.3 定时备份环境清单让团队环境随时可重建我个人的习惯是每次给项目配好环境之后立即把以下三样东西保存到项目仓库里environment.ymlrequirements.txt一段简短的 README写清楚服务器驱动版本、CUDA 版本、conda 环境名这样任何人拿到项目代码先按 README 里的说明配环境十几分钟就能复现不用再猜“之前用的哪个版本”。团队协作时这算是省心省力的基础操作。7. 写在最后的几条实用经验PyTorch 环境配置这件事说难不难说简单也不简单。折腾过几十次之后我形成了一套固定的操作顺序这里分享给大家第一不要贪新。新版本的 PyTorch、新版本的 Python、新版本的CUDA看起来很美但你可能要花大量时间填别人踩过的坑。服务器是拿来跑实验的不是拿来追新版本的。稳定优先等新版本过了半年、大家用的人都多了再考虑升级。第二配置文件做好注释。.condarc、~/.bashrc、jupyter_server_config.py这些文件建议把关键配置项后面的作用写清楚。不然三个月后你自己回来看完全想不起来当时为什么这么写。第三装完环境立刻验证别攒到项目启动才跑。每次装完 PyTorch哪怕只是执行一句python -c import torch; print(torch.cuda.is_available())也能把80%的问题提前暴露出来。我见过太多人装完直接开训练跑了半天才报CUDA错误白等。第四服务器上尽量少用 root 跑日常训练。创建一个普通用户让代码和文件都属于普通用户能避免很多误操作。如果真的要装系统级软件用 sudo 临时提权就够了。最后分享一个我自己的小习惯每次配完环境都会在项目根目录放一个check_env.sh内容就是打印torch版本、CUDA是否可用、GPU卡号、驱动信息。后期如果遇到“为什么我的训练变慢了”“为什么某天开始就报错”这种问题先跑一遍这个脚本很多环境变更都能快速发现。配置环境不算难但把它配得明明白白、可维护可复制才是真正给后面的工作省时间。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →