核心命令
nvidia-smi
可查看:显卡卡号、显存、算力(Compute Capability)、温度、功耗、占用进程、驱动版本。
### 2. 驱动、CUDA、cuDNN 三者是什么关系,版本兼容原则是什么
| 组件 | 作用 |
|------|------|
| **显卡驱动** | GPU 底层硬件驱动 |
| **CUDA** | 并行计算开发运行库 |
| **cuDNN** | GPU 加速算法库(深度学习) |
**兼容规则:**
1. CUDA 版本不能超出驱动支持上限
2. cuDNN 绑定对应 CUDA 版本
3. 业务框架(PyTorch/TensorFlow)需匹配对应 CUDA 版本
### 3. 一台服务器多张显卡,如何指定程序运行在特定 GPU 上
```bash
# 环境变量控制
export CUDA_VISIBLE_DEVICES=0,1
# 容器启动参数
docker run --gpus '"device=0,1"' ...
# 代码层面
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
4. 什么是 MIG 技术,作用是什么
MIG(Multi-Instance GPU):NVIDIA 显卡虚拟化拆分技术。
可将一张物理 GPU 切分成多个独立算力实例,拆分显存与核心,实现多任务隔离复用,提升算力利用率。
支持 MIG 的显卡:A100、H100 等。
5. nvcc 命令作用是什么,如何查看 CUDA 版本
# nvcc:CUDA 编译器
nvcc -V
# nvidia-smi 也可查看支持的 CUDA 版本
nvidia-smi
3. 容器 & K8s GPU 调度类
1. 普通 Docker 和 nvidia-docker 区别,为什么运行 AI 程序必须用后者
| 对比 | 普通 Docker | nvidia-docker |
|------|------------|--------------|
| GPU 识别 | ❌ 无法识别 | ✅ 打通 GPU 调用通道 |
| CUDA 库 | ❌ 不包含 | ✅ 封装显卡驱动与 CUDA 库 |
| 算力映射 | ❌ 不支持 | ✅ 支持 GPU 资源映射 |
2. K8s 中如何调度 GPU 资源,Pod 怎么挂载使用显卡
-
节点预先安装 GPU 驱动 + NVIDIA Device Plugin
-
Pod YAML 声明
resources.limits.nvidia.com/gpu -
设置节点标签、污点容忍,调度器匹配 GPU 节点
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: cuda-container
image: nvidia/cuda:12.0-runtime
resources:
limits:
nvidia.com/gpu: 1
3. K8s 中 GPU 资源配额限制的目的是什么
-
防止单任务独占全部显卡资源
-
隔离业务任务,避免互相抢占
-
合理分配集群算力,保障多任务稳定运行
4. 简述 GPU 镜像制作的注意事项
-
匹配业务所需的 CUDA 版本与系统版本
-
预装依赖库与深度学习框架
-
精简镜像体积
-
配置显卡调用权限
-
测试镜像内 GPU 识别可用性
4. 集群调度 & 存储类
1. 日常算力集群常用调度框架有哪些,简单说下 Slurm 工作流程
常用调度框架: Slurm、Volcano(K8s)、YARN
Slurm 工作流程:
用户提交作业 → 调度系统纳入队列 → 筛选空闲 GPU 节点
→ 分配资源启动任务 → 任务结束释放算力资源
2. 训练任务加载模型缓慢,优先排查哪些存储层面问题
-
分布式存储(Ceph/MinIO)读写性能
-
磁盘 IO 负载
-
模型文件分片与挂载状态
-
网络存储带宽
-
文件权限与文件损坏问题
3. Ceph 存储在 GPU 集群中主要承担什么作用,常见故障有哪些
作用: 存储模型权重、训练数据集、日志文件
常见故障:
-
存储挂载断开
-
读写延迟高
-
副本异常
-
磁盘损坏
-
集群节点掉线
4. 大文件跨节点高速传输有哪些方式
-
rsync、scp基础工具 -
集群内部高速文件拷贝工具
-
依托内网高速网卡传输
-
挂载共享存储直接读取
5. 故障排查高频面试题
1. 业务运行时报错 CUDA out of memory,原因和解决办法
原因:
-
模型过大
-
Batch size 太高
-
显存泄漏
-
多任务抢占显存
解决:
-
减小 batch size
-
优化模型结构
-
释放无用显存进程(
fuser -v /dev/nvidia*) -
扩容显卡显存
-
拆分任务分布式运行
2. 显卡莫名掉卡、nvidia-smi 偶尔识别不到显卡,排查思路
-
检查服务器硬件供电、散热温度
-
重启显卡驱动、重启节点
-
检查 PCIe 插槽与硬件线路
-
排查驱动稳定性、系统内核兼容性
-
查看硬件告警日志
3. 容器内执行 nvidia-smi 提示命令不存在,怎么排查
-
确认容器运行时使用 nvidia-container-runtime
-
确认宿主机已安装 NVIDIA 驱动
-
检查容器镜像是否包含 CUDA 工具包
4. 简述 GPU 显存泄漏的排查思路
-
使用
nvidia-smi监控显存变化 -
定位显存占用异常的进程 PID
-
使用
fuser -v /dev/nvidia*查看占用进程 -
检查代码中是否存在显存未释放的路径
5. Kubernetes 中 node 节点 NotReady,GPU 节点如何排查
-
kubectl describe node <node-name>查看 Condition -
检查 kubelet 状态:
systemctl status kubelet -
检查 nvidia-device-plugin 是否正常运行
-
检查节点资源是否耗尽(CPU/内存/磁盘)
-
检查网络连通性
6. 实操场景题
1. 口述查询所有 GPU 占用进程,批量杀死异常显存进程的操作
# 查看所有 GPU 占用进程
nvidia-smi
# 批量杀死所有 GPU 进程(谨慎使用)
fuser -v /dev/nvidia* | awk "{print \$2}" | xargs kill -9
# 或按 PID 逐个清理
kill -9 <PID>
2. 口述一台新 GPU 服务器,从装机到能运行业务的部署流程
-
安装操作系统 + 基础配置(网络、防火墙、SSH)
-
安装 NVIDIA 显卡驱动
-
安装 CUDA Toolkit + cuDNN
-
安装容器运行时(Docker + nvidia-container-runtime)
-
部署 K8s 组件(kubelet + kube-proxy)
-
部署 NVIDIA Device Plugin
-
加入集群并打上 GPU 标签
-
验证:部署测试 Pod 运行
nvidia-smi
3. 口述如何排查集群节点之间网络不通问题
# 逐层排查
ping <target-ip> # 基础连通性
telnet <target-ip> <port> # 端口连通性
traceroute <target-ip> # 路由路径
ip route show # 路由表
iptables -L -n # 防火墙规则
ip link show # 网卡状态
ethtool <interface> # 网卡协商速率
4. 口述编写简单脚本,定时巡检显卡温度并记录日志
#!/bin/bash
# GPU 温度巡检脚本
LOG_FILE="/var/log/gpu_temp_monitor.log"
while true; do
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.used --format=csv \
| tail -n +2 \
| while IFS= read -r line; do
echo "[$TIMESTAMP] $line" >> $LOG_FILE
done
sleep 300 # 每 5 分钟采集一次
done
---
> [!info] 关联文档
> - [[DCGM 完整深度详解]] — GPU 监控
> - [[GPU 容器虚拟化层完整详解]] — GPU 虚拟化
> - [[Kubernetes GPU 调度完整详解]] — K8s GPU 调度
> - [[GPU 计算与 CUDA 编程基础]] — GPU 理论