Linux深度学习环境搭建:12年架构师排障实录
|
凌晨三点十七分,GPU节点的NVML不可用告警堆到三百七十二条,我盯着监控屏右下角那个跳动的“12:03 AM”——不是系统时区错,是机房NTP服务器去年修空调时被工单顺手停过一次,没人重启,也没人核对。DBA老周蹲在机柜后面扯光纤,拖鞋踢掉一只,光脚踩在静电地板上,另一只还挂着半截断掉的魔术贴。我原以为又是驱动版本跟CUDA patch level对不上,结果ssh进去一查,/dev/nvidia全空。nvidia-smi直接报错:NVRM: API mismatch: client driver version 535.104.05 and kernel module version 535.86.01。这个我敢打包票——不是编译问题,是rpm upgrade卡在postinstall阶段,而systemd-journald那会儿正把journal刷到SSD尾块,IO hang了十七秒,日志里就一行:“nvidia-modprobe: failed to load module nvidia”。 冷风从架空地板底下往上涌,吹得我小腿凉飕飕。对面工位后端小张突然把椅子往后一推,滑出去两米,椅子腿刮着防静电地板“吱——”,他低头猛戳手机,屏幕亮了一下,没接,又黑了。我伸手去够桌角那杯冷透的美式,手腕一歪,咖啡斜着泼出来,在工牌上洇开一块褐色,像片烧焦的显存缓存区。没擦,就让它挂着。清明节前一天,实验室那台A100服务器突然掉卡,八块全offline,但smartctl、ipmitool、dmesg全绿。最后发现是BIOS里PCIe ASPM设成了L1+L0s——厂商固件bug,触发链路重训练风暴,三分钟内自动reset PCIe link十八次。重启?没用。重刷BIOS?得拆机盖进BMC console,手动挂ISO。我手抖,输入密码输错三次,锁了两分钟。那个下午我喝了四杯咖啡,全洒了两回。
文章配图,仅供参考 优胜劣汰?不是玄学。是当你在/root/.bash_history里翻出三年前某次“紧急修复”留下的export CUDA_HOME=/usr/local/cuda-11.7.1_real(注意末尾_real),而当前/usr/local/cuda是软链向12.1,但conda env里nvcc -V却返回11.7.1_real的hash校验不一致时,你必须立刻决定:是重装pytorch还是先把那个_real目录rm -rf。选错,模型训一半OOM,日志里只有一行terminate called after throwing an instance of 'c10::Error',没堆栈。老板凌晨两点微信语音连麦,背景音是他家狗叫了两声,然后他清嗓子说“能不能明早九点前出个根因报告”。我没接,挂了。他也没再发。这种沉默比告警声还吵。值班表上周五更新过,我名下排了三个节点轮巡,其中一台标着“已移交AI组”,但Zabbix里监控项还挂着我的邮箱。昨天调休申请被驳回,理由是“资源紧缺期不可调”,但驳回人是我自己——审批流卡在二级,我忘了点“同意”。空调嗡的一声忽然变调,像是压缩机换了频率。后端小张换了一双拖鞋,灰蓝色,左脚那只鞋底已经磨穿,走路时脚趾顶着塑料薄层。他现在写的接口文档,开头写着“兼容PyTorch 2.0+,实际只测过2.0.1+cu118”。这很诚实。比某些readme里写“全平台支持”强——那玩意儿连aarch64都没编译过,连交叉工具链都没进过CI。 有个事儿我说不准:为什么同一块A100,在CentOS 7.9 + 515驱动上能跑完ResNet-50分布式训练,换到Rocky 9.2 + 535驱动,哪怕nccl版本一致,collective ops latency就稳稳涨38ms?nvprof抓不出hotspot,nsys profile显示kernel launch间隔正常,rocm-smi?压根没装。我试过关掉ASLR,试过pin memory改false,试过在docker run里硬绑cgroups —— 没用。最后降级到525驱动,好了。但原因?不知道。就像不知道为什么我们运维在/sys/class/infiniband/mlx5_0/device/下加了那行echo 1 > reset_on_init,之后RDMA throughput就再也回不去原值。不追究了。环境只要跑得起来,文档写清楚“此组合经实测有效”,其余都是噪声。 所以我说优胜劣汰,真不是夸——是血肉喂出来的筛选机制。你永远记不住所有驱动与内核模块ABI的咬合点在哪条中断处理路径里,但你会记住哪天因为忘删~/.nv/中的lock文件,导致docker build时nvcc死锁,而build日志最后一行是“[87/192] COPY requirements.txt .”;你会记得nvidia-container-cli configure --load-kmods 这个命令,要在systemd启动nvidia-docker之前跑,否则container里连/dev/nvidia0都摸不到;更会记得,当pytorch lightning trainer报“unable to pin memory in current context”,不是CUDA内存不够,是你宿主机里某个残留的nvidia-uvm.ko正在被另一个进程mmap,而那个进程早就崩了,只剩个pid躺在/proc下不肯走。这些坑不写进wiki,但会在你梦里反复加载——像一段没有__exit__的内核模块。 我现在手边这台机器,刚重装完Ubuntu 22.04,装了nvidia-driver-535-server,装了cuda-toolkit-12.2,pip install torch==2.2.1+cu121 --extra-index-url https://download.pytorch.org/whl/cu121。一切正常。但我没急着跑train.py。我先cd /usr/lib/nvidia-current && ls -l | grep uvm,再ps aux | grep -i 'nvidia-persistenced',最后敲了三遍nvidia-smi -q -d MEMORY。做完这些,才把咖啡杯扶正,用纸巾按了按工牌上的渍——没干透,按下去有点黏。下一步?等小张把那三个API里的batch size上限放开。他说今天下班前搞定。我不信。但他上次说“明天早上给你dockerfile”,结果凌晨一点发来了带完整git diff的commit hash。所以我打算等他消息。或者,等空调再嗡一声。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


运营中心深度学习优化:交互响应提速40%
Linux运维老手也常踩的5个Unix环境搭建坑
Windows数据科学环境搭建:18年经验避坑与高效配置
站长资讯已死?深度学习重构信息分发逻辑
嵌入式Linux开发者Unix环境搭建避坑指南
Linux下H5开发环境搭建与数据库配置实践