14年码农亲历:Linux深度学习环境搭建排障全路径
|
跟人吵架那天,机房空调坏了,嗡嗡声混着UPS那股铁锈味往鼻子里钻。老张叼着半截烟在机柜背面蹲着调光模块,我刚把第三块A100插进PCIe槽,风扇转了三秒就红灯——不是驱动问题,是槽位供电被BIOS锁死了,得进IPMI改个叫“PCIe ASPM Control”的鬼名字。他吐出一口烟说“你这卡是不是翻新过的”,我说“翻新?我拆封时硅脂还带出厂霜纹”。 我原以为装完nvidia-smi能跑就行。结果PyTorch报错:cudaErrorLaunchTimeout,但cudaMemcpyAsync又通。查了一上午,最后发现是系统级的kernel.watchdog_thresh=60被改成了30——谁干的?运维小王前天巡检时顺手优化了“高负载响应”,把看门狗拧紧了。这玩意儿根本不会报错,只会在GPU核上吊死三十秒然后静默重启上下文。你debug到凌晨三点,它给你表演一个“成功加载模型,运行第17步突然卡住,五分钟后显存全清空,像什么都没发生过”。 外卖盒还在桌上,酸辣粉汤都凉透了,浮着一层暗红油花。对面工位李工接电话:“喂?…对,CUDA 12.1兼容性文档?哦那个啊…(停顿两秒)我上次看是去年十月,PDF最后一页写着‘本文档截至2023年10月更新’…嗯嗯,您自己点‘Last Modified’看下?”——挂了。他手指在键盘上敲了三下,没打字,就是敲,咔、咔、咔。 conda install pytorch torchvision torchaudio --gpu cuda12.1?别试。你等它resolve dependency树等到显示器自动休眠,醒来看它还在算“是否要降级mkl-devel以满足scipy-1.12.x与numpy-1.26.3的ABI约束”。最后你force --no-deps,手动pip install,结果torch.compile直接segmentation fault,gdb里一看,是在libtorch_python.so的torch::jit::GraphExecutorImpl::run中调了llvm::RTDyldMemoryManager::getSymbolAddressInProcess,符号没找到。为啥?因为conda装的pytorch链接的是conda-forge的llvm17,而你的系统gcc-13.2默认带llvm15 runtime,不兼容。没人告诉你,连nvidia官方docker镜像都悄悄换了base image,从ubuntu20.04切到了22.04,就为躲掉glibc-2.31里的那个pthread_cond_clockwait bug——这个bug在分布式训练跨节点通信超时后会让NCCL卡死,但只发生在AMD CPU上。我们的测试机全是Intel,所以压根测不出来。 那天窗外一直在下雨,雨点砸在数据中心玻璃幕墙上的声音,像有人用指甲刮黑板。我盯着dmesg输出里一行不起眼的:`nvidia_uvm: Loaded the UVM driver, major device number 511`,后面跟了个括号:`(version 535.129.03)`。这个版本号我敢打包票——上周四上午十点十七分,我在另一台机器上装同一批驱动,它显示的是535.129.01。中间隔了俩patch,一个是修CUDA context cleanup race condition,一个是堵住UVM page fault handler里的refcount underflow。两个都只出现在NVIDIA内部changelog里,public release notes里删干净了。你问他们?客服回邮件说“请参考最新LTS版驱动”。LTS?我们产线跑的是2022年Q4的model card,连PyTorch都要锁死在2.0.1,就怕flash attention重排layout搞崩推理延迟。
文章配图,仅供参考 小王后来跑过来问我,“要不要试试podman替代docker?”我没理他。他转身去茶水间泡面,路过李工桌边时顺手把对方显示器亮度调低了十五格。李工抬头看了一眼,没说话,把耳机线拔下来绕了两圈,又插回去。 优胜劣汰?对。不是技术淘汰人,是人在筛技术。筛掉那些文档里写“tested on Ubuntu 22.04 + CUDA 12.2”但实际只在DGX-A100+32GB显存环境下验证过的废话;筛掉那种在requirements.txt里写“torch>=2.0”却依赖torch._C._set_backends_enabled的私有API;筛掉那些号称“一键部署”结果脚本里藏着硬编码的/usr/local/cuda-12.1/lib64路径,而你刚把CUDA软链指向12.2。半年前我重装整套环境,从裸金属开始——内核升级,nvidia-driver编译,cudnn源码打patch,torch C++ extension加-fno-semantic-interposition,最后跑通一个batch size=1的ResNet50推理,总共三百七十二分钟。中间失败二十八次,其中十九次是环境本身没崩,只是日志里某个数字比你昨天看到的少0.0003,你就得重新拉数据集、校验md5、怀疑SSD磨损、最后发现是clock_gettime(CLOCK_MONOTONIC_RAW)返回值被主板电池电压波动影响了微秒级抖动,导致Dataloader worker timestamp排序错位。这种事儿,没法写进故障排查手册。手册里只写“检查CUDA_VISIBLE_DEVICES”,而真正要命的是你export了,但systemd --user启动的jupyter service没继承这个env,它偷偷读了/etc/default/grub里那行quiet splash。你说气不气? 我桌角贴着一张便签,上面是李工用蓝墨水写的:“rm -rf /tmp/pymp-”,底下画了个箭头,指向垃圾桶照片。这张纸我已经撕过三次,每次都被他默默补上。最近一次他补的时候,左手无名指沾了点蓝墨水,蹭在机箱螺丝上,留下一个半圆印子。 现在我把nvtop开在tmux第二个pane里,一边watch -n1 'nvidia-smi --query-gpu=utilization.gpu,temperature.gpu --format=csv,noheader,nounits',一边把刚才那盒凉透的酸辣粉推到桌沿。接下来?把/usr/src/linux-headers-$(uname -r)/include/generated/utsrelease.h里的“-smp”字符串替换成空——只为让nvidia-drm.ko module能加载进内核。这事干不干?我说不准。先泡杯茶再说。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux无障碍环境搭建:零配置→语音导航全指南
运营中心深度学习优化,交互响应提速40%
深度学习服务器选型避坑指南:GPU显存到NVLink调优实战
云端部署深度学习模型:网络延迟直降67%实战
Linux新手避坑指南:12年工程师实战安装配置
Linux老手也常踩的5个Unix环境搭建坑
Linux安全环境搭建:零配置到生产就绪全指南