Linux深度学习环境搭建:16年日志工程师的排障实录
|
我越来越觉得“Linux深度学习环境搭建必须从CUDA驱动版本对齐开始”是错的。 去年五月份,我在三台戴尔R740上重装PyTorch训练栈,GPU是V100-SXM2,nvidia-smi显示驱动450.80.02——完美匹配官方文档标称的11.0/11.1支持范围。我连nvcc都没敲,直接pip install torch==1.7.1+cu110 -f https://download.pytorch.org/whl/torch_stable.html,然后跑通了resnet50 benchmark。结果第二天上午九点二十三分,模型在DataLoader加载第47个batch时,GPU内存残留62MB不动,显存利用率卡死在0%,dmesg里没报任何NVRM错误,/var/log/nvidia-installer.log甚至干净得像刚格式化过。我蹲在机柜前拿手机录像,录到一半发现监控里自己左手正无意识抠着右指甲盖边缘,已经抠出三道白痕。 我原以为是nccl超时或RDMA配置漂移,结果用strace -p $(pgrep -f 'python.train') -e trace=connect,sendto,recvfrom抓了两分钟,全是libc.so里对/lib64/ld-linux-x86-64.so.2的动态链接调用——压根没走到网络层。转头查journalctl -u nvidia-persistenced,输出里有一行:“Failed to open /dev/nvidiactl: No such device”。我愣了三秒才想起来:这个设备节点根本不在nvidia-uvm模块加载之后生成,而是由nvidia-modprobe服务在驱动加载后、用户态进程启动前强制创建的。我们删过这台机器的/etc/modprobe.d/blacklist-nouveau.conf里那行install nouveau /bin/false,但忘了把nvidia-modprobe包从apt purge列表里踢出去——所以它每次开机都抢在nvidia.ko之前执行,发现/dev/nvidiactl不存在就静默退出,不报错也不重试。 李工坐我斜后方,啃着冷掉的生煎包跟我说:“你再装一遍驱动不就完了?”我说装过了四遍,他喷出半颗芝麻:“那重装CUDA toolkit啊!”我把/usr/local/cuda目录tar出来发给他看,路径底下全是指向cuda-11.0的软链,连libcudnn.so.8都是软链——可问题根本不在这里。陈总监路过听见,掏出手机翻NVIDIA官网的driver-cuda兼容表截图,手指划拉到“Driver 450.x supports CUDA 11.0 and 11.1”,念完抬头问我:“你看,不是一模一样吗?”我点头说对,然后当着他面ssh进机器,cat /proc/driver/nvidia/registry | grep RMEdgeTrigger,返回空;又grep RMEnableNvGpuFirmwareLoad,还是空。这两个注册表项在450.80.02里默认关着,而PyTorch 1.7.1的cu110预编译轮子偏偏要读它——文档里连提都没提。 这事我也可能就运气好。今年春节后在阿里云ecs.gn7i-c16g1.4xlarge实例上搭同样环境,内核升级到5.10.102-99.473.amzn2.x86_64,nvidia-driver 515.65.01,CUDA 11.7,结果nccl通信在混合精度训练中随机卡住。strace照样安静,但这次nvidia-smi里出现了一个新现象:GPU温度读数恒为39℃,不管训多久都不变。我让运维小张在物理机旁拿红外测温枪实测——外壳是41℃。他回来甩给我一张图,热成像里GPU芯片区域明显比散热鳍片低两度。我就知道又是固件加载异常。查dmesg -T | tail -20,最后一行是“NVRM: GPU 0000:00:1e.0: RmInitAdapter failed! (0x26:0xfffff90a:983)”——十六进制代码983,对应NV_ERR_INCOMPLETE_INTEGRATION,翻译过来就是“老娘不想配合你们这套破架构”。我当场删掉了所有NVreg_EnableGpuFirmwareLoading=1的内核参数尝试,换成NVreg_ResmanDebug=1,日志炸出两千行,里面混着一句“[drm] Cannot reserve BAR2: -16”。BAR2?那个被PCIe Spec列为保留地址段的寄存器空间?对,就它。它没被映射,因为云厂商的vfio-pci驱动硬塞了一道过滤,把这段地址从resource_list里砍掉了。 所以说驱动版本对齐只是幻觉。真正在跑的从来不是CUDA Toolkit,是nvidia.ko里的几万行汇编写的寄存器搬运工,是nv_gpu_firmware.bin文件里被签名锁死的微码,是nvidia-modprobe这个躲在systemd背后的幽灵,以及你自己在凌晨三点手动rmmod再insmod时手抖漏掉的那个force参数。张薇去年底离职前留了个脚本,在/root/check-gpu-health.sh里写了三行注释:“检查/dev/nvidiactl是否存在”、“检查/proc/driver/nvidia/params里RMEnableNvGpuFirmwareLoad是否为1”、“检查dmesg末尾是否含0x26错误码”。她走那天往我桌上扔了半盒绿箭,铝箔纸还没撕开。
文章配图,仅供参考 我见过最荒谬的一次:某客户集群里八台服务器全用相同ISO镜像重装,六台跑通DDP训练,两台总在AllReduce时hang住。我们拆了三天硬件,换光所有网线、HCA卡、甚至SSD固件——最后发现那两台BIOS里Secure Boot开关开着,而他们的nvidia-firmware包是未签名的。禁用Secure Boot,重启,训练正常。没人去查firmware签名状态,因为所有人都在翻CUDA兼容表PDF。这事我现在只干两件事:第一,上机器先敲ls -l /dev/nvidia,看节点是不是全的;第二,cat /proc/driver/nvidia/registry | egrep "(RMEdgeTrigger|RMEnableNvGpuFirmwareLoad)",只要有一行是0就立刻exit 1。其余时间?我泡杯茶,看监控面板上的GPU利用率曲线——如果它突然掉到零又弹不起来,我就知道,又有人在重装驱动了。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux无障碍环境搭建:零配置→语音导航全指南
Linux新手避坑指南:9年API开发师亲授安装与环境配置
深度学习服务器选型避坑与全栈调优指南
Linux老手也常踩的5个Unix环境搭建坑
Linux数据库环境搭建:七步稳态实战指南
嵌入式Linux开发者Unix环境搭建避坑指南
Linux安全环境搭建:从零到生产就绪