上周帮一个朋友做GPU运维岗的模拟面试,他Linux基础很扎实,K8s也用过,结果被一道“nvidia-smi显示显卡正常,但容器里跑不了CUDA程序”的问题卡了整整十分钟。后来我翻了翻他投的那份JD,发现里面其实写得很清楚——GPU运维根本不是“会重启、会看日志”的传统运维,而是横跨硬件、驱动、容器调度、AI运行环境四层体系的一个复合岗位。这篇文章我就用一份典型的GPU运维JD做样本,把里面的每句话拆开揉碎,对应整理出30多道面试高频题,并附上答题思路和现场避坑建议,希望能帮准备这类岗位的朋友少走弯路。
1. 拆JD:岗位描述里藏着的四个能力域
我先把一份比较有代表性的GPU运维JD贴在下面,网上搜“GPU运维”岗位,十有八九是类似的写法。你别看它只有五六条,每一条背后都对应着一整块知识体系。
岗位职责:
- 负责GPU集群的日常运维、监控告警和容量管理;
- 负责AI训练/推理环境搭建、部署与优化;
- 负责GPU硬件、驱动、CUDA运行库、容器调度相关故障排查;
- 编写运维脚本,建设自动化运维与监控平台;
- 配合算法团队进行多机多卡训练的环境支持与性能调优。
这五条看起来很常规,但面试官问起来,几乎全部会往深处钻。
1.1 “GPU集群日常运维、监控告警和容量管理”——考的是监控设计能力
这句话听起来像废话,但面试官真正想问的是:你用什么指标衡量GPU集群健康?不光会看nvidia-smi的利用率,你还要知道DCGM(NVIDIA Data Center GPU Manager)这套东西,能采集温度、功耗、PCIe带宽、ECC错误、SM时钟降频等细粒度指标。更进一步,GPU利用率在AI训练里其实经常是“假忙”——有算力但显存带宽吃满、SM利用率低,或者数据加载瓶颈导致GPU空转,这些都是容量管理要解决的问题。
1.2 “AI训练/推理环境搭建、部署与优化”——考的是对深度学习技术栈的熟悉度
面试官听到你说“我会装CUDA”,一定会追问:CUDA、cuDNN、显卡驱动三者到底什么关系?TensorFlow和PyTorch各自要求的CUDA版本怎么匹配?conda环境里的CUDA和系统CUDA有什么区别?为什么torch.cuda.is_available()返回False而nvcc -V却正常?这些都是最常见的追问方向。大模型时代还会问Ollama、vLLM、DeepSpeed这类推理/训练框架,以及怎么给算法团队配置多机多卡环境。
1.3 “GPU硬件、驱动、CUDA运行库、容器调度故障排查”——考的是完整排障链路
这一条是GPU运维和普通运维拉开差距的地方。普通运维遇到“显卡挂了”大概率是重启,GPU运维要能分层排查:硬件层(nvidia-smi -q -d ECC查看显存ECC错误,nvidia-smi -q -d TEMPERATURE看温度)、驱动层(dmesg | grep -i nvidia查内核日志,NVRM报错)、运行库层(ldd看CUDA库链接)、容器层(nvidia-container-toolkit配置是否正确)。面试时你至少要能说清这条排查路径。
1.4 “自动化运维与平台建设”——考的是工程化能力
JD里写“编写脚本、建设平台”,潜台词是:你不仅要会修问题,还要会用代码减少问题。GitLab CI/CD、Ansible批量部署驱动、Prometheus + Grafana监控、告警通知,这些是基础。稍微进阶一点,还要会写K8s Operator或调度器扩展,把GPU虚拟化、显存配额、任务优先级管起来。这一块面试官主要看你的项目经验够不够真实。
2. 硬件与驱动层:最容易翻车的面试开头
很多面试者开场就被问住,是因为没搞懂GPU运维和传统运维在“硬件观”上的差异。传统服务器看CPU、内存、磁盘,GPU服务器多了张卡,但这张卡比CPU复杂得多。
2.1 一张GPU卡上到底有什么可监控的东西
面试官如果问“你怎么判断一块GPU快坏了”,绝大多数人只会说看日志。实际上,用nvidia-smi -q -d ECC能看到显存单比特/双比特纠错计数,这个数值持续增长基本说明显存颗粒有隐患;nvidia-smi -q -d PAGE_RETIREMENT能看到显存页是否被退役;nvidia-smi -q -d CLOCK能看到当前实际频率与最大频率的差距,如果GPU在重负载下频率被压得很低,那大概率是供电或散热问题。
还有一个容易被忽略的是nvidia-smi -q -d SUPPORTED_CLOCKS,它会列出当前驱动支持的最大内存频率和GPU频率组合。有时候你感觉某张卡“算得慢”,一查发现它运行在低功耗P8状态,压根没进P0满血状态,这就不是“玄学”,而是电源管理策略或nvlink配置的问题。
2.2 驱动、CUDA、cuDNN的版本关系必须张口就来
驱动版本向下兼容CUDA版本,而CUDA版本又决定了你能装哪个版本的PyTorch/TensorFlow。这个链条必须背熟:
- 驱动版本决定最高支持的CUDA版本(
nvidia-smi右上角显示的CUDA Version是驱动支持的最高版本,不是系统里实际装的版本); - 实际运行的是运行库版本,可能是conda环境里自带的CUDA Toolkit,不一定和系统驱动完全对应;
- cuDNN是深度学习框架调用底层CUDA计算的加速库,PyTorch安装时会自带匹配的cuDNN,但如果你手动编译TensorFlow,就得手动装对应版本的cuDNN。
面试问答时还有一个经典坑:nvcc -V显示CUDA 12.1,nvidia-smi显示CUDA Version 11.4。很多新手以为环境坏了,其实完全正常——前者是Toolkit编译器的版本,后者是驱动支持的上限版本,两者没有必然相等关系。这个点如果你能主动讲出来,面试官会立刻觉得你是真跑过环境的。
2.3 掉驱动和“d3d设备已移除”这类故障的排查思路
Windows环境下常见的“GPU发生崩溃或d3d设备已移除”,Linux下对应的就是NVRM报错、驱动挂掉导致Xorg或CUDA程序崩溃。这两种现象背后原因类似:驱动与GPU硬件/内核版本不匹配、显存访问越界、供电不稳、温度过高。
Linux下面排查,第一步是dmesg -T | grep -i nvidia,看有没有NVRM: Xid这样的错误码。Xid是NVIDIA驱动的错误码体系,比如Xid 79是GPU fell off the bus,通常是硬件掉卡或PCIe链路问题;Xid 43是显存ECC错误触发停GPU;Xid 63是GPU正在被其他进程占用导致的冲突。能把Xid错误码认全,绝对是很唬人的加分项。
再往下就是压力测试。GPU-Burn是面试里会提到的工具,它用CUDA的稠密矩阵乘法把GPU负载拉满,跑半小时看会不会报错。配合nvidia-smi dmon -s pc可以实时看PCIe读写带宽和电源功耗,判断降频和供电抖动。很多人只看nvidia-smi利用率,不看dmon,这就是业余和专业的差别。
3. 容器和K8s层:GPU是怎么被“分配”出去的
现在的AI任务基本都跑在容器里,纯物理机装驱动玩深度学习的环境已经很少了。所以容器和K8s层的GPU调度问题,在面试中占比极高。
3.1 容器里怎么“看见”GPU
早期Docker想用GPU,得手动挂--device /dev/nvidia0:/dev/nvidia0和一堆/dev/nvidia-uvm、/dev/nvidiactl设备,还要把驱动目录和ldconfig配置同步进容器。这套手动方案很脆弱,跑一个PyTorch训练经常提示CUDA error: no kernel image is available或者libcudart.so: cannot open shared object file。
现在主流的解法是NVIDIA Container Toolkit,它通过nvidia-container-cli在容器启动时自动注入GPU设备和驱动库。Docker侧只需要加--gpus all,K8s侧由kubelet调用Device Manager,再通过Device Plugin把GPU以扩展资源的形式上报给调度器。这个链路在面试里至少要能从头到尾说一遍:kubelet -> device plugin -> nvidia-container-runtime -> nvidia-container-toolkit -> GPU驱动。
3.2 K8s里GPU是怎么调度的
K8s本身不认识GPU,它只认CPU和内存。NVIDIA/k8s-device-plugin这个DaemonSet会通过gRPC跟kubelet通信,告诉调度器“这台节点上有8张A100”。调度器再把GPU以nvidia.com/gpu这种扩展资源的形式分配给Pod。
但这里有几个很深的坑:
- 如果Pod没声明
limits: nvidia.com/gpu: 1,调度器不会分配GPU; - 如果你的GPU不是MIG模式或支持vGPU,那么最小调度单位是一整张卡,一个Pod哪怕只用1GB显存,也会占掉整张卡,导致其他Pod没法再用;
nvidia.com/gpu和nvidia.com/gpumem这种扩展资源不是K8s默认支持的,要靠NVIDIA的调度扩展器实现显存隔离。
这些点面试官特别喜欢往深处问,因为很多人停留在“能调度”的层面,一问“如何限制Pod占用显存”就露馅。MIG(Multi-Instance GPU)是硬件的算力/显存切分方案,把一张A100切成多个实例,每个实例有独立的显存和计算单元;HAMI则是另一种开源GPU虚拟化方案,它通过拦截CUDA调用做显存和算力的软隔离。面试时提到这两个词,观感会完全不一样。
3.3 为什么会出现“GPU在节点上,但调度不上去”
这道题几乎是必考题。现象:kubectl get nodes显示节点Ready,但创建GPU Pod一直Pending。可能原因包括:
- Device Plugin没启动或崩溃了,导致节点没有上报
nvidia.com/gpu资源——用kubectl describe node <node>看Capabilities里有没有资源; - 节点GPU被其他Pod占满——检查
Allocatable和Allocated; - 有污点/Taint没有容忍——检查
kubectl describe node | grep Taints; - Device Plugin报错,比如驱动不匹配或文件权限问题——看device-plugin的日志。
如果面试官再追问“怎么定位”,你就要说出kubectl describe pod <pod>看Events里的调度失败信息,再kubectl logs -n kube-system <device-plugin-pod>去查插件日志。这套两步走是最基础的定位能力。
4. AI训练与推理场景:大模型时代的必答环节
现在的GPU运维岗,十有八九在支撑AI团队。不懂深度学习环境的运维,很难通过面试。
4.1 PyTorch/TensorFlow环境配置的关键细节
面试官问你“怎么给算法同学装一套PyTorch GPU环境”,你要意识到他不是真的让你“装”,而是考你的隔离意识和排错能力。
正确做法是先建conda虚拟环境,再根据显卡驱动版本去PyTorch官网选对应的安装命令。比如驱动支持CUDA 12.1,就可以装pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121。但是,要注意装完后必须在Python里验证:
import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.device_count()) print(torch.cuda.get_device_name(0))torch.cuda.is_available()返回False,是最常见的面试场景。排查思路:先看驱动是否正常(nvidia-smi),再看python -c "import torch; print(torch.backends.cudnn.enabled)",如果驱动正常但PyTorch检测不到GPU,大概率是PyTorch版本和CUDA版本不匹配,或者是以CPU-only模式装的。
4.2 显存不够、OOM、算力不匹配问题的标准答案
“CUDA error: out of memory”在AI环境里实在太常见了。面试官问这个问题,不是要听你装个watch -n 1 nvidia-smi看显存,而是想知道你会不会完整定位:
- 先
nvidia-smi看显存被谁占用,fuser -v /dev/nvidia*查对应进程; - 区分“其他任务占显存”和“当前任务分配失败”;
- 当前任务OOM可能是batch size太大、模型太大、或者数据加载内存膨胀,需要调整;
- 多卡任务还需要看CUDA_VISIBLE_DEVICES是否能隔离进程视角。
还有一个很经典的问题,“CUDA error: no kernel image is available for execution on the device”。这通常对应热词里的requires device with capability <= (9, 0) but your GPU has capability (12, 0),意思是程序编译时的SM架构兼容上限低于当前GPU的算力。比如你拿一块新出的Blackwell架构显卡,去跑一个为老架构编译的CUDA程序,就可能报这个错。解决方向是升级CUDA Toolkit或重新编译程序,并对齐GPU的compute capability。这个问题在面试里可以引出你对GPU架构、SM版本的理解,妥妥的加分点。
4.3 大模型推理和微调场景里的运维新知识
大模型时代,GPU运维的知识半径又大了一圈。面试可能涉及:
- Ollama这种本地推理工具怎么部署,模型文件怎么管理,CPU和GPU如何协同;
- DeepSpeed和分布式训练需要什么网络条件,NVLink、InfiniBand、TCP/RDMA的区别在哪里;
- DeepMD-Kit这类科学计算软件怎么做GPU版和CPU版的性能对比,为什么GPU加速效果不如预期;
- 昇腾这类国产GPU的驱动、算子库和CUDA生态的区别,在国内信创环境下怎么适配。
这些内容不用每个都精通,但至少要知道它们在生态里的位置。比如提到foldseek在GPU上部署,你至少要能说出它是蛋白质结构比对工具,GPU版本比CPU版本快很多,部署时要注意CUDA运行时库和显卡算力匹配——这才叫“懂业务”。
5. 高频问题30+道:按类别整理的面试真题清单
下面是核心干货。我从JD和实际面试经验出发,按类别整理了一份高频问题清单,每一道后面都标注了面试官真正想考察的点。你不用背答案,但要把每道题的“意图”吃透。
5.1 硬件与驱动类
| 序号 | 高频问题 | 考的是什么 |
|---|---|---|
| 1 | 一张GPU服务器上有哪些关键硬件部件? | 是否真正拆过机,了解电源、风扇、PCIe、NVLink等 |
| 2 | nvidia-smi的输出字段每个都代表什么? | 是否熟悉GPU利用率、显存、温度、功耗、P状态、ECC等 |
| 3 | 驱动和CUDA版本有什么关系? | 是否理解驱动的兼容上限和Toolkit的关系 |
| 4 | CUDA、cuDNN、PyTorch之间的关系是什么? | 是否理解深度学习软件栈的层次 |
| 5 | 如何判断一张GPU卡是否快坏了? | ECC错误计数、PAGE RETIREMENT、Xid错误码、压力测试 |
| 6 | GPU-Burn是什么?怎么使用? | 是否做过稳定性测试,能否设计GPU测试方案 |
| 7 | 常见的NVRM Xid错误码你知道哪些? | 排障经验是否丰富 |
| 8 | Windows报“d3d设备已移除”可能是什么原因? | 是否接触过Windows GPU工作站,能否跨平台排查 |
5.2 Linux系统与驱动管理类
| 序号 | 高频问题 | 考的是什么 |
|---|---|---|
| 9 | Linux下安装NVIDIA驱动的步骤是什么? | 是否熟悉DKMS、nouveau禁用、runfile包安装 |
| 10 | 升级驱动后系统无法进入图形界面,怎么解决? | 故障恢复能力,是否知道initramfs和nouveau冲突 |
| 11 | 怎么看GPU相关内核日志? | dmesg、journalctl使用熟练度 |
| 12 | 多张GPU卡的PCIe拓扑怎么查看? | 是否能判断NVLink和PCIe互联关系,影响多卡训练 |
| 13 | 设备文件/dev/nvidia0、/dev/nvidia-uvm的作用是什么? | 是否理解GPU设备驱动的基本模型 |
| 14 | 如何在服务器上做GPU直通(GPU Passthrough)? | 虚拟化经验,IOMMU、VFIO概念 |
5.3 容器与K8s类
| 序号 | 高频问题 | 考的是什么 |
|---|---|---|
| 15 | Docker容器里如何使用GPU? | nvidia-container-toolkit配置是否清楚 |
| 16 | K8s如何调度GPU? | 扩展资源、Device Plugin机制是否理解 |
| 17 | GPU Pod一直Pending,可能的原因有哪些? | 能否有步骤地排查调度问题 |
| 18 | 如何限制一个Pod的GPU显存用量? | 是否了解MIG、HAMI、GPU显存扩展资源 |
| 19 | GPU虚拟化有哪些方案,怎么选型? | 是否能结合业务场景选技术方案 |
| 20 | kubelet重启后GPU资源上报异常怎么办? | 是否熟悉Device Plugin的重启与节点恢复流程 |
| 21 | 如果一张物理GPU想分给多个Pod用,有哪些办法? | MIG切片、vGPU、CUDA显存虚拟化三类方案的理解 |
| 22 | 如何查看节点上GPU资源总量和已分配量? | kubectl describe node资源字段是否熟练 |
5.4 AI训练与推理环境类
| 序号 | 高频问题 | 考的是什么 |
|---|---|---|
| 23 | 在Linux上部署GPU版PyTorch,你怎么操作? | 环境搭建流程,是否懂得验证 |
| 24 | torch.cuda.is_available()返回False,你怎么排查? | 分层排查思想:驱动→运行库→Python包 |
| 25 | CUDA Out of Memory的常见原因和解决思路是什么? | 是否会看进程、调batch、查显存分配 |
| 26 | 多机多卡训练需要哪些网络条件? | RoCE、InfiniBand、NVLink理解程度 |
| 27 | 请说说Ollama部署大模型推理的基本流程。 | 是否接触过主流推理工具 |
| 28 | DeepSpeed训练报错,你会从哪里入手? | 分布式框架的排障路径,日志、端口、显存 |
| 29 | 你知道compute capability是什么意思吗?新显卡跑不了旧程序怎么办? | 对GPU架构和CUDA兼容性的理解 |
| 30 | 用GPU跑一个科学计算软件,怎么评估加速效果? | 是否会做基准测试,理解CPU/GPU带宽瓶颈 |
5.5 监控、告警与自动化运维类
| 序号 | 高频问题 | 考的是什么 |
|---|---|---|
| 31 | 怎么监控GPU集群的温度和功耗? | 是否会用DCGM、Prometheus exporter |
| 32 | GPU利用率高但训练速度慢,可能是什么原因? | 是否理解数据加载、CPU、存储带来的瓶颈 |
| 33 | 你会如何设计GPU集群的告警规则? | 是否有全局监控设计经验 |
| 34 | 如何批量给几十台GPU服务器安装驱动并验证? | Ansible脚本能力和版本管理意识 |
| 35 | 如何做一个GPU坏卡自动发现并通知的机制? | 自动化运维思维 |
| 36 | 日志集中收集用什么方案,GPU日志有什么特殊之处? | ELK/Loki、GPU事件和Xid日志接入 |
5.6 项目经验与软技能类
| 序号 | 高频问题 | 考的是什么 |
|---|---|---|
| 37 | 讲一个你处理过最复杂的GPU故障。 | 是否真的实操过,处理过程是否结构化 |
| 38 | 算法团队说“训练比以前慢”,你怎么响应? | 跨团队沟通、优先级判断、问题收敛能力 |
| 39 | 如果让你从零建一个GPU集群,你会怎么规划? | 方案设计能力,兼顾性能、成本、可运维性 |
| 40 | 你能接受7x24小时排班处理GPU故障吗? | 岗位意愿,加班和压力承受度 |
| 41 | 你对国产GPU生态有什么了解? | 是否关注行业趋势,昇腾、海光、寒武纪等 |
| 42 | 你平时怎么学习GPU相关的新知识? | 自学能力和信息获取渠道 |
6. 现场发挥:怎么把一次GPU故障排查讲成面试加分项
问题清单背得再熟,现场表达不行也白搭。这一节我说两个真实的面试场景,一个反面、一个正面,你看完就明白差距在哪。
6.1 反面示范:只讲结论,不讲链路
面试官问:“遇到过GPU掉驱动吗?怎么处理的?”
反面回答:“遇到过,一般是把驱动重装一下就好了。”(完了)
这个回答的问题在于,面试官无法判断你是真的排查过,还是只会重启。重装驱动只是动作,你没有展示判断依据——你凭什么认为是驱动问题,而不是硬件问题?你重装之前做了哪些验证?重装之后用什么手段确认确实解决了?
6.2 正面示范:用STAR结构讲排查链路
正面回答可以这样说:
“有一次训练集群里有两张卡频繁报Xid 79错误,现象是GPU从总线掉线,任务中断。我先用dmesg -T确认错误码,再查看nvidia-smi -q -d ECC,发现其中一张卡ECC计数异常增长,另一张卡的PCIe链路降级了。初步判断不是驱动版本问题,而是硬件链路问题。于是我做了三步验证:第一,把疑似坏卡和另外一台正常机器的卡互换,看错误是否跟着走;第二,在故障机器上跑GPU-Burn压力测试,发现掉卡概率明显提升;第三,检查服务器日志,发现供电单元曾经有过一次电压异常记录。最后结论是电源供电不稳定导致GPU掉卡,不是驱动问题。处理方案是调整供电策略、更换电源模块,重新跑48小时压测和AI训练任务验证。之后还加了一个Xid错误码的告警规则,方便下次自动发现。”
这套回答好在哪?它有原因假设、有验证步骤、有技术工具(dmesg、ECC、GPU-Burn)、有最终结论、有复盘沉淀。面试官听完大概率会点头,因为你展示了一个“会思考的运维”而不是“会执行的运维”。
6.3 一个覆盖考点很全的故障案例脚本
我再帮你拆一个“容器里用不了GPU”的案例,你可以把这个案例的排查链路完整背下来,面试时尽量在叙述中带出知识点。
现象:开发反馈新起的K8s Pod里跑PyTorch报错,torch.cuda.is_available()是False。
排查链路:
- 先在节点上执行
nvidia-smi,确认物理卡和驱动正常; kubectl describe pod,看到容器资源里没有nvidia.com/gpu,发现YAML忘了配limits;- 加上limits后重启,仍然报错;
- 看device-plugin日志,发现
nvidia-container-cli初始化失败,提示library nvidia-ml.so not found; - 检查
/etc/docker/daemon.json的nvidia运行时配置,发现nvidia-container-toolkit没装好,重装后恢复; - 进容器执行
nvidia-smi,确认正常,再跑PyTorch,通过。
这个案例里面覆盖了K8s调度、容器运行时、驱动库、PyTorch环境四层知识,几乎是一串必考点的完整串联。你在面试中提到“先分物理层、再查资源层、再查运行时层”这种分层排查思维,比单纯背命令有效得多。
6.4 反问环节怎么问才显专业
面试最后,面试官一般会问“你有什么想问我的”。很多人问薪资、加班,这没错,但如果你想展示专业性,可以问这几个方向:
- “咱们这边GPU集群的规模大概是多大,调度用的是原生的K8s还是有自研平台?”
- “训练任务主要跑的是大模型微调还是CV/NLP传统模型,对显存和算力的压力点不太一样,我想了解一下。”
- “目前GPU故障的告警和自动化处理流程做到什么程度了,这是我很感兴趣的方向。”
这几个问题既体现了你对业务的关心,又显得你对技术细节有判断力。比干巴巴地问“公司福利怎么样”要强很多。
6.5 最后提醒几个心态层面的坑
第一,不要背答案。面试官追着问两句,背的和真会的一听就能分辨。第二,遇到不会的问题,最忌讳的是强行编。可以说“这个场景我没实际碰过,但基于我的理解,我会先这样排查……”——既诚实又展示思路。第三,GPU运维通常需要跟算法团队协作,面试官很在意你的沟通表达方式,回答时不要过多甩专业名词,要让人觉得你能把技术方案讲给非运维同事听。
我个人这些年带GPU集群最大的体会是:这个岗位的面试,本质上不是在考你“知道多少命令”,而是在考你“遇到没见过的故障时,有没有一套靠谱的思考框架”。把硬件、驱动、容器、AI环境四条线在脑子里搭成一个坐标系,不管面试官从哪个点切入,你都能往上下游延展。这才是这篇文章真正想帮你建立的底层能力。