我们直接进入正题。这段时间总有朋友在后台问我,自己在本地电脑上跑深度学习代码时一切正常,一放到Linux服务器上就各种报错,不是缺依赖就是版本对不上,折腾一晚上环境还没搭好。其实Linux服务器上的PyTorch环境配置没有想象中那么玄乎,核心就是理清驱动、CUDA、Python环境和PyTorch这几层的关系。这篇文章我就把自己平时在服务器上配置PyTorch环境的完整流程和踩过的坑整理出来,从最基础的硬件检测开始,到conda环境隔离,再到PyTorch的安装和验证,每一步都给出具体命令和判断依据,希望能帮你少走一些弯路。
这套配置流程适用于大多数深度学习场景,无论是跑CV模型、NLP模型,还是自己搭Transformer做实验,都是一样的套路。如果你是刚接触Linux服务器的学生,或者是从Windows转到Linux开发的工程师,这篇文章应该能帮你建立起一套清晰的环境配置思路。就算你已经配过好几次环境,也可以看看里面关于版本匹配和故障排查的部分,说不定能解决你之前没想明白的疑惑。
1. 环境配置前的核心思考
配置PyTorch环境之前,我建议你先花几分钟想清楚三件事:你这台服务器有没有NVIDIA显卡,准备用conda还是virtualenv做环境隔离,以及PyTorch官方版本和你机器上CUDA版本怎么对应。这三件事想明白了,后面所有命令基本都是机械操作。
1.1 先搞清楚你的服务器配置
很多人在配置环境时第一个错误就是把服务器当成一台普通电脑,上来就装PyTorch,装完跑代码才发现没有GPU可用。所以在动手之前,先执行下面这些命令,把机器的家底摸清楚。
查看CPU和内存信息用lscpu和free -h,这两条命令能让你对机器的算力有个基本概念。查看操作系统版本用cat /etc/os-release,这个信息决定了你后面用apt还是yum装依赖。最关键的是查看GPU信息,执行nvidia-smi。如果提示command not found,说明你还没装NVIDIA驱动,或者这台机器压根没有NVIDIA显卡。
还有一种是特殊情况,就是云服务器厂商提供的深度学习镜像。这类镜像通常已经把驱动、CUDA、cuDNN都预装好了,你只需要验证一下版本即可,没必要自己重新折腾一遍驱动。我见过有同事在云服务器上手动重装NVIDIA驱动,结果把镜像自带的驱动搞坏了,最后只能重置系统,白白浪费了大半天时间。
1.2 理解CUDA、cuDNN和PyTorch的版本匹配关系
这一块是整个环境配置中最容易出问题的地方,我把这三者的关系捋清楚。
CUDA是NVIDIA提供的并行计算平台,是运行在驱动之上的。cuDNN是基于CUDA的深度学习加速库,专门为卷积神经网络、循环神经网络这类计算做了深度优化。PyTorch在编译时就需要指定一个CUDA版本,编译出来的库文件会在运行时调用对应的CUDA接口。
这里有个关键点:PyTorch官方预编译包的命名方式,比如cu118、cu121、cu124,这里的数字分别对应CUDA 11.8、12.1和12.4。你不需要精确匹配机器上的CUDA版本,只要PyTorch要求的CUDA版本不高于你机器上驱动的最高支持版本即可。
为什么说“不高于”就行?因为PyTorch的预编译包会自带一份CUDA运行时的库文件,它运行的时候用的是自带的这些库,而不是系统目录里的CUDA。这就是为什么有人的机器上根本没装CUDA,只装了NVIDIA驱动,PyTorch也能用GPU跑。这个机制理解清楚了,很多报错就能自己排查了。当然,如果你需要自己动手编译CUDA扩展,比如装一些需要编译的第三方库,那还是建议把完整版CUDA Toolkit装上,因为编译时需要头文件和相关工具链。
1.3 为什么推荐用conda做环境隔离
Python项目最痛苦的事情就是依赖冲突,这个项目要PyTorch 2.0,那个项目要PyTorch 1.8,还有的项目要TensorFlow,三个项目装在同一个Python环境里等着互相打架,光是处理依赖就能劝退不少人。
conda的核心理念就是环境隔离。每个环境就像一间独立的小房间,房间里的Python版本、pip包、conda包都互不干扰。你需要哪个环境就激活哪个环境,不需要了就整个删掉,不会影响其他项目的运行。相比virtualenv,conda还能管理Python解释器本身和CUDA相关的库,这就是它在深度学习社区里这么流行的原因。
我建议装Miniconda而不是Anaconda,因为Anaconda自带的那些预装包和IDE工具大多数用不上,白白占了好几个G的磁盘空间。Miniconda才是真正的最小化版本,只有conda和Python,需要什么包自己再装。
2. 一步步搭建PyTorch环境
前面的准备工作做完了,现在开始正式搭建环境。整个过程分四步:下载安装Miniconda、创建独立的conda环境、安装PyTorch、验证环境可用。每一步我都会给出具体命令和判断结果的方法。
2.1 安装Miniconda
先去清华源下载Miniconda的安装脚本,比直接从官网下载快很多。选最新版本就好,注意区分操作系统架构,一般服务器都是Linux x86_64架构。
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh如果你不确定服务器的架构,执行uname -m查看结果,x86_64就是64位标准架构,aarch64就是ARM架构,两条安装脚本不一样。
下载完成后,执行下面的命令开始安装:
bash Miniconda3-latest-Linux-x86_64.sh安装过程中会遇到几个提示。第一个是查看许可协议,直接按回车翻页就行。第二个是问你是否接受协议,输入yes。第三个是安装路径,默认是当前用户家目录下的miniconda3,如果你没有特殊的空间规划需求,直接回车用默认路径就好。最后一个是问你是否要把conda初始化写入shell配置,这里建议输入yes,这样每次打开终端就能直接使用conda命令了。
安装完成后,执行source ~/.bashrc让配置立即生效,然后执行conda --version验证是否安装成功。如果提示找不到命令,检查一下~/.bashrc或者~/.zshrc文件里是否包含conda的初始化代码,找到类似__conda_setup=的段落,手动执行一下这段代码即可。
2.2 配置conda国内源
国内连接Anaconda官方源非常慢,有时候下载一个包要等好几分钟,甚至直接超时。建议先把源切换成清华源,速度会有质的提升。
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这里需要提醒一下,清华源到2023年之后已经停止对Anaconda官方源的镜像同步,保留的是pytorch等第三方源在清华的镜像。如果你发现conda装某些包时还是慢,完善一下配置文件,添加pytorch对应的镜像即可。
还有一个操作可以提高后续包安装速度,就是配置.condarc文件。执行conda config --set remote_read_timeout_secs 600,把连接超时时间从默认的几十秒延长到600秒,这样即便是网络波动比较大的时候,也不容易因为超时而安装失败。
2.3 创建并激活conda环境
先把conda自身升级到最新版本,免得到时候因为conda版本太旧出现各种各样的问题。
conda update -n base -c defaults conda然后创建PyTorch环境。我习惯给环境起一个直观的名字,比如用pytorch加上版本号,这样以后创建别的环境时不会混淆。
conda create -n pytorch python=3.10这里我推荐Python 3.10版本。PyTorch从2.0开始对Python 3.11提供了完整支持,但3.10依然是兼容性最稳妥的选择。如果你要跑一些老项目,里面用了numba、jit这些对Python版本有严格限制的库,那可能需要根据项目要求选择Python 3.8或者3.9。创建好之后激活环境:
conda activate pytorch激活后命令行的提示符前面会出现环境名。如果你发现conda activate不生效,大概率是没有执行conda init,回到2.1节把初始化补上。
2.4 在conda环境中安装PyTorch
到了最关键的一步:安装PyTorch。这里我推荐用pip而不是conda安装。为什么用pip?一个主要原因是PyTorch官方在pip上发布的预编译包更新更快,版本选择更多,而且pip对依赖的处理方式更直接。另一个原因是,用conda安装PyTorch时,conda会自动分析依赖关系,这个过程在处理大型依赖树时可能会非常慢,甚至进入无限求解的卡顿状态。
安装前需要明确你的目标CUDA版本。打开PyTorch官网的Get Started页面,选择你的操作系统、安装方式、CUDA版本,页面会生成对应的安装命令。这个页面的版本信息持续更新,比任何第三方教程都实时。
以我现在在用的环境为例,服务器驱动支持CUDA 12.1,我执行的是:
pip install torch torchvision torchaudio默认安装的PyTorch 2.4及其之后的版本,不需要你再指定--index-url,因为PyTorch官方已经把默认的PyPI源切换到了CUDA 12.x的版本,直接安装就绑定了CUDA 12.4运行时。如果你的驱动比较老,只支持CUDA 11.8,那就得指定老的安装源:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118这里顺便说明一下怎么看驱动支持的最高CUDA版本。执行nvidia-smi后,输出内容右上角会有一行CUDA Version字样,这个数字表示你的驱动最高能支持的CUDA版本。只要PyTorch要求的CUDA版本小于或等于这个数字,基本上就可以正常工作。比如驱动显示的CUDA Version是11.8,那你就只能装cu118的包,不能装cu121。
如果要装特定版本的PyTorch,指定版本号安装即可:
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118这里提醒一句:torch、torchvision、torchaudio三者的版本号是有对应关系的。PyTorch 2.0.1对应的torchvision是0.15.2、torchaudio是2.0.2,版本配对错误会出现类似ModuleNotFoundError: No module named 'torchvision'之类的报错,或者运行时报函数签名不匹配的错误。建议安装时仔细检查版本配对关系。
2.5 验证PyTorch是否安装成功
配置好环境之后,验证这一步千万不能省。我见过不少人装完PyTorch就直接跑训练脚本,遇到报错还以为是代码问题,排查半天才发现是环境没配好。
在终端执行:
python -c "import torch; print(torch.__version__)"如果能正常输出版本号,比如2.4.0+cu124,说明PyTorch基础库导入成功。
然后测试CUDA是否可用:
python -c "import torch; print(torch.cuda.is_available())"输出True说明GPU已经被PyTorch识别并支持CUDA运算。输出False的话,绝大多数情况是版本不匹配或者驱动问题,具体排查方法看第4节。
最后再测试一下GPU的实际计算,执行:
python -c "import torch; print(torch.randn(3,3).cuda())"正常输出一个3x3的随机数张量,说明张量已经能在GPU上正常运算,环境配置彻底完成。
3. 深入理解PyTorch环境配置的几个关键技术点
环境配置好只是第一步,理解背后的机制才能让你在后续使用中遇到问题时游刃有余。
3.1 Linux系统下Python环境的常见坑
Linux系统自带的Python是系统级的,很多系统工具和脚本都依赖它。如果你直接用系统Python来装PyTorch,会遇到两个问题:第一,pip安装包时经常报权限不足,因为系统Python的site-packages目录对普通用户不可写;第二,哪天你手滑执行了pip install --upgrade升级系统Python的关键库,可能直接搞坏系统工具。
这就是为什么强依赖虚拟环境。conda创建的环境是完全独立的一套Python体系,即使你在里面把Python升级了、删了某些系统库,宿主机的系统Python也不会受影响。这个隔离机制在多人共用的开发机上尤其重要,每个人都用自己的环境,互不影响。
3.2 PyTorch的CPU版本和GPU版本怎么选
PyTorch官方同时提供CPU版本和GPU版本。CPU版本安装包很小,只有一两百MB,纯CPU环境下可以正常运行,计算全部走CPU。GPU版本的安装包通常有两三个GB,里面捆绑了对应CUDA版本的运行时库。CPU版本和GPU版本在代码层面的用法完全一样,区别只在于性能。
如果你的服务器没有NVIDIA显卡,那直接用CPU版本就行。注意:没有NVIDIA显卡的情况下,就算你安装了GPU版本的PyTorch,执行torch.cuda.is_available()也会返回False,而且会在导入时加载一些不必要的CUDA库,浪费内存。
怎么判断自己装的PyTorch是CPU还是GPU版本?执行python -c "import torch; print(torch.version.cuda)",如果输出了CUDA版本号,说明是GPU版本;输出None的话就是CPU版本。
3.3 服务器上配置PyCharm或VSCode远程开发环境
环境配置完成之后,你大概率需要用IDE来写代码。在Linux服务器上装图形界面做开发是大忌,一是浪费宝贵的系统资源,二是远程访问体验很差。最推荐的方式是用IDE的远程开发功能,让IDE在本地展示界面,实际代码和运行都在服务器上。
PyCharm Professional和VSCode都支持SSH远程开发。以VSCode为例,安装好Remote-SSH插件后,用ssh 用户名@服务器地址连接服务器,VSCode会在服务器端安装一个轻量级的服务端组件,然后你就能像在本地写代码一样操作远程文件。选择Python解释器时,在VSCode的命令面板中选择Python: Select Interpreter,找到conda环境的Python路径,通常是在~/miniconda3/envs/pytorch/bin/python。
这里有个小技巧:VSCode连接到服务器后,默认打开的目录是用户家目录。如果你的代码项目存放在其他位置,比如/data/projects,直接用File -> Open Folder打开对应路径即可。远程开发的延迟取决于你的网络状况,如果感觉卡顿,建议优先排查网络延迟和对端服务器负载。
4. 常见问题与排查技巧实录
环境配置类的问题不像代码逻辑错误那样有明确的报错位置,很多问题都是隐性的,需要你一步步排除。这一节我把实际工作中遇到的几个典型问题整理出来,每一个都附上解决方案。
4.1 torch.cuda.is_available()返回False
这是最典型的高频问题。返回False说明PyTorch没有正确调用到CUDA接口,排查思路如下。
先用nvidia-smi确认驱动状态。如果输出的是错误提示,或者提示找不到命令,说明NVIDIA驱动没有安装。安装驱动的过程比较繁琐,不同版本的驱动安装方式不一样,这里不做展开,建议优先确认你的服务器是否有GPU,以及驱动是否已正确安装。
驱动正常的话,检查PyTorch版本和CUDA版本的匹配关系。执行python -c "import torch; print(torch.version.cuda)",看这个版本号是否在驱动支持的CUDA版本范围内。比如你的驱动支持CUDA 11.8,但PyTorch自带的CUDA是12.4,那大概率就不能用。这时候要么升级驱动,要么把PyTorch换成对应版本的包。
还有一种容易忽略的情况:当你使用conda install cudatoolkit或手动添加CUDA路径到PATH时,环境变量里的CUDA版本和PyTorch期望的版本冲突了。处理方法是删除手动设置CUDA环境变量的代码,让PyTorch直接使用自带的运行时。
4.2 pip安装PyTorch时下载速度极慢
PyTorch的GPU版本安装包动辄两三个GB,如果网络条件不好,下载时间长得让人崩溃。解决方法是使用镜像源。
这里推荐清华的PyTorch镜像:
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple如果你要用CUDA 11.8的源,写成:
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118 -i https://pypi.tuna.tsinghua.edu.cn/simple这个写法是先把默认源切换成清华源,再指定PyTorch官方索引去查找对应CUDA版本的包,实测速度能提升好几倍。如果你需要从PyTorch官方索引下载指定版本,也可以直接用pip download把包先下载到本地,再离线安装,这样能给团队共享,省去重复下载的时间。
4.3 多个conda环境之间操作串了
多人共用一台服务器时,最容易出现问题的地方是conda环境激活混乱。比如A用户在base环境安装了包,B用户激活pytorch环境却发现这个包能import进来,原因可能是B用户找不到对应的环境,直接用了base环境。
建议在终端提示符上直接显示当前激活的环境名。如果你看到命令行前面有括号,里面写的是环境名,就不会搞混。如果没有显示,执行conda env list查看当前所在环境,当前环境前面会有一个星号标记。
还有一个好习惯:在网格服务器上跑训练任务时,训练脚本里显式声明要用的conda环境。比如在提交任务的脚本里加上source activate pytorch,比手动在终端激活环境可靠得多。
4.4 服务器重启后conda环境消失
很多人在服务器上配好环境,重启系统后却发现conda命令找不到了,或者环境列表是空的,心里一慌以为自己把环境弄坏了。冷静下来,大概率是conda初始化没有写入shell配置文件。
重新执行conda init bash后,重新打开一个终端窗口(或者执行source ~/.bashrc),conda命令就恢复了。环境本身并没有丢失,存储在Miniconda安装目录下的envs文件夹里,你可以用ls ~/miniconda3/envs/查看。
这个问题的前提是,你在安装Miniconda时没有输入yes接受初始化写入。如果你确实多了这个步骤,后续可以把conda init执行一遍,再恢复。
4.5 conda create时提示PackagesNotFoundError
创建新环境时,如果指定了某个Python版本,但conda在源里找不到对应版本,会提示PackagesNotFoundError错误。原因大概率是你的conda源配置有问题,或者Python版本号写错了。
先查看当前源配置:
conda config --show channels正常会显示你在2.2节配置的镜像源。如果你觉得源有问题,把.condarc文件删掉再重新配置:
conda config --remove-key channels然后按上面的步骤重新添加源即可。还有一种情况是conda缓存了损坏的元数据,执行conda clean -a清理缓存后重试。
5. 给新人的几条实用建议
经过多次踩坑,这里我总结几条环境配置中的实用建议,不算官方文档里的标准做法,但实际操作下来非常管用。
第一,维护一个requirements.txt文件。每次配置好一个新的conda环境,把自己安装的核心依赖的精确版本记录下来,之后在其他机器上复现环境时,执行pip install -r requirements.txt就能快速装好。这个文件同时也有助于你在文档里向同事说明环境情况。
第二,不要把conda环境放在系统盘根目录。默认安装路径是用户家目录,一般没问题。如果家目录空间紧张,想放到数据盘,创建环境时用conda create -p /data/envs/pytorch python=3.10指定路径,激活时也要用conda activate /data/envs/pytorch。这是conda的定位:支持路径式环境,你可以把环境放在任何磁盘空间充裕的位置。
第三,系统升级和驱动升级要谨慎。NVIDIA驱动升级后,之前编译过的CUDA扩展可能会失效,需要重新编译。所以除非必须,驱动版本不要随意变来变去。这也是为什么很多成熟的深度学习团队会固定服务器的驱动版本和CUDA版本,制定严格的版本基线,因为这套组合一旦跑通,稳定性远大于版本追新。
第四,养成用nvidia-smi监控显卡使用情况的习惯。跑训练任务时,每隔一段时间看一眼显卡利用率和显存占用,就能及时发现问题。显卡利用率在90%以上说明计算密集,显存占用接近上限说明批次大小可能设大了,需要调低batch size。
5.1 用脚本完成环境配置的自动化
如果公司内部有多台同配置的服务器,靠人工一台台敲命令效率太低,而且容易出错。更好的做法是把环境配置过程写成一个脚本,传参指定服务器IP,脚本自动完成所有操作。
一个简单的自动化配置思路是:在本地准备好Miniconda安装脚本和PyTorch依赖包,然后用scp或者rsync把文件批量复制到服务器,再通过ssh远程执行安装命令。这种方式适合少量机器批量部署。如果你是做集群管理,有几十台甚至上百台机器,那就得考虑用Ansible这类自动化运维工具了,不过这也是后话。
5.2 经验之谈:最耗时的环节往往是网络问题
回顾我多年配置环境的经验,真正消耗大量时间的其实不是配置本身,而是网络问题。下载安装包超时、pip源连接不上、conda包解析卡住,这些问题反复出现。
我的建议是:安装Miniconda后,第一时间配置国内源和超时时间;安装PyTorch时优先用pip加镜像源;如果安装过程中卡住了,用Ctrl + C中断,记下来卡在哪个包,单独针对这个包换源安装。这种方法比死等或反复重试有效率得多。
另外,如果你所在的公司或学校有内部软件源,一定要优先用,速度比外面的任何公共源都快。我曾经在一家单位做过容器化改造,他们在内部网络架设了PyPI和conda的镜像源,所有服务器的包安装都是在几秒内完成的,这份便利值得学习。