如何升级 NVIDIA 驱动而不重启运行中的 AI 容器
解读
在国内金融、运营商、互联网大厂的生产 AI 推理/训练集群里,GPU 容器 7×24 小时跑模型,重启意味着业务中断、排队重跑、SLA 违约。面试官想确认两点:
- 你是否清楚 NVIDIA 驱动与容器运行时之间的耦合关系(宿主机内核模块 + libnvidia-container);
- 你是否能在“不破坏容器进程”的前提下完成热升级,并给出回滚方案。
回答必须兼顾 合规(等保、国密)、可观测(监控告警) 与 灰度 三板斧,否则会被直接判负。
知识点
- NVIDIA 驱动热替换原理:内核模块 nvidia.ko 支持 NVIDIA Kernel Module Unload(modprobe -r) 的 Live Kernel Patching 机制,前提是 GPU 上下文全部冻结 且 无进程持有 /dev/nvidia 句柄*。
- libnvidia-container 钩子:容器启动时把宿主机 驱动版本号、libcuda.so、libnvidia-ml.so 挂载为 只读 bind mount,容器内进程实际持有的是宿主机文件描述符,不重启容器即可感知新 so。
- 国内内核锁:CentOS 7/8 默认 kmod-nvidia 与 kernel-devel 版本强绑定,需提前准备 同版本 kABI-whitelist 的 dkms 包 防止 dracut 重建 initramfs 触发重启。
- GPU 共享模式:若使用 NVIDIA vGPU 或 MIG,需通过 nvidia-smi –lock-gpu-clocks 与 nvidia-smi –query-compute-apps 确保 无活跃 CUDA context 才能卸载旧驱动。
- 回滚路径:提前 zfs/btrfs 快照 宿主机 /usr/lib/x86_64-linux-gnu/nvidia* 与 /lib/modules/$(uname -r)/extra/nvidia*,30 秒内可回滚。
答案
-
灰度筛选:
通过 nodeSelector=gpu-driver-version=470.161.03 把升级范围限定在 10% 的 A100 节点,并 cordon 节点 禁止新 Pod 调度。 -
冻结 GPU 上下文:
在宿主机执行nvidia-smi –query-compute-apps –format=csv,noheader | wc -l返回 0 表示 无活跃 CUDA 进程;若大于 0,使用 cuda-gdb –p <pid> 发送 SIGSTOP 冻结容器内训练进程,30 秒内完成驱动切换。
-
热卸载旧驱动:
systemctl isolate multi-user.target # 关闭图形栈 modprobe –r nvidia_drm nvidia_modeset nvidia_uvm nvidia若返回 “module is in use”,使用 lsof /dev/nvidia* 找到残留句柄,nsenter -t <container-pid> -n fuser –k /dev/nvidia0 强制释放。
-
装载新驱动:
dkms install –k $(uname –r) –m nvidia –v 535.54.03 –force modprobe nvidia NVreg_PreserveVideoMemoryAllocations=1 nvidia-smi –pm 1 –e 0 # 开启持久模式,关闭 ECC 重置 -
刷新容器运行时:
无需重启容器,只需 重新注入挂载命名空间:systemctl reload docker docker exec <ai-container> ldconfig # 让新 libcuda.so 进入缓存容器内 python -c “import torch;print(torch.cuda.get_device_name(0))” 已能打印 535.54.03 对应的 A100-SXM4-80GB,训练进程继续从 checkpoint 恢复。
-
观测与回滚:
Prometheus GPU Exporter 连续 5 分钟 gpu_utilization>95% 且 gpu_memory_used<1% 视为异常,自动触发 ansible-playbook rollback-nvidia.yml,30 秒内回滚快照,SLI 未触发告警。
拓展思考
- 国内信创场景:鲲鹏 + 昇腾 910 使用 Ascend-docker-runtime,驱动以 ko 文件形式热插拔,但 davinci 驱动不支持卸载重载,必须 双节点滚动;此时应回答“无法热升级,需通过 Volcano gang-scheduling 把 Pod 漂移到备用节点”,体现 技术边界意识。
- 云厂商托管:在 阿里云 ACK-GPU 或 腾讯云 TKE-Stack,底层 由 CSP 托管驱动,用户只能 升级 device-plugin 镜像,此时应回答“通过节点池轮转 + 节点镜像自定义脚本”,避免 越权操作宿主机。
- 未来趋势:NVIDIA GPU Operator 把驱动打包为 DriverContainer,基于 Kubernetes NFD 插件 实现 节点级 Canary 升级,容器业务零感知,建议补充“正在调研 GPU Operator + OpenKruise CloneSet 的 partition 灰度能力”,展示 云原生前瞻性。