共计 1967 个字符,预计需要花费 5 分钟才能阅读完成。
前言
最近在部署 AI 推理服务时,经常遇到 GPU 资源争抢、服务突然崩溃、监控数据缺失等问题。经过两个月的踩坑实践,终于搭建出稳定的生产环境。这篇笔记会手把手教你用 Kubernetes+Prometheus 构建高可用集群,特别适合从单机开发转向分布式部署的新手。

一、为什么需要专门的 AI 算力运维
刚开始做模型部署时,我习惯用 nohup 直接跑 Python 脚本,结果遇到这些典型问题:
- 资源黑洞:同事的预训练任务偷偷占满 GPU,导致线上推理延迟飙升
- 雪崩效应:某个 API 的并发量突增,连带拖垮整个物理节点
- 排查困难:没有历史监控数据,OOM 崩溃后找不到现场日志
后来发现这些都可以通过容器化编排解决:
- 资源隔离 :每个模型服务运行在独立的容器组(Pod) 中
- 故障隔离:Kubernetes 会自动重启异常容器
- 指标可视化:Prometheus 持续采集 GPU 温度、显存占用等数据
二、技术栈选型:K8s 为什么胜出
对比了几种主流方案后,最终选择组合:
| 方案 | 优点 | 缺点 |
|---|---|---|
| Docker Swarm | 简单易用 | 缺少 GPU 精细调度能力 |
| Kubernetes | 丰富的扩展机制 | 学习曲线陡峭 |
| Kubeflow | 内置 TF/PyTorch 支持 | 组件较重 |
关键决策点:
- NVIDIA 官方提供的
k8s-device-plugin完美支持 GPU 分配 - Prometheus 的
rate()函数特别适合处理突发的流量波动 - Kubeflow 的
InferenceService封装了自动扩缩容逻辑
三、手把手搭建 GPU 资源池
3.1 配置 Kubevirt 虚拟化(Ubuntu 20.04)
# gpu-pool.yaml
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
name: gpu-worker-1
spec:
domain:
devices:
gpus:
- deviceName: "nvidia.com/T4"
name: gpu1
# 预留 20% 算力给系统进程
resources:
limits:
nvidia.com/gpu: 0.8
注意事项:
- 需提前安装
nvidia-container-toolkit - 驱动版本要求 >=450.80.02
3.2 接入监控系统(CentOS 7+)
# 安装 prometheus-operator
helm install prom stable/prometheus-operator \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
# 暴露 DCGM 指标
kubectl apply -f https://raw.githubusercontent.com/NVIDIA/gpu-monitoring-tools/master/dcgm-exporter.yaml
四、关键调优技巧
4.1 自动扩缩容阈值
# hpa-config.yaml
metrics:
- type: External
external:
metric:
name: "DCGM_FI_DEV_GPU_UTIL"
target:
averageValue: 70
type: AverageValue
经验值:
- 推荐设置 70%-80% 利用率触发扩容
- 缩容阈值建议比扩容低 20%
4.2 vGPU 分片配置
# 切分 T4 显卡为 4 个 1G 实例
nvidia-smi -i 0 -cgi 1g.5gb
五、血泪教训总结
5.1 防止 OOM 误杀
在 /etc/docker/daemon.json 中添加:
{
"oom-score-adj": -500,
"memory-swappiness": 0
}
5.2 驱动版本管理
推荐用容器化方案:
FROM nvidia/cuda:11.4.0-base
RUN apt-get update && apt-get install -y --no-install-recommends \
nvidia-driver-470
六、来找茬:安全审计练习
下面这段部署清单有 3 处安全隐患,你能找到吗?
apiVersion: apps/v1
kind: Deployment
metadata:
name: vulnerable-model
spec:
replicas: 3
template:
spec:
containers:
- name: tensorflow
image: user123/private-model:latest
ports:
- containerPort: 8500
env:
- name: AWS_KEY
value: "AKIAXXXXXXXXXXXXXXXX"
nodeSelector:
gpu: "true"
结语
这套方案在电商推荐系统中稳定运行了半年,QPS 峰值达到 5000+。刚开始可能觉得 K8s 配置复杂,但熟悉后会发现比手动运维省心得多。下次准备分享如何用 Argo 实现推理流水线,欢迎关注更新!
正文完
发表至: 人工智能运维
近三天内
