Files
doc_processer/docs/NVIDIA_DOCKER_REMOTE_TROUBLESHOOTING.md
2026-02-05 13:18:55 +08:00

421 lines
9.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# NVIDIA Docker 驱动版本不匹配 - 远程排查与修复指南
## 问题说明
错误信息:
```
nvidia-container-cli: initialization error: nvml error: driver/library version mismatch
```
这表示 NVIDIA 驱动的用户空间库和内核模块版本不一致。
---
## 📋 步骤 1远程诊断
在目标机器上运行诊断脚本:
```bash
# 1. 将诊断脚本复制到目标机器
scp diagnose-nvidia-docker.sh user@remote-host:~/
# 2. SSH 登录到目标机器
ssh user@remote-host
# 3. 运行诊断脚本
bash diagnose-nvidia-docker.sh
# 4. 查看生成的诊断报告
cat nvidia-docker-diagnostic-*.txt
# 5. 将报告复制回本地分析(可选)
# 在本地机器运行:
scp user@remote-host:~/nvidia-docker-diagnostic-*.txt ./
```
诊断脚本会检查:
- ✅ NVIDIA 驱动版本(用户空间)
- ✅ NVIDIA 内核模块版本
- ✅ Docker 状态和配置
- ✅ NVIDIA Container Toolkit 状态
- ✅ 正在使用 GPU 的进程
- ✅ 系统日志中的错误
---
## 🔧 步骤 2根据诊断结果修复
### 场景 A驱动版本不匹配最常见
**症状:**
```
用户空间驱动版本: 550.90.07
内核模块版本: 550.54.15
```
**修复方案(按优先级):**
#### 方案 1重启 Docker 服务 ⚡最简单80% 有效)
```bash
# SSH 到目标机器
ssh user@remote-host
# 停止所有容器
sudo docker stop $(sudo docker ps -aq)
# 重启 Docker
sudo systemctl restart docker
# 测试
sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
```
**如果成功**:问题解决,跳到步骤 3 启动应用。
**如果失败**:继续下一个方案。
---
#### 方案 2重新加载 NVIDIA 内核模块 💪95% 有效)
```bash
# SSH 到目标机器
ssh user@remote-host
# 使用修复脚本(推荐)
sudo bash fix-nvidia-docker.sh
# 或手动执行:
# 1. 停止 Docker 和所有使用 GPU 的进程
sudo systemctl stop docker
sudo killall -9 python python3 nvidia-smi 2>/dev/null || true
# 2. 卸载 NVIDIA 内核模块
sudo rmmod nvidia_uvm 2>/dev/null || true
sudo rmmod nvidia_drm 2>/dev/null || true
sudo rmmod nvidia_modeset 2>/dev/null || true
sudo rmmod nvidia 2>/dev/null || true
# 3. 重新加载模块
sudo modprobe nvidia
sudo modprobe nvidia_uvm
sudo modprobe nvidia_drm
sudo modprobe nvidia_modeset
# 4. 重启 Docker
sudo systemctl restart docker
# 5. 测试
sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
```
**如果成功**:问题解决。
**如果失败**:内核模块可能被某些进程占用,继续下一个方案。
---
#### 方案 3重启系统 🔄99% 有效)
```bash
# SSH 到目标机器
ssh user@remote-host
# 重启
sudo reboot
# 等待系统重启(约 1-2 分钟)
sleep 120
# 重新连接并测试
ssh user@remote-host
sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
```
**注意**:重启会中断所有服务,请确认可以接受短暂停机。
---
### 场景 BNVIDIA Container Toolkit 问题
**症状:**
```
❌ nvidia-container-cli 未安装
nvidia-container-cli 版本过旧
```
**修复:**
```bash
# SSH 到目标机器
ssh user@remote-host
# 更新 NVIDIA Container Toolkit
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
# 添加仓库(如果未添加)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
# 安装/更新
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# 配置 Docker
sudo nvidia-ctk runtime configure --runtime=docker
# 重启 Docker
sudo systemctl restart docker
# 测试
sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
```
---
### 场景 CDocker 配置问题
**症状:**
```
/etc/docker/daemon.json 不存在
或缺少 nvidia runtime 配置
```
**修复:**
```bash
# SSH 到目标机器
ssh user@remote-host
# 创建/更新 Docker 配置
sudo tee /etc/docker/daemon.json <<EOF
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
EOF
# 重启 Docker
sudo systemctl restart docker
# 测试
sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi
```
---
## 🚀 步骤 3启动应用
修复成功后,启动 doc_processer 容器:
```bash
# SSH 到目标机器
ssh user@remote-host
# 确保旧容器已停止
sudo docker rm -f doc_processer 2>/dev/null || true
# 启动容器
sudo docker run -d --gpus all --network host \
--name doc_processer \
--restart unless-stopped \
-v /home/yoge/.paddlex:/root/.paddlex:ro \
-v /home/yoge/.cache/modelscope:/root/.cache/modelscope:ro \
-v /home/yoge/.cache/huggingface:/root/.cache/huggingface:ro \
doc_processer:latest
# 检查容器状态
sudo docker ps | grep doc_processer
# 查看日志
sudo docker logs -f doc_processer
```
---
## 📊 验证和监控
### 验证 GPU 访问
```bash
# 检查容器内的 GPU
sudo docker exec doc_processer nvidia-smi
# 测试 API
curl http://localhost:8053/health
```
### 监控日志
```bash
# 实时日志
sudo docker logs -f doc_processer
# 查看最近 100 行
sudo docker logs --tail 100 doc_processer
```
---
## 🛠️ 常用远程命令
### 一键诊断并尝试修复
```bash
# 在目标机器创建这个脚本
cat > quick-fix.sh <<'EOF'
#!/bin/bash
set -e
echo "🔧 快速修复脚本"
echo "================"
# 方案 1: 重启 Docker
echo "尝试重启 Docker..."
sudo docker stop $(sudo docker ps -aq) 2>/dev/null || true
sudo systemctl restart docker
sleep 3
if sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi &>/dev/null; then
echo "✅ 修复成功(重启 Docker"
exit 0
fi
# 方案 2: 重载模块
echo "尝试重载 NVIDIA 模块..."
sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia 2>/dev/null || true
sudo modprobe nvidia nvidia_uvm nvidia_drm nvidia_modeset
sudo systemctl restart docker
sleep 3
if sudo docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi &>/dev/null; then
echo "✅ 修复成功(重载模块)"
exit 0
fi
# 方案 3: 需要重启
echo "❌ 自动修复失败,需要重启系统"
echo "执行: sudo reboot"
exit 1
EOF
chmod +x quick-fix.sh
sudo bash quick-fix.sh
```
### SSH 隧道(如果需要本地访问远程服务)
```bash
# 在本地机器运行
ssh -L 8053:localhost:8053 user@remote-host
# 现在可以在本地访问
curl http://localhost:8053/health
```
---
## 📝 故障排除检查清单
- [ ] 运行 `diagnose-nvidia-docker.sh` 生成完整诊断报告
- [ ] 检查驱动版本是否一致(用户空间 vs 内核模块)
- [ ] 检查 NVIDIA Container Toolkit 是否安装
- [ ] 检查 `/etc/docker/daemon.json` 配置
- [ ] 尝试重启 Docker 服务
- [ ] 尝试重新加载 NVIDIA 内核模块
- [ ] 检查是否有进程占用 GPU
- [ ] 查看 Docker 日志:`journalctl -u docker -n 100`
- [ ] 最后手段:重启系统
---
## 💡 预防措施
### 1. 固定 NVIDIA 驱动版本
```bash
# 锁定当前驱动版本
sudo apt-mark hold nvidia-driver-*
# 查看已锁定的包
apt-mark showhold
```
### 2. 自动重启 Docker驱动更新后
```bash
# 创建 systemd 服务
sudo tee /etc/systemd/system/nvidia-docker-restart.service <<EOF
[Unit]
Description=Restart Docker after NVIDIA driver update
After=nvidia-persistenced.service
[Service]
Type=oneshot
ExecStart=/bin/systemctl restart docker
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable nvidia-docker-restart.service
```
### 3. 监控脚本
```bash
# 创建监控脚本
cat > /usr/local/bin/check-nvidia-docker.sh <<'EOF'
#!/bin/bash
if ! docker run --rm --gpus all nvidia/cuda:12.8.0-base-ubuntu24.04 nvidia-smi &>/dev/null; then
echo "$(date): NVIDIA Docker 访问失败" >> /var/log/nvidia-docker-check.log
systemctl restart docker
fi
EOF
chmod +x /usr/local/bin/check-nvidia-docker.sh
# 添加到 crontab每 5 分钟检查)
echo "*/5 * * * * /usr/local/bin/check-nvidia-docker.sh" | sudo crontab -
```
---
## 📞 需要帮助?
如果以上方案都无法解决,请提供:
1. **诊断报告**`nvidia-docker-diagnostic-*.txt` 的完整内容
2. **错误日志**`sudo docker logs doc_processer`
3. **系统信息**
```bash
nvidia-smi
docker --version
nvidia-container-cli --version
uname -a
```
---
## 快速参考
| 命令 | 说明 |
|------|------|
| `bash diagnose-nvidia-docker.sh` | 生成诊断报告 |
| `sudo bash fix-nvidia-docker.sh` | 自动修复脚本 |
| `sudo systemctl restart docker` | 重启 Docker |
| `sudo reboot` | 重启系统 |
| `docker logs -f doc_processer` | 查看应用日志 |
| `docker exec doc_processer nvidia-smi` | 检查容器内 GPU |