0aa8fe6
这次没有正文改动。
这是 gpu/GPU 服务器常见故障处理.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
ccb3350
@@ -11,7 +11,7 @@ title: GPU 服务器常见故障处理 GPU 服务器(训练卡、推理卡、显卡服务器)跑着任务出问题了:卡不见了、 `nvidia-smi` 报错、显存占用异常、训练突然中断、推理结果不对、温度报警。 -这篇按「现象 → 定位 → 处理」整理,都是实际会遇到的。 11111 +这篇按「现象 → 定位 → 处理」整理,都是实际会遇到的。11111 ## 前置条件 @@ -571,4 +571,4 @@ nvidia-smi -pl 200 # 限制到 200W * **别在有 checkpoint 之前就反复重试训练**,卡反复掉可能损坏 checkpoint 文件。 * **ECC 报错别忽略**,Volatile 涨可以清,Aggregate 涨就得换卡了。 * **国产卡(华为昇腾、寒武纪等)的 CUDA 生态不一样**,这套命令大多不通用, - 得看厂商自己的工具链。 + 得看厂商自己的工具链。
52852a8
@@ -8,9 +8,6 @@ title: GPU 服务器常见故障处理 ## 场景 - -E2E_HISTORY_555 - GPU 服务器(训练卡、推理卡、显卡服务器)跑着任务出问题了:卡不见了、 `nvidia-smi` 报错、显存占用异常、训练突然中断、推理结果不对、温度报警。 @@ -574,4 +571,4 @@ nvidia-smi -pl 200 # 限制到 200W * **别在有 checkpoint 之前就反复重试训练**,卡反复掉可能损坏 checkpoint 文件。 * **ECC 报错别忽略**,Volatile 涨可以清,Aggregate 涨就得换卡了。 * **国产卡(华为昇腾、寒武纪等)的 CUDA 生态不一样**,这套命令大多不通用, - 得看厂商自己的工具链。 + 得看厂商自己的工具链。
4eddabe
@@ -8,7 +8,6 @@ title: GPU 服务器常见故障处理 ## 场景 -FINAL_CHECK_999 E2E_HISTORY_555
187166a
@@ -1,5 +1,5 @@ --- -tags: [GPU, 显卡, 服务器, 故障处理, CUDA] +tags: [GPU, CUDA] order: 70 title: GPU 服务器常见故障处理 --- @@ -8,6 +8,8 @@ title: GPU 服务器常见故障处理 ## 场景 +FINAL_CHECK_999 + E2E_HISTORY_555 GPU 服务器(训练卡、推理卡、显卡服务器)跑着任务出问题了:卡不见了、 @@ -574,4 +576,3 @@ nvidia-smi -pl 200 # 限制到 200W * **ECC 报错别忽略**,Volatile 涨可以清,Aggregate 涨就得换卡了。 * **国产卡(华为昇腾、寒武纪等)的 CUDA 生态不一样**,这套命令大多不通用, 得看厂商自己的工具链。 -
2d26e3a
@@ -1,12 +1,15 @@ --- tags: [GPU, 显卡, 服务器, 故障处理, CUDA] order: 70 +title: GPU 服务器常见故障处理 --- # GPU 服务器常见故障处理 ## 场景 +E2E_HISTORY_555 + GPU 服务器(训练卡、推理卡、显卡服务器)跑着任务出问题了:卡不见了、 `nvidia-smi` 报错、显存占用异常、训练突然中断、推理结果不对、温度报警。 @@ -571,3 +574,4 @@ nvidia-smi -pl 200 # 限制到 200W * **ECC 报错别忽略**,Volatile 涨可以清,Aggregate 涨就得换卡了。 * **国产卡(华为昇腾、寒武纪等)的 CUDA 生态不一样**,这套命令大多不通用, 得看厂商自己的工具链。 +
c3e3513
@@ -0,0 +1,573 @@ +--- +tags: [GPU, 显卡, 服务器, 故障处理, CUDA] +order: 70 +--- + +# GPU 服务器常见故障处理 + +## 场景 + +GPU 服务器(训练卡、推理卡、显卡服务器)跑着任务出问题了:卡不见了、 +`nvidia-smi` 报错、显存占用异常、训练突然中断、推理结果不对、温度报警。 + +这篇按「现象 → 定位 → 处理」整理,都是实际会遇到的。 11111 + +## 前置条件 + +* 能 SSH 上服务器,或者有 IPMI / iDRAC / iLO 的远程控制台 +* 记下这台机器用的卡型(A100 / H100 / L40S / RTX 4090 / 国产卡等)和驱动版本 +* 有**另一台同型号的机器**能对照,出问题时好比对 +* 重要任务先确认有 checkpoint,别在故障状态硬跑 +* 驱动和 CUDA 版本先记下来,换驱动前一定要记 + +## 配置 + +### 1\. nvidia\-smi 找不到卡 + +最常见。按顺序查: + +```bash +# 先看系统能不能看到卡 +nvidia-smi +# 报错信息分几种: +# "command not found" → 驱动没装或 PATH 不对 +# "Failed to initialize NVML" → 驱动加载了但和内核对不上 +# "No devices were found" → 驱动在,但没找到硬件 +``` + +三种情况分别处理: + +**驱动没装 / 装了但 PATH 不对** + +```bash +# 看驱动模块在不在 +lsmod | grep nvidia +ls /proc/driver/nvidia/version + +# 模块没加载,但文件在 +modprobe nvidia +nvidia-smi +``` + +**Failed to initialize NVML(驱动与内核版本不匹配)** + +这是升级内核或升级驱动之后最常见的。内核头文件和驱动版本对不上: + +```bash +uname -r # 当前内核 +cat /proc/driver/nvidia/version # 驱动带的内核版本 +ls /usr/src/kernels/ # 有没有对应的头文件 +``` + +两种修法: + +```bash +# 办法一:装当前内核的头文件,然后重装驱动 +apt install linux-headers-$(uname -r) +# 重新安装对应的 .run 驱动包(会重新编译内核模块) + +# 办法二:回退内核(更稳,但要重启) +# 编辑 /etc/default/grub,把 GRUB_DEFAULT 改成旧内核 +# update-grub && reboot +``` + +**No devices were found(驱动在,但卡不被识别)** + +```bash +# PCI 层面能不能看到卡 +lspci | grep -i nvidia +lspci -nn | grep -i "3d controller\|nvidia" + +# 内核有没有报错 +dmesg -T | grep -iE "nvidia|nvrm|nouveau" | tail -30 +``` + +几种典型: + +```text +"NVRM: Xid: ... GPU has fallen off the bus" → 卡掉了,PCIe 链路问题(见第 4 节) +"NVRM: Failed to initialize GPU" → 卡本身或供电有问题 +"unable to map BAR" → 内存映射失败,可能是 IOMMU 或 PCIe 设置 +"Nouveau ... kernel driver" → 装了开源驱动,抢占了独显 +``` + +如果是 nouveau 抢占了: + +```bash +# 禁用开源驱动 +echo "blacklist nouveau" >> /etc/modprobe.d/blacklist-nouveau.conf +echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf +update-initramfs -u && reboot +``` + +**完全看不到卡(lspci 也没有)** + +那就是硬件层面的问题了:卡没插好、供电没接、卡坏了、或者 PCIe 插槽有问题。 +这个只能去机房看。 + +### 2\. 驱动版本不对 / CUDA 版本不匹配 + +```bash +# 驱动版本 +nvidia-smi --query-gpu=driver_version --format=csv,noheader + +# CUDA 运行时版本(注意:这是驱动最高支持的版本,不是装的 toolkit 版本) +nvidia-smi | head -3 + +# PyTorch 实际用的版本 +python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())" + +# 实际加载的驱动 +cat /proc/driver/nvidia/version +``` + +对应关系: + +| CUDA 版本 | 最低驱动 | +| ------- | ---- | +| 12.4 | 550 | +| 12.1 | 530 | +| 11.8 | 520 | +| 11.4 | 470 | + +注意几个容易混的点: + +```text +torch.version.cuda → 编译 PyTorch 时用的 CUDA 版本 +nvidia-smi 右上角的 CUDA → 驱动最高能支持的 CUDA 版本 +``` + +**nvidia-smi 显示的 CUDA 版本比 torch.version.cuda 高是正常的**,不用管。 +反过来说,如果 `torch.cuda.is_available()` 返回 False,PyTorch 自己带的 CUDA 库 +和驱动不兼容才是问题。 + +常见报错: + +```text +"CUDA driver version is insufficient for CUDA runtime version" + → 驱动太老,升级驱动 + +"CUDA error: no kernel image is available for execution on the device" + → 驱动不支持这张卡的架构(Ampere / Hopper / Ada 的 sm_xx) + → 升级驱动到支持该卡的版本,老驱动不认新卡 + +"undefined symbol: cudaGetDriverEntryPoint" + → 装了多个 CUDA toolkit,环境变量指向了旧的 +``` + +多 CUDA 版本共存时,看当前用的是哪个: + …… 改动较长,只显示前一部分