ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

实验室服务器深度学习环境配置:PyTorch/TensorFlow与远程连接排坑指南

实验室服务器深度学习环境配置:PyTorch/TensorFlow与远程连接排坑指南 实验室服务器这个东西我接手实验室管理快三年了每年开学都能看到新同学在同一个地方栽跟头PyTorch装上跑不了GPUTensorFlow和CUDA版本对不上visdom启动后浏览器一片空白Jupyter在服务器上起了但本地死活打不开最后还有PyCharm远程连不上的连环坑。这篇文章就把我这些年处理过的实验室服务器使用问题系统整理一遍从PyTorch、TensorFlow安装到visdom可视化服务再到本地调用服务器的Jupyter和PyCharm远程连接每一步的坑和正确操作都写清楚适合所有刚进实验室、准备在公共服务器上动手跑实验的同学参考。先说个基本判断这类问题百分之八十不是玄学而是环境不一致导致的。服务器上装的驱动、CUDA版本、Python版本、包管理器任何一个环节和你的预期偏差一点后面就是连环报错。所以这篇文章的核心思路是先帮你把环境基线摸清楚再逐个击破安装和远程连接问题。1. 先搞清楚服务器环境的三件事能避开一半的坑1.1 服务器权限边界你不是一个人在战斗实验室服务器通常是多用户共享的这意味着你大概率没有root权限系统级的/usr/bin/python、系统级的pip都不是你能随便动的。很多安装问题本质上是你在没有权限的系统目录里尝试写文件被拒绝后又换了个奇怪的方式硬装最后把环境搞乱。我的建议很简单永远优先使用conda创建自己的虚拟环境。conda不需要root安装到自己的home目录下环境隔离干净删了重来也不影响别人。很多同学问我为什么我pip装个包老是Permission denied一看就是在系统目录下执行了pip install。如果是用conda环境这类权限问题基本不会出现。如果你连conda都没有先去你个人的home目录下装一个Miniconda安装的时候全选默认路径即可包管理器会自动配置到你的~/.bashrc里。装完之后重新登录conda -V能输出版本号就说明环境隔离的基础打好了。1.2 CUDA、显卡驱动、深度学习框架的三角关系很多同学把安装CUDA理解成装一个软件实际上服务器上的CUDA体系分成两层驱动层NVIDIA驱动由服务器管理员安装普通用户不能动。用nvidia-smi看到的信息属于这一层。CUDA Toolkit层包含了nvcc等编译工具和CUDA运行库可以装多个版本也可以由conda在虚拟环境内安装不需要root。PyTorch和TensorFlow运行时依赖的是驱动层和它自己打包的CUDA运行库。它们并不直接调用系统里的nvcc所以关键在于驱动版本是否支持你想要的CUDA runtime版本。用nvidia-smi看右上角的CUDA Version这里显示的其实是驱动支持的最高CUDA版本不是当前生效的版本。只要驱动支持的CUDA版本高于你想要安装的框架所要求的CUDA版本一般就能跑。举个例子nvidia-smi显示CUDA 12.2你装PyTorch的cu121或cu118版本都没问题因为驱动向下兼容。最烦的情况是旧驱动搭配新版框架比如驱动只支持CUDA 11.8你非装默认的cu124版PyTorch框架一加载CUDA就报driver version is too old。遇到这个报错不用问去装对应低CUDA的PyTorch版本。1.3 conda环境一套环境一套依赖别混装我强烈建议你为每个项目单独建一个conda环境而不是在同一个环境里既装PyTorch又装TensorFlow还装一堆别的包。跨框架的依赖冲突是真实存在的尤其是numpy和cudatoolkit这类基础库PyTorch对numpy版本有要求TensorFlow的numpy限制更严格混装之后不是你覆盖我就是我覆盖你最典型的就是numpy.core.multiarray failed to import这类诡异报错。基本操作是conda create -n myenv python3.9 conda activate myenv然后把该项目的所有依赖通过requirements文件一次性装好。如果后面发现装坏了直接conda env remove -n myenv重建五分钟就能回到干净状态比在系统环境里慢慢修复高效得多。2. PyTorch安装问题不是pip install就完事了2.1 先看驱动再选cu版本最后定安装命令PyTorch的安装命令官网会给得很清楚但问题是很多人不看官网直接pip install torch这通常会装上CPU版本或者一个和你服务器驱动不匹配的GPU版本。你装完一测torch.cuda.is_available()返回False就开始怀疑人生。正确的顺序是在服务器上执行nvidia-smi看驱动版本和它支持的CUDA版本。去PyTorch官网选择你需要的CUDA版本比如cu118、cu121、cu124。复制官网给出的pip命令在conda环境下执行。举个例子驱动支持CUDA 11.8那你应该用pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果你已经在官网选了对应版本它生成的命令里会带上--index-url不要自己改。安装完成后用三行代码验收import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))第一行确认版本第二行返回True说明检测到显卡第三行能看到你的显卡型号。这三行都正常PyTorch的GPU支持就算通了。2.2 下载慢、超时中断的问题怎么破实验室网络环境经常不稳定从官方源下载几个GB的PyTorch包跑到一半断掉是家常便饭。pip默认遇到超时会直接失败所以建议加长超时时间并开启重试pip install --timeout 120 --retries 5 torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118如果网络实在太差可以试试先下载whl文件到本地再用pip安装。找到对应版本和平台的wheel文件下载完成后执行pip install ./torch-xxx.whl这种方法不依赖网络持续稳定断了就重新下。另外pip下载的缓存在~/.cache/pip同一个包你已经下过一次没装成功第二次安装会直接用缓存速度会快很多。如果你想强制重新下载可以加--no-cache-dir但通常没必要。2.3 装完跑不起来先看这五个常见报错我遇到过太多次明明装好了但就是不能用把最常见的几个报错和解决办法列成表你们可以对照自查。报错信息原因解决方案ModuleNotFoundError: No module named torch包没装进当前环境检查conda环境和pip对应关系torch.cuda.is_available()为False装成CPU版本或驱动不支持卸载后按CUDA版本重装CUDA driver version is too old驱动版本太低装对应低CUDA版的PyTorchlibcudnn.so.8: cannot open shared object filecuDNN版本不匹配用官网命令重装或安装对应cudnnOutOfMemoryError显存不足减小batch size或模型规模其中第一个坑最隐蔽。你在conda环境里执行pip install但实际安装到了base环境或系统环境这是因为pip命令被别名指向了其他地方。遇到这个情况检查which pip确认是不是指向了你当前环境的bin目录。用python -m pip install这种写法可以绕开路径混乱问题。3. TensorFlow安装的坑版本对齐比想象中难3.1 TensorFlow 2.x的CUDA要求官方说了算TensorFlow对CUDA和cuDNN的版本要求比PyTorch严格得多。PyTorch把CUDA运行库打包进wheel安装包装完基本能跑TensorFlow则是运行时动态加载系统的CUDA库版本不匹配直接给一长串warning然后告诉你Could not load dynamic library libcudnn.so.8。如果你用conda装TensorFlow最简单的办法是让conda自动解决依赖。在conda环境中执行conda install tensorflow-gpuconda会帮你装好匹配的cudatoolkit和cudnn。如果你坚持用pip那就必须严格对照官方表。比如TensorFlow 2.10.0官方对应的是CUDA 11.2和cuDNN 8.1。TensorFlow从2.11开始Linux版的pip包默认不带GPU支持了需要装tensorflow[and-cuda]这个版本别搞混了。3.2 和PyTorch共存时的依赖冲突别头铁我在第一节提过强烈建议PyTorch和TensorFlow分环境装。这里再补充一个真实场景如果非要在同一环境装两个框架最常见的冲突点是numpy。TensorFlow 2.10要求numpy1.24某个小版本而PyTorch 2.x可能要求更高的numpy。一旦numpy被更新TensorFlow直接报numpy.AxisError之类的问题。遇到这种情况不要试图手动锁定一个numpy版本去满足两边因为根本锁不住。最干净的操作是conda create -n tf_env python3.9 conda create -n torch_env python3.9两个环境各自独立使用的时候conda activate切换互不干扰。磁盘占用多几个GB但换来的是心平气和。3.3 从报错信息快速定位三分靠猜七分靠查TensorFlow的报错信息长但关键信息往往在最后几行。一个常见的错误模式是长长的DNN library is missing这基本就是cuDNN没找到。另一种是tf.test.is_gpu_available()返回False需要先跑一下诊断import tensorflow as tf print(tf.config.list_physical_devices(GPU))如果列表是空的接着执行ldconfig -p | grep libcudnn看看服务器上装了哪些cuDNN版本。没有输出说明系统层没有cuDNN。如果是conda环境执行conda list | grep cudnn看环境内是否包含cuDNN。这两步查下来问题出在哪一层就清楚了。4. Visdom安装后打不开可视化服务的前世今生4.1 visdom的正确启动方式很多人第一步就错了visdom是Facebook开源的深度学习可视化工具在PyTorch社区很流行。它由两部分组成Python客户端和Web服务端。你安装完pip install visdom之后必须单独启动一个服务进程浏览器才能看到可视化面板。很多人装完直接跑训练代码然后浏览器访问http://localhost:8097看到空白或者连不上就开始怀疑安装有问题。正确启动方式是在服务器上执行python -m visdom.server默认监听8097端口。看到输出Its Alive!之类的信息就说明服务启动成功了。这时候再访问http://服务器IP:8097就能看到visdom的Web界面。注意要访问服务器的IP不是localhost除非你就在服务器本机操作。4.2 启动报错与端口占用最常见的两个故障visdom启动时最常见的报错是端口被占用。你可以用netstat -tlnp | grep 8097查看端口占用情况如果有进程占了换个端口启动python -m visdom.server -port 8098然后你的客户端代码里也要对应修改import visdom vis visdom.Visdom(port8098)另一个高频报错是ConnectionRefusedError这通常是服务端没有成功启动。有时和网络代理冲突有关项目里如果设了HTTP_PROXY之类的环境变量容易干扰本地回环连接可以试试unset HTTP_PROXY HTTPS_PROXY python -m visdom.server4.3 visdom的替代方案与迁移建议visdom本身已经维护不太活跃如果你是新项目我建议考虑替代方案。TensorBoard其实也能看PyTorch的指标曲线配合torch.utils.tensorboard体验更稳定。另一个好用的工具是wandb云端记录训练曲线不需要自己维护服务团队协作方便。如果只是偶尔看个损失曲线matplotlib直接画图存文件也比启动一个服务省事得多。当然如果你确实需要用visdom上面的启动方法足够应对。记着一点visdom的服务端进程要一直开着训练脚本里的客户端负责往服务端推数据两者分开理解问题就少一半。5. 本地浏览器远程调用服务器JupyterSSH隧道与端口映射5.1 远程访问Jupyter的原理一张白纸说清楚服务器上的Jupyter默认监听8888端口但服务器的8888端口通常不对公网开放。你需要做的是把服务器的8888端口搬到本地电脑上然后访问http://localhost:8888数据会通过SSH加密通道传送。这就是SSH隧道也叫端口转发是实验室远程访问Jupyter最标准的方式安全系数高配置也简单。5.2 一条命令搞定临时隧道在本地电脑上执行ssh -L 8888:localhost:8888 your_usernameserver_ip这条命令的含义是把本地的8888端口通过SSH连接映射到服务器的localhost:8888。执行后会登录到服务器你先正常执行jupyter notebook --port8888 --no-browser启动Jupyter然后保持这个SSH会话不要关闭。另开一个本地浏览器访问http://localhost:8888就能看到Jupyter界面。如果你想免去每次输密码的麻烦把本地公钥加到服务器的~/.ssh/authorized_keys中。这样后面的SSH连接都不用输密码隧道命令体验顺畅很多。5.3 用~/.ssh/config固化配置一条别名走天下如果你每次都敲一长串SSH命令很容易腻。更优雅的做法是在本地~/.ssh/config里写一个配置段Host labserver HostName 192.168.1.100 User your_username Port 22 LocalForward 8888 localhost:8888配置好之后本地终端只要执行ssh labserver就会自动建立隧道并登录服务器。然后服务器上照常启动Jupyter本地访问localhost:8888就能用。这种方式的额外好处是你在公司或宿舍都能用同一个别名连接IP变了就改一下配置文件。5.4 Jupyter的token与密码问题新版Jupyter启动时会给一个token你需要在浏览器里粘贴token才能登录。如果觉得麻烦可以先在服务器上设置密码jupyter notebook password设置完成后Jupyter会使用密码登录本地访问时直接输入密码就行。另外Jupyter默认只允许本机访问如果你通过SSH隧道访问这个限制完全没问题因为隧道在本地看来就是本机访问。还要提醒一点不要在服务器上直接执行jupyter notebook --ip0.0.0.0来开放所有IP访问除非你非常清楚自己在做什么。实验室公共网络环境下裸奔式开放的Jupyter容易被扫描器盯上轻则挖矿重则数据泄露。SSH隧道是安全性和便利性最均衡的方案。6. PyCharm远程连接服务器把编辑器搬进服务器环境6.1 远程解释器配置三分钟搞定代码编写与运行PyCharm Professional版本支持远程解释器功能可以在本地写代码、本地调试实际运行在服务器环境。个人我用这个功能很久了配合前面说的conda虚拟环境体验接近本地开发。配置路径是Settings - Project - Python Interpreter - Add Interpreter - On SSH。填写服务器的IP、用户名、密码后下一步会让你选择远程Python解释器路径。如果你用的是conda环境比如环境名是myenv解释器路径一般是~/miniconda3/envs/myenv/bin/python选好后PyCharm会扫描远程环境中的包并在本地显示。你可以直接在本地新建Python文件选好解释器后运行进程实际是在服务器上跑的。代码可以同步到服务器的某个目录比如~/projects/myproject。6.2 文件同步与路径映射别让代码和可执行文件分家远程解释器默认会把本地项目文件上传到服务器某目录但如果你远程目录和本地目录结构不一致会导致ModuleNotFoundError。我建议把远程目录设置成和本地项目一致的相对路径。比如本地项目是D:/myproject远程就设成~/myproject两边目录层级一致import就很少出问题。在映射配置里PyCharm有一项Deployment你可以选择自动上传或手动上传。我习惯用自动上传模式这样本地保存一次远程文件就更新一次省心。6.3 调试器、终端和环境变量的联动PyCharm远程调试的体验接近本地你可以打断点、单步执行、查看变量值关键是远程解释器必须有pydevd-pycharm这个包这个包一般在你连接解释器时PyCharm会自动安装到远程环境。还有一个容易忽略的点远程环境的环境变量。比如你的训练脚本要读取数据集的路径这个路径是服务器上的绝对路径而你在本地运行调试时PyCharm会把当前工作目录切换为远程项目目录这时候相对路径其实不太可靠。我建议所有涉及文件路径的地方都用绝对路径或者从环境变量读取避免本地和服务器之间来回踩坑。6.4 连接失败的排查清单PyCharm远程连接失败的报错通常比较直白但原因多种多样。我按经验把排查顺序列出来ssh: Connection refused确认服务器SSH服务在运行端口默认22。Server host key not found首次连接会询问是否信任主机点是就行。Authentication failed密码或用户名错误检查是否有拼写问题。Permission denied可能是服务器限制密码登录需要改用密钥认证。Interpreter not found你填的Python路径不对在服务器上先执行which python确认路径。还有一个比较高发的问题服务器上Python环境是激活的conda环境但PyCharm连接时用的是.bashrc里没有conda初始化的非交互shell导致解释器找不到。这种情况可以在远程环境的启动脚本里加上source ~/.bashrc或者在解释器路径里直接把conda环境Python的绝对路径写死。7. 最后分享两个我自己用下来的小技巧一个是安装任何大型包之前先在conda环境里查一下已安装的包版本用conda list大概了解下基础环境避免装到一半发现核心库版本被改动。另一个是写一个env_check.sh脚本把nvidia-smi、python --version、pip list这些关键信息一次性输出到一个日志文件里遇到问题先看日志再解决省去反复排查的时间。这套流程我每年都会整理给实验室的新同学照着走下来PyTorch、TensorFlow、visdom、Jupyter远程访问、PyCharm远程连接这五座大山基本都能翻过去。真遇到没见过的报错也别慌把完整报错贴到搜索框里先看最后三行再往上翻上下文绝大多数坑都有前人踩过。祝你在实验室的服务器上跑得顺利早点把时间留给真正要做的实验。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表