加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0479zz.com/)- 物联设备、操作系统、高性能计算、基础存储、混合云存储!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Linux深度学习环境搭建:11年测试工程师的排障实录

发布时间:2026-11-02 14:34:08 所属栏目:Unix 来源:DaWei
导读:  接口超时告警那一刻,我正蹲在茶水间扒拉微波炉里那盒冷透的咖喱饭——叮一声响,手机震得我差点把饭盒扣自己鞋面上。监控大盘上那条绿色的线一直在抖,像没吃饱似的,可这会儿谁还盯大盘啊,告警声跟催命符似的叠了三层。

  接口超时告警那一刻,我正蹲在茶水间扒拉微波炉里那盒冷透的咖喱饭——叮一声响,手机震得我差点把饭盒扣自己鞋面上。监控大盘上那条绿色的线一直在抖,像没吃饱似的,可这会儿谁还盯大盘啊,告警声跟催命符似的叠了三层。老张隔着工位隔断吼:“你那套环境跑起来没?”我嘴上说“跑起来了”,手还在摸键盘敲nvidia-smi,结果出来是空的。空的。不是报错,是压根没这个命令。


  我原以为装完CUDA就能进Jupyter notebook点开第一个.ipynb跑通,结果pip list里连torch都没影儿。后来发现conda activate py38那个环境根本没加载上GPU驱动——不是驱动没装,是udev规则没 reload,设备节点/dev/nvidia压根没生成。而我在那边吭哧改/etc/udev/rules.d/99-nvidia.rules的时候,小刘坐我斜后方打电话谈房租,一句“押一付三太猛了”听得清清楚楚。机箱嗡嗡响,比平时沉,但没人去听它是不是风扇堵了,反正告警电话一打过来,全组就顾着查日志了。


  日志刷得太快看不清。不是一行行滚,是直接糊成一片灰绿色的瀑布流。grep -A5 -B5 “cudaMalloc”翻了七次,第八次才看到那一行被截断的:`CUDA_ERROR_OUT_OF_MEMORY (error 2)`, 后面半句挤在下一行开头,写着“…allocating 1.2 GiB on device 0”。可显存明明是24G,top看GPU-Util不到30%。我卡那儿三分钟,最后发现是容器里没加--gpus all,只挂了device文件,没暴露capabilites。这种事,你查三天文档都不提这茬,就藏在docker run的–help末尾第七页一个小括号里。


  去年三月,为配一个训练脚本跑通,我重装了四次系统。不是重装OS,是重装驱动+Toolkit+Runtime+cudnn+torch+torchvision,每次版本对不上都得退回来——不报错,就训练中途kernel死掉,jupyter notebook直接断连,notebook文件里那些cell状态全灰了,跟人突然失忆一样。有一次重启后nvcc --version能出来,nvidia-smi也能出来,就是python -c “import torch; print(torch.cuda.is_available())” 打印False。我对着这句话发了十七分钟呆,期间外卖筷子掉在地上,我捡起来擦了擦继续吃,吃完才发现左边那根没擦干净,上面沾着一点酱油渍。


  优胜劣汰?真不是修辞。是物理层面的淘汰——显卡插槽松了,开机自检过不去;是权限层面的淘汰——某个sudoers里漏了一行,导致定时任务调用的模型推理服务启动时拿不到cuBLAS库路径;更是认知层面的淘汰:你以为apt-get install nvidia-cuda-toolkit就够了,结果它只给你编译器前端,不给你runtime,不给你driver headers,也不告诉你该卸载哪个legacy包。没人教,文档写得像考古现场,靠试,靠看别人踩过的坑汇总成一篇博客,而那篇博客的作者三个月后删了帖,因为新版本又崩了另一条链路。


  有次为了绕过一个pip install torch老失败的问题,我干脆用源码编译。make -j8跑了俩小时,到87%卡住,磁盘IO飙到98%,我摸到主机后面,发现散热硅脂干了,CPU温度92℃,风扇嘶叫着,可机箱嗡嗡声居然变小了——因为高频振动被热胀给压住了。这事儿我没跟任何人说。我只记得王工路过我工位时扫了一眼终端,说:“哦,你还在搞CUDA?”说完就去会议室怼产品了,说他们提的需求字段名又和两年前数据库里的不一致,表结构早动过三次,但所有下游服务都还硬读着旧字段。他桌上那张便签卷了边,写着“ALTER TABLE xxx RENAME COLUMN y TO z —— 线上等不了”,字迹被咖啡渍晕开一半。


文章配图,仅供参考

  我后来查到真正致命的那个点:系统级的ulimit -v设成了unlimited,结果CUDA内存分配器自己搞了个soft limit,一超过就静默失败。没人报错,也没堆栈,只有log里一句“allocation failed”,连函数名都不带。我是在NVIDIA官方论坛一个2019年的closed issue底下,第三页回复里看到的。那人写了句:“It’s not a bug, it’s the design.” 我抄下来贴在我显示器右下角,贴了两个月,胶都黄了。


  所以现在我搭新环境,第一件事不是跑pip install,是先查dmesg | grep -i nvidia,再查journalctl -u docker | grep -i gpu,最后才打开conda list。顺序不能错,错一步,后面全是幻觉。可你说这法子可靠?我信一半。毕竟上周五凌晨两点,同一套配置,在测试机跑得好好的,在预发就卡在数据加载器那里不动了——我们最后发现是RAID卡缓存策略和PyTorch DataLoader的mmap冲突,得关write-back。但这事儿,连厂商技术文档里都没写明白。


  我现在遇到装不上的时候,就先不折腾。泡杯咖啡,等它凉。要是咖啡机坏了,我就站着等,也不按那个红色重置键——上回按了,整个楼层的打印机连带门禁都离线了五分钟。运维老陈说过,别总想着“必须立刻修好”,有时候“先确认它真坏了吗”更省时间。我信他这话,但我还是每天上午十点准时打开终端,重试一次。试什么?不知道。试试就行。


  自己不敢动的那块?是/usr/local/cuda。删过一次,没删干净,留下几个软链接指向已删除的旧版本,之后所有cudaMalloc调用都返回NULL。那次回滚花了六小时,重装驱动时内核模块加载失败,panic了两次。我现在进去只读,不碰,连ls -l都要加个sudo -i再cd进去,像进祖坟。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!