这些 JD 本质指向一个统一岗位形态: Cloud Native Infrastructure Engineer for AI / LLM platform 核心职责:
-
运行超大规模 Kubernetes 集群
-
管理 GPU / HPC 资源
-
构建自动化交付与运维体系
-
优化 AI 训练与推理基础设施
-
做性能调优与可靠性工程
-
平台工程 + 调度 + 系统优化 换句话说:
Kubernetes platform engineer
+ SRE
+ distributed systems
+ GPU cluster infra
+ performance engineer
按出现频率从高到低。
几乎 100% 岗位要求。 企业级真实要求远不止 “会用”。
-
control plane 组件
-
kube-apiserver
-
etcd
-
scheduler
-
controller-manager
-
node runtime
-
kubelet
-
container runtime (containerd)
-
调度流程
-
controller reconciliation loop
-
Pod lifecycle
-
Deployment / StatefulSet
-
DaemonSet
-
Job / CronJob
-
CNI 原理
-
Overlay vs Underlay
-
Service / kube-proxy
-
Ingress / Gateway
-
网络策略
-
CSI
-
PV / PVC
-
分布式存储接入(Ceph 等)
-
多集群管理
-
HA 部署
-
滚动升级
-
容量规划
-
故障排查
-
Operator / CRD 开发
-
scheduler 扩展
-
kubelet 调优
-
control plane 性能优化
-
集群网络调优
-
GPU 调度
-
GitOps (ArgoCD / Flux)
-
多租户
-
quota
-
RBAC
-
policy engine (Kyverno / Gatekeeper)
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 | |
|---|---|---|---|
| 面试题 | 请描述 Kubernetes 的调度流程,以及如何扩展调度器? | 调度流程:1. Pod 创建后进入调度队列;2. Scheduler 通过 API Server 获取待调度 Pod;3. 过滤节点(Predicate);4. 节点打分(Priority);5. 绑定 Pod 到最优节点。扩展调度器:使用 Scheduler Framework,开发自定义的 Filter、Score 插件,或者使用 Extender 进行外部扩展。 | |
| 面试题 | 如何排查 Pod 处于 CrashLoopBackOff 状态的问题? | 1. 查看 Pod 日志:kubectl logs <pod-name> --previous;2. 查看 Pod 事件:kubectl describe pod <pod-name>;3. 检查资源限制:确认 CPU / 内存配额是否足够;4. 检查健康探针配置:确认 liveness/readiness 探针的配置是否合理;5. 检查容器启动命令:确认启动脚本或命令是否存在错误。 |
|
| 运维故障 | Pod 镜像拉取失败(ImagePullBackOff) | 1. 检查镜像名称和标签是否正确;2. 验证私有仓库认证:检查 Secret 是否配置正确,使用kubectl get secret regcred -o yaml查看;3. 测试节点网络连通性:在节点上手动拉取镜像docker pull <image-name>;4. 检查镜像仓库是否可访问:使用curl测试仓库 API 端点。 |
|
| 运维故障 | DNS 解析失败,Pod 无法通过 Service 名称访问服务 | 1. 检查 CoreDNS Pod 状态:`kubectl get pods -n kube-system | grep coredns;2. 检查Pod内的resolv.conf配置:kubectl exec -- cat /etc/resolv.conf;3. 检查网络策略:确认是否有NetworkPolicy阻止了对DNS服务的访问;4. 测试DNS解析:kubectl exec -- nslookup kubernetes.default;5. 查看CoreDNS日志:kubectl logs -n kube-system `。 |
| 运维故障 | 节点状态变为 NotReady | 1. 检查 kubelet 状态:systemctl status kubelet;2. 查看 kubelet 日志:journalctl -u kubelet -f;3. 检查节点资源:kubectl describe node <node-name>查看内存、磁盘压力;4. 检查容器运行时:确认 containerd 或 docker 是否正常运行;5. 重启 kubelet:systemctl restart kubelet。 |
不是 “会命令”,是内核级理解。
-
进程模型
-
内存管理
-
文件系统
-
TCP/IP 栈
-
namespace
-
cgroup
-
system call
-
网络调试
-
性能分析
strace
gdb
perf
tcpdump
wireshark
ebpf
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 | |
|---|---|---|---|
| 面试题 | 请描述 Linux 的启动过程 | 1. 加电自检:BIOS/UEFI 进行硬件检查;2. 引导加载程序:GRUB2 等被加载,显示启动菜单;3. 加载内核:引导程序加载内核和initramfs到内存,并解压初始化;4. 初始化进程:内核启动第一个用户空间进程systemd(或旧的init);5. 执行目标:systemd根据默认 target(如multi-user.target或graphical.target)启动相应的服务和单元;6. 登录界面:启动 getty 或显示管理器,等待用户登录。 |
|
| 面试题 | 如何排查 CPU 负载过高的问题? | 1. 确认现象:使用top或htop命令确认整体负载情况,观察load average三个值,以及%Cpu(s)行,看是用户态高还是内核态高;2. 定位进程:在top中按P按 CPU 使用率排序,找到最耗 CPU 的进程;使用 `ps aux --sort=-% cpu |
head -10列出前10个最耗CPU的进程;3. 分析进程内部:如果是Java应用,使用jstack 打印线程栈,或者结合top -H -p 找到耗CPU的线程,再将线程ID转换为16进制,在jstack的输出中搜索;如果是C/C++程序,使用perf top或strace -p 跟踪系统调用和函数调用;4. 结合其他指标:使用vmstat 1查看上下文切换次数,用iostat -x 1` 查看是否因为等待 I/O 导致 CPU 空闲。 |
| 运维故障 | 磁盘空间已满,但找不到大文件 | 1. 查看已删除但仍被进程占用的文件:`lsof +L1 | grep deleted;2. 清理这些文件对应的进程,或者清空文件内容:echo "" > /path/to/file;3. 检查inode是否耗尽:df -i,如果inode耗尽,清理大量小文件;4. 清理系统日志:journalctl --vacuum-size=1G`。 |
| 运维故障 | 内存泄漏,系统内存持续上涨 | 1. 使用free -h查看内存使用情况,available字段反映实际可用内存;2. 使用top或htop查看内存占用高的进程;3. 对于 Java 应用,使用jmap -histo:live <pid>查看堆内存使用情况,使用jstat -gc <pid> 1s查看 GC 情况;4. 对于 C/C++ 应用,使用valgrind --leak-check=full ./program进行内存泄漏检测;5. 内核内存泄漏可以使用slabtop查看 slab 分配情况。 |
|
| 运维故障 | 网络连接超时,无法访问外部服务 | 1. 检查网络连通性:ping <ip-address>;2. 检查端口是否开放:telnet <ip-address> <port>或nc -zv <ip-address> <port>;3. 检查防火墙规则:iptables -L -n或firewall-cmd --list-all;4. 检查路由表:ip route show;5. 检查 DNS 解析:nslookup <domain-name>。 |
必须理解底层实现:
-
namespace 隔离
-
cgroup 资源控制
-
image layering
-
runtime (runc / containerd)
-
镜像安全扫描
-
镜像仓库管理
-
容器启动性能
-
runtime 调优
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 | |
|---|---|---|---|
| 面试题 | 请描述 Docker 的架构组成,以及 Docker Daemon、Containerd 和 RunC 之间的关系 | Docker Client:用户与 Docker 交互的界面,接收用户命令并通过 REST API 发送给 Docker Daemon;Docker Daemon:常驻后台的进程,负责管理 Docker 对象(镜像、容器、网络、卷),并处理客户端的 API 请求,现代的dockerd将容器生命周期管理的工作下放给containerd;Containerd:行业标准的容器运行时,负责容器的创建、启动、停止、暂停、销毁等核心操作,通过containerd-shim管理每个容器的生命周期,即使containerd重启,容器也不会受到影响;RunC:轻量级的符合 OCI 标准的容器运行时工具,负责根据 OCI 规范真正创建和运行容器,containerd在需要启动容器时会调用runc命令。 |
|
| 面试题 | 如何优化 Docker 镜像的大小? | 1. 使用多阶段构建:分离开发依赖与生产代码,只将生产需要的文件复制到最终镜像;2. 使用轻量级基础镜像:如alpine替代ubuntu;3. 减少镜像层数:合并RUN命令,清理包管理器缓存;4. 使用.dockerignore文件:排除不需要的文件和目录;5. 镜像分层复用:利用 Docker 的镜像缓存机制,将变化少的层放在前面。 |
|
| 运维故障 | 容器启动后立即退出(Exited (1)) | 1. 查看容器日志:docker logs <container-id>;2. 检查容器启动命令:确认CMD或ENTRYPOINT配置是否正确;3. 检查端口冲突:确认容器要使用的端口是否被宿主机或其他容器占用;4. 检查资源限制:确认容器的 CPU / 内存限制是否足够;5. 以交互模式启动容器调试:docker run -it <image-name> sh。 |
|
| 运维故障 | 容器间无法通信 | 1. 检查容器是否在同一个网络:docker network ls,docker network inspect <network-name>;2. 检查容器的 IP 地址:`docker inspect |
grep IPAddress;3. 测试容器间的连通性:在一个容器中ping `;4. 检查防火墙规则:确认宿主机的防火墙是否阻止了容器间的通信;5. 检查 CNI 插件:如果是 Kubernetes 环境,检查 CNI 插件(如 Calico、Flannel)是否正常运行。 |
| 运维故障 | Docker 内存泄漏,宿主机内存持续上涨 | 1. 查看容器资源使用情况:docker stats;2. 检查容器内的进程:docker exec <container-id> ps aux;3. 对于 Java 应用,设置合理的 JVM 参数:-Xms和-Xmx,并使用-XX:+UseContainerSupport让 JVM 感知容器的内存限制;4. 限制容器的内存使用:docker run -m 512m <image-name>;5. 清理未使用的容器、镜像和卷:docker system prune -a。 |
企业全部要求自动化交付。
-
pipeline 设计
-
artifact 管理
-
GitOps
-
环境管理
Jenkins
GitLab CI
ArgoCD
Tekton
Helm
Kustomize
Terraform
Ansible
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 | |
|---|---|---|---|
| 面试题 | 请描述 CI/CD 的流程,以及如何设计一个高可用的 CI/CD 流水线 | CI/CD 流程:1. 开发人员提交代码到 Git 仓库;2. 触发 CI 流水线:自动构建代码、运行单元测试、构建镜像;3. 镜像扫描:扫描镜像中的漏洞;4. 部署到测试环境:自动部署到测试环境进行集成测试;5. 手动或自动批准后部署到生产环境:使用蓝绿部署、金丝雀部署等策略。高可用流水线设计:1. 多区域部署流水线组件,避免单点故障;2. 使用分布式构建节点,提高构建能力;3. 缓存依赖,减少构建时间;4. 实现流水线的监控和告警,及时发现失败的流水线;5. 实现回滚机制,当部署失败时可以快速回滚到上一个稳定版本。 | |
| 面试题 | 什么是 GitOps,它的优势是什么? | GitOps 是一种基于 Git 的运维方法,将基础设施和应用的配置存储在 Git 仓库中,通过 Git 的版本控制和 PR 流程来管理基础设施和应用的变更。优势:1. 审计追踪:所有的变更都有记录,可以追溯到具体的提交和人员;2. 回滚简单:如果变更出现问题,可以快速回滚到上一个稳定的版本;3. 协作性好:开发人员可以通过 PR 流程参与基础设施的变更;4. 一致性:确保所有环境的配置都是一致的,避免配置漂移。 | |
| 运维故障 | Jenkins 构建失败,提示依赖拉取超时 | 1. 检查网络连通性:确认 Jenkins 节点可以访问依赖仓库;2. 配置镜像源:将依赖仓库替换为国内镜像源,如 Maven 的阿里云镜像源;3. 配置依赖缓存:在 Jenkins 中配置本地缓存,或者使用代理缓存依赖;4. 增加构建超时时间:在 Jenkins 的构建配置中增加超时时间;5. 检查依赖仓库的状态:确认依赖仓库是否正常运行。 | |
| 运维故障 | 部署到 Kubernetes 时,Pod 一直处于 Pending 状态 | 1. 查看 Pod 事件:kubectl describe pod <pod-name>,确认是否是资源不足、调度失败或 PVC 绑定失败;2. 检查节点资源:kubectl describe node <node-name>,查看节点的 CPU、内存和存储资源是否充足;3. 检查 PVC 状态:kubectl get pvc <pvc-name>,确认 PVC 是否已经绑定到 PV;4. 检查调度策略:确认 Pod 的 nodeSelector、affinity 等调度策略是否匹配节点的标签;5. 检查污点和容忍:`kubectl describe node |
grep Taint`,确认 Pod 是否有对应的容忍。 |
| 运维故障 | Terraform apply 失败,提示资源已存在 | 1. 检查 Terraform 状态文件:terraform state list,确认资源是否已经在状态文件中;2. 导入已存在的资源:terraform import <resource-type> <resource-id>,将已存在的资源导入到 Terraform 的状态文件中;3. 清理状态文件:如果资源已经不存在,可以使用terraform state rm <resource-type> <resource-id>从状态文件中移除;4. 检查 Terraform 配置:确认配置文件中的资源名称和参数是否正确。 |
所有岗位强调稳定性。
-
metrics
-
logs
-
tracing
-
SLI / SLO / SLA
-
alerting
-
capacity planning
-
incident response
-
RCA
Prometheus
Grafana
ELK
OpenTelemetry
Alertmanager
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 |
|---|---|---|
| 面试题 | 请描述 SLI、SLO 和 SLA 的区别,以及如何为一个 API 服务设计 SLI 和 SLO | SLI(服务水平指标):衡量服务性能的具体指标,如 API 的响应时间、成功率;SLO(服务水平目标):对 SLI 的目标值,如 API 的 99% 请求响应时间小于 200ms,成功率大于 99.9%;SLA(服务水平协议):与客户签订的协议,包含 SLO 的承诺以及未达到承诺的赔偿条款。API 服务的 SLI 和 SLO 设计:1. 选择关键的 SLI:如请求成功率、P99 响应时间、可用性;2. 设置合理的 SLO:根据历史数据和业务需求,设置可实现的目标,如成功率 SLO 为 99.9%,P99 响应时间 SLO 为 200ms;3. 监控 SLI:使用 Prometheus 等工具收集 SLI 数据;4. 告警:当 SLI 接近 SLO 阈值时触发告警,及时处理问题。 |
| 面试题 | 如何排查一个间歇性的 API 超时问题,传统监控无法发现问题 | 1. 启用分布式追踪:使用 OpenTelemetry 等工具对 API 请求进行全链路追踪,查看请求在每个环节的耗时;2. 增加日志粒度:在 API 的关键环节增加日志,记录请求的参数、耗时和返回结果;3. 分析基础设施指标:查看服务器的 CPU、内存、磁盘 I/O 和网络指标,是否存在资源瓶颈;4. 进行压力测试:模拟高并发场景,重现问题;5. 使用 eBPF 工具:如bpftrace,跟踪系统调用和内核事件,发现潜在的问题。 |
| 运维故障 | 告警风暴,大量告警导致关键告警被淹没 | 1. 告警分级:将告警分为 P0(紧急)、P1(高)、P2(中)、P3(低),不同级别的告警使用不同的通知方式;2. 告警聚合:将相关的告警合并为一个根因告警,避免重复告警;3. 调整告警阈值:根据历史数据调整告警阈值,减少误报;4. 告警降噪:过滤掉不必要的告警,如测试环境的告警;5. 实现自动化处理:对于常见的告警,实现自动化处理脚本,自动恢复服务。 |
| 运维故障 | 日志聚合系统(ELK)性能下降,查询缓慢 | 1. 检查 Elasticsearch 的资源使用情况:查看 CPU、内存和磁盘 I/O,是否存在资源瓶颈;2. 优化索引策略:设置合理的索引生命周期,定期删除旧的索引;3. 优化查询语句:避免使用通配符开头的查询,使用过滤条件减少查询的数据量;4. 增加 Elasticsearch 节点:横向扩展 Elasticsearch 集群,提高处理能力;5. 优化分片和副本数量:根据数据量调整分片和副本的数量,提高查询性能。 |
| 运维故障 | 分布式追踪系统无法追踪到完整的请求链路 | 1. 检查追踪工具的配置:确认 OpenTelemetry 等工具是否正确配置,是否在所有服务中都启用了追踪;2. 检查 Trace ID 的传递:确认 Trace ID 在服务间的传递是否正确,是否在 HTTP 头、消息队列中传递了 Trace ID;3. 检查采样率:确认采样率是否设置过低,导致部分请求没有被追踪;4. 检查服务的日志:确认服务的日志中是否包含 Trace ID,以便关联日志和追踪数据;5. 检查网络连通性:确认追踪数据可以正常发送到追踪后端。 |
最常见:
-
Go(云原生首选)
-
Python(自动化)
-
Shell(运维)
-
控制器开发
-
调度器插件
-
infra 工具开发
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 |
|---|---|---|
| 面试题 | 请描述 Go 语言的 goroutine 和 channel 的工作原理,以及如何避免 goroutine 泄漏 | goroutine 是 Go 语言的轻量级线程,由 Go 运行时管理,goroutine 的调度由 Go 的调度器完成,使用 M-P-G 模型。channel 是 goroutine 之间的通信机制,用于在 goroutine 之间传递数据。避免 goroutine 泄漏:1. 使用context.Context控制 goroutine 的生命周期,当 context 取消时,goroutine 可以退出;2. 确保 channel 的发送和接收操作不会阻塞,使用带缓冲的 channel 或者select语句处理超时;3. 监控 goroutine 的数量:使用runtime.NumGoroutine()查看 goroutine 的数量,及时发现泄漏;4. 避免在 goroutine 中执行无限循环,确保有退出条件。 |
| 面试题 | 如何优化 Python 脚本的性能 | 1. 使用更高效的数据结构:如使用set替代list进行成员检查;2. 避免使用全局变量:全局变量的访问速度比局部变量慢;3. 使用生成器:使用生成器表达式替代列表推导式,减少内存占用;4. 并行处理:使用multiprocessing或asyncio进行并行处理,提高处理速度;5. 使用 C 扩展:对于性能敏感的部分,使用 Cython 或 C 扩展来提高性能;6. 避免循环嵌套:减少循环的嵌套层数,降低时间复杂度。 |
| 运维故障 | Go 服务 CPU 使用率 100%,无法正常处理请求 | 1. 使用pprof工具分析 CPU 使用情况:go tool pprof http://<service-ip>:6060/debug/pprof/profile,查看占用 CPU 高的函数;2. 检查是否存在死循环:查看代码中是否有无限循环的逻辑;3. 检查锁竞争:使用pprof查看是否存在锁竞争,使用sync.Map替代map减少锁竞争,或者使用分片锁;4. 检查 GC 压力:使用pprof查看 GC 的情况,减少短生命周期对象的创建,使用sync.Pool复用对象;5. 优化代码逻辑:减少不必要的计算和内存分配。 |
| 运维故障 | Python 脚本内存泄漏,内存占用持续上涨 | 1. 使用memory_profiler工具分析内存使用情况:给函数添加@profile装饰器,运行脚本查看内存变化;2. 检查是否有未释放的资源:如文件、网络连接、数据库连接,使用with语句自动释放资源;3. 检查是否有全局变量持有大量数据:避免使用全局变量存储大量数据,及时清理不再使用的变量;4. 检查是否有循环引用:使用gc模块查看循环引用,手动打破循环引用;5. 使用生成器替代列表:减少内存占用。 |
| 运维故障 | Shell 脚本执行失败,提示权限不足 | 1. 检查脚本的权限:ls -l <script-name>,确认脚本是否有执行权限;2. 添加执行权限:chmod +x <script-name>;3. 检查脚本中的命令是否有足够的权限:确认脚本中执行的命令是否需要 sudo 权限,如果需要,在脚本中添加 sudo 或者以 root 用户运行脚本;4. 检查文件路径:确认脚本中引用的文件路径是否正确,是否有访问权限。 |
这是你目标方向的分水岭。
招聘非常集中。
-
GPU 资源管理
-
多 GPU 通信
-
集群拓扑
-
分布式训练架构
CUDA
NCCL
RDMA
InfiniBand
RoCE
parallel filesystem
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 | |
|---|---|---|---|
| 面试题 | 请描述 NCCL 的工作原理,以及如何排查 NCCL 通信超时的问题 | NCCL(NVIDIA Collective Communications Library)是 NVIDIA 的集体通信库,用于在多 GPU 之间进行高效的数据通信,支持 allreduce、allgather、broadcast 等操作。NCCL 使用环形拓扑或树形拓扑进行数据通信,以提高通信效率。排查 NCCL 通信超时:1. 检查网络连接:使用ibstatus检查 InfiniBand 网络状态,使用ping测试节点间的网络连通性;2. 检查 GPU 驱动版本:确认所有节点的 GPU 驱动版本一致;3. 检查 NCCL 配置:设置NCCL_DEBUG=INFO,查看 NCCL 的日志,定位问题;4. 检查资源使用情况:确认节点的 CPU、内存和网络带宽是否充足;5. 调整 NCCL 参数:如设置NCCL_TIMEOUT增加超时时间,使用NCCL_IB_DISABLE=1禁用 InfiniBand,使用 TCP 通信。 |
|
| 面试题 | 如何管理大规模 GPU 集群的资源,提高 GPU 的利用率 | 1. 使用集群调度器:如 Slurm、Kubernetes,合理分配 GPU 资源;2. 实现资源共享:使用nvidia-cuda-mps实现多进程共享 GPU 资源;3. 动态资源调整:根据任务的需求动态调整 GPU 资源,如使用弹性训练框架,自动调整 worker 数量;4. 监控 GPU 使用情况:使用 DCGM(Data Center GPU Manager)监控 GPU 的使用率、温度、显存使用情况;5. 资源隔离:使用 cgroup 或容器技术隔离 GPU 资源,避免不同任务之间的干扰。 |
|
| 运维故障 | GPU 掉卡,系统无法识别 GPU | 1. 检查 GPU 物理连接:关机后重新插拔 GPU 卡,确认金手指无氧化;2. 检查电源供电:使用万用表检测 GPU 专用供电接口电压(通常为 12V/8Pin),确认电源功率是否足够;3. 检查 GPU 驱动:使用nvidia-smi查看驱动状态,重新安装 GPU 驱动;4. 检查系统日志:`dmesg |
grep NVRM` 查看 GPU 相关的日志,定位问题;5. 检查硬件故障:如果以上方法都无法解决,可能是 GPU 硬件故障,需要更换 GPU。 |
| 运维故障 | GPU 温度过高,触发降频保护 | 1. 检查散热系统:清理 GPU 风扇和散热器的灰尘,确认风扇是否正常运转;2. 检查机房温度:确认机房的空调是否正常工作,机房温度是否在合理范围内;3. 调整 GPU 功耗:使用nvidia-smi -pl <power-limit>降低 GPU 的功耗,减少热量产生;4. 优化任务负载:减少 GPU 的负载,避免长时间满负荷运行;5. 更换散热硅脂:如果散热硅脂干涸,更换新的散热硅脂,提高散热效果。 |
|
| 运维故障 | 分布式训练任务卡住,无错误日志 | 1. 检查网络连接:确认节点间的网络连通性,使用ibping测试 InfiniBand 网络;2. 检查 GPU 状态:使用nvidia-smi查看 GPU 的状态,确认 GPU 是否正常工作;3. 检查 NCCL 日志:设置NCCL_DEBUG=INFO,查看 NCCL 的日志,定位通信问题;4. 检查任务配置:确认分布式训练的配置是否正确,如world_size、rank等参数是否正确;5. 检查节点资源:确认节点的 CPU、内存和磁盘空间是否充足。 |
不是算法工程,而是系统工程。
-
data parallel
-
tensor parallel
-
pipeline parallel
-
expert parallel (MoE)
-
batching
-
memory 管理
-
latency 优化
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 |
|---|---|---|
| 面试题 | 请描述数据并行、张量并行和流水线并行的区别,以及它们的适用场景 | 数据并行:将数据分成多个批次,每个 GPU 处理一个批次的数据,计算梯度后进行梯度聚合,适用于模型较小,数据量较大的场景;张量并行:将模型的参数分成多个部分,每个 GPU 负责一部分参数的计算,适用于模型较大,单 GPU 无法容纳整个模型的场景;流水线并行:将模型的层分成多个阶段,每个 GPU 负责一个阶段的计算,数据在 GPU 之间流水线式传递,适用于模型非常大,层数很多的场景。 |
| 面试题 | 如何优化大模型推理的性能,降低延迟和提高吞吐量 | 1. 使用 KV Cache:缓存已计算的 Key 和 Value 矩阵,避免重复计算,减少计算量;2. 使用量化:将模型参数从 FP16 量化为 INT8 或 FP8,减少显存占用和计算量;3. 使用连续批处理(Continuous Batching):动态调整批处理大小,提高 GPU 的利用率;4. 使用推理引擎:如 vLLM、TensorRT-LLM,优化推理性能;5. 模型压缩:使用剪枝、蒸馏等方法压缩模型,减少模型大小和计算量;6. 优化内存管理:使用 PagedAttention 等技术,减少显存碎片化,提高显存利用率。 |
| 运维故障 | 大模型推理时显存不足(OOM) | 1. 使用量化:将模型参数量化为更低精度,如 INT8,减少显存占用;2. 减少批处理大小:降低推理的 batch size,减少显存使用;3. 使用 KV Cache 优化:使用 PagedAttention 等技术,减少 KV Cache 的显存占用;4. 模型并行:将模型分成多个部分,在多个 GPU 上进行推理;5. 优化推理引擎:使用 vLLM 等推理引擎,优化显存管理。 |
| 运维故障 | 大模型推理延迟过高,响应缓慢 | 1. 使用连续批处理:使用 vLLM 等推理引擎的连续批处理技术,提高 GPU 的利用率;2. 优化 KV Cache:使用 KV Cache 的压缩技术,减少 KV Cache 的显存占用,提高访问速度;3. 减少上下文长度:限制推理的上下文长度,减少计算量;4. 使用更快的硬件:使用更高性能的 GPU,如 H100,提高推理速度;5. 优化模型结构:使用更高效的模型结构,如 Flash Attention,减少计算量。 |
| 运维故障 | 训练过程中 Loss 值出现 NaN | 1. 检查数据:确认训练数据中是否有异常值,如 NaN、无穷大等,清理异常数据;2. 调整学习率:学习率过高可能导致梯度爆炸,出现 NaN,降低学习率;3. 梯度裁剪:使用梯度裁剪,限制梯度的范围,避免梯度爆炸;4. 检查模型参数:确认模型参数是否有异常值,如 NaN;5. 混合精度训练:使用混合精度训练时,检查是否有溢出问题,调整amp的配置。 |
JD 中明确出现。
本质: Transformer 推理中 缓存 attention key/value 避免重复计算 作用:
降低计算量
降低延迟
提升吞吐
-
cache memory layout
-
eviction 策略
-
GPU 显存管理
-
prefix sharing
-
paged KVCache
vLLM
TensorRT-LLM
SGLang
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 |
|---|---|---|
| 面试题 | 请描述 KV Cache 的工作原理,以及为什么缓存的是 K 和 V 而不是 Q | KV Cache 是在大模型推理时,缓存已计算的 Key 和 Value 矩阵,避免在生成每个新 token 时重复计算所有历史 token 的 K 和 V。在自回归生成过程中,生成第 t 个 token 时,只需要当前 token 的 Q,以及所有历史 token 的 K 和 V,因此缓存 K 和 V 可以避免重复计算,将计算复杂度从 O (n²) 降低到 O (n)。不需要缓存 Q 是因为每个 token 的 Q 只在生成该 token 时使用,后续生成新 token 时不需要使用之前的 Q。 |
| 面试题 | 如何优化 KV Cache 的显存占用 | 1. 使用 PagedAttention:将 KV Cache 切分成固定大小的块,按需分配显存,减少显存碎片化;2. 使用量化:将 KV Cache 量化为更低精度,如 INT8,减少显存占用;3. 使用前缀共享:对于相同的前缀,共享 KV Cache,避免重复缓存;4. 使用滑动窗口:只缓存最近的 N 个 token 的 KV Cache,丢弃更早的 KV Cache,限制显存占用;5. 使用 MQA/GQA:让多个 Query Head 共享同一组 Key/Value Head,减少 KV Cache 的显存占用。 |
| 运维故障 | KV Cache 导致显存碎片化,无法容纳更多的请求 | 1. 使用 PagedAttention 技术:如 vLLM 中的 PagedAttention,将 KV Cache 切分成块,按需分配显存,减少碎片化;2. 清理无用的 KV Cache:及时清理不再使用的 KV Cache,释放显存;3. 调整块大小:根据请求的长度调整 KV Cache 的块大小,减少内部碎片;4. 使用显存压缩:对 KV Cache 进行压缩,减少显存占用;5. 增加 GPU 显存:升级 GPU,使用更大显存的 GPU。 |
| 运维故障 | 推理时 KV Cache 命中率低,推理速度慢 | 1. 优化请求调度:将具有相同前缀的请求放在一起处理,提高前缀共享的命中率;2. 调整缓存策略:使用更高效的缓存淘汰策略,如 LRU,提高缓存命中率;3. 增加缓存大小:增加 KV Cache 的大小,缓存更多的历史数据;4. 优化模型结构:使用支持前缀共享的模型结构,提高缓存命中率;5. 减少请求的上下文长度:限制请求的上下文长度,减少 KV Cache 的大小,提高命中率。 |
| 运维故障 | 推理服务的吞吐量低,无法满足大量请求 | 1. 使用连续批处理:使用 vLLM 等推理引擎的连续批处理技术,动态调整批处理大小,提高 GPU 的利用率;2. 优化 KV Cache:使用 PagedAttention 和量化技术,减少 KV Cache 的显存占用,同时处理更多的请求;3. 水平扩展:增加推理服务的实例数量,处理更多的请求;4. 负载均衡:使用负载均衡器,将请求均匀分配到多个推理实例;5. 优化请求队列:使用高效的请求队列,减少请求的等待时间。 |
频繁出现:
Milvus
Elasticsearch
pgvector
-
部署
-
扩展
-
查询性能调优
| 类型 | 问题 / 故障 | 解决思路 / 参考答案 |
|---|---|---|
| 面试题 | 请描述向量数据库的工作原理,以及如何优化向量数据库的查询性能 | 向量数据库用于存储和查询高维向量数据,通过向量相似度匹配来查找相似的向量。工作原理:1. 向量索引:将向量数据构建成索引,如 IVF、HNSW 等,提高查询效率;2. 向量检索:根据查询向量,在索引中查找相似的向量;3. 结果排序:根据相似度对结果进行排序,返回最相似的向量。优化查询性能:1. 选择合适的索引:根据向量的维度和数据量选择合适的索引,如 HNSW 适合高维向量,IVF 适合大规模数据;2. 调整索引参数:调整索引的参数,如nlist、efConstruction等,提高索引的质量;3. 量化向量:将向量量化为更低精度,减少存储和计算量;4. 分布式部署:使用分布式向量数据库,如 Milvus 的分布式版本,提高查询性能;5. 缓存查询结果:缓存频繁查询的结果,减少查询时间。 |
| 面试题 | 如何构建一个高可用的 RAG 系统,提高检索的准确性和性能 | 1. 数据预处理:对文档进行分块、向量化,提高检索的准确性;2. 选择合适的向量数据库:如 Milvus、Elasticsearch,存储向量数据;3. 优化检索策略:使用混合检索,如关键词检索 + 向量检索,提高检索的准确性;4. 缓存检索结果:缓存频繁检索的结果,减少检索时间;5. 监控和告警:监控 RAG 系统的性能和准确性,及时发现问题;6. 动态调整:根据用户的反馈和检索结果,动态调整检索策略和模型参数。 |
| 运维故障 | 向量数据库查询缓慢,响应时间长 | 1. 检查索引状态:确认向量数据库的索引是否正常,是否需要重新构建索引;2. 调整查询参数:调整查询的参数,如ef、nprobe等,提高查询的速度;3. 检查资源使用情况:确认向量数据库的 CPU、内存和磁盘 I/O 是否充足,是否存在资源瓶颈;4. 分布式部署:将向量数据库部署在多个节点上,提高查询性能;5. 优化向量数据:对向量数据进行量化、压缩,减少存储和计算量。 |
| 运维故障 | RAG 系统检索结果不准确,无法找到相关的文档 | 1. 检查数据预处理:确认文档的分块和向量化是否正确,是否有遗漏的文档;2. 调整检索策略:调整检索的参数,如相似度阈值、检索数量等,提高检索的准确性;3. 优化向量模型:使用更合适的向量模型,如 BERT、Sentence-BERT,提高向量的质量;4. 增加数据多样性:增加更多的文档数据,提高检索的覆盖率;5. 人工审核:对检索结果进行人工审核,调整检索策略和模型参数。 |
| 运维故障 | 向量数据库无法扩容,无法存储更多的向量数据 | 1. 检查存储容量:确认向量数据库的存储容量是否充足,是否需要扩容存储;2. 分布式部署:将向量数据库部署在多个节点上,分布式存储向量数据;3. 数据归档:将旧的向量数据归档,减少存储压力;4. 优化存储策略:使用压缩、量化等技术,减少向量数据的存储占用;5. 升级硬件:升级向量数据库的硬件,使用更大容量的存储设备。 |
用于进入顶级 AI infra 团队。
-
scheduler framework
-
custom resource orchestration
-
batch scheduler (Volcano / Kueue)
-
multi-tenant GPU scheduling
常见:
KVM
QEMU
KubeVirt
目标: 统一 VM + container 调度。
必须理解:
SR-IOV
RDMA
eBPF
DPDK
VXLAN
常见:
Ceph
Lustre
BeeGFS
Weka
优化重点:
-
IO 吞吐
-
metadata 性能
-
GPU direct storage
企业极度重视:
-
GPU 利用率
-
成本优化
-
capacity modeling
这是从招聘真实路径反推的。
1 Linux internals 2 网络基础 TCP/IP 3 container runtime 4 Kubernetes cluster 运维
5 CI/CD 6 Observability 7 IaC 8 automation scripting
9 Kubernetes internal architecture 10 Operator 开发 11 scheduler 机制
12 GPU 架构 13 distributed training topology 14 HPC network 15 distributed storage
16 inference engine 17 KVCache 优化 18 memory scheduling 19 serving architecture
20 cluster scheduling algorithms 21 performance modeling 22 reliability engineering 23 cost optimization
如果压缩成一句话:
Linux system engineer
+ Kubernetes platform engineer
+ distributed systems engineer
+ GPU cluster engineer
+ LLM inference infrastructure engineer
如果目标: AI 超大规模集群 infra 正确顺序: 1 Kubernetes 内部原理 2 Linux 内核与网络 3 cluster 调度机制 4 GPU 通信架构 5 LLM 推理引擎 6 KVCache 与 memory 优化 很多人顺序是反的。
典型生产环境:
Kubernetes
+
GPU cluster
+
RDMA network
+
Ceph storage
+
Prometheus observability
+
ArgoCD GitOps
+
vLLM inference
我帮你归纳为 5 大方向: 1 Cloud Native Platform Engineering 2 AI Compute Infrastructure 3 Distributed System Scheduling 4 Performance Engineering 5 Reliability Engineering
必须具备:
-
Kubernetes 源码级理解
-
GPU 集群调优经验
-
分布式训练架构理解
-
推理性能优化经验
-
大规模生产系统运维经验
(注:文档部分内容可能由 AI 生成)