AI 基础设施运维实战指南

GPU 集群规划选型、推理网关部署、向量数据库运维、AI 服务可观测性、常见故障排查——AI 时代运维工程师必备的基础设施实战技能。

1. AI 基础设施全景图

┌─────────────────────────────────────────────────────────┐
│                    用户/业务层                            │
│  Chat UI / API Gateway / 企业内部应用                     │
├─────────────────────────────────────────────────────────┤
│                    推理网关层                             │
│  LiteLLM / vLLM Proxy / Nginx → 路由/限流/鉴权          │
├─────────────────────────────────────────────────────────┤
│                    模型服务层                             │
│  vLLM | TGI | Triton | Ollama  (推理)                    │
│  Kubeflow PyTorchJob/TFJob      (训练)                   │
├─────────────────────────────────────────────────────────┤
│                    存储层                                 │
│  模型仓库(S3/MinIO) | 向量数据库(Milvus/Qdrant)         │
│  训练数据(PVC/CEPH) | Checkpoint(对象存储)               │
├─────────────────────────────────────────────────────────┤
│                    K8s 调度层 (GPU Operator)              │
│  GPU Device Plugin | MIG | Time-slicing | Topology       │
├─────────────────────────────────────────────────────────┤
│                    硬件层                                 │
│  NVIDIA A100/H100/L40S 集群 | InfiniBand/RoCE 网络       │
└─────────────────────────────────────────────────────────┘

作为一名运维工程师,你需要管好从硬件(GPU 健康)到服务(推理延迟)的每一层。

2. GPU 集群规划与选型

2.1 GPU 型号对比与选型

GPU显存显存带宽FP16 TFLOPSNVLink适合场景云参考价(/h)
A100-40GB40GB1555 GB/s312600 GB/s训练+推理~$1.5
A100-80GB80GB2039 GB/s312600 GB/s大模型训练~$2.5
H100-80GB80GB3350 GB/s989900 GB/s最新训练~$4.0
L40S48GB864 GB/s91.6推理+微调~$1.0
A1024GB600 GB/s31.2小模型推理~$0.6
T416GB320 GB/s8.1轻量推理~$0.4

2.2 推理场景选型公式

所需显存 ≈ 模型参数量 × 精度字节数 × 1.2(KV Cache 开销)

示例:
- Qwen2.5-7B f16:  7B × 2B × 1.2 ≈ 16.8GB → A10 或 A100 40GB 单卡
- Qwen2.5-72B f16: 72B × 2B × 1.2 ≈ 173GB → A100 80GB × 4 张(tensor-parallel)
- Llama-3-70B int4: 70B × 0.5B × 1.2 ≈ 42GB → A100 40GB 或 L40S 单卡

2.3 网络要求

场景带宽需求推荐连接
单卡推理无特殊要求标准以太网
多卡推理(TP=4)> 100 GB/s GPU间NVLink
单机8卡训练> 300 GB/s GPU间NVLink + NVSwitch
多机多卡训练> 200 Gbps 节点间InfiniBand HDR/NDR 或 RoCE

3. 推理网关与流量管理

3.1 LiteLLM Proxy(推荐)

LiteLLM 作为统一推理网关,屏蔽不同模型后端的差异:

# litellm-config.yaml
model_list:
  - model_name: qwen-7b
    litellm_params:
      model: openai/qwen-7b
      api_base: http://vllm-qwen.default.svc:8000/v1
      api_key: "sk-dummy"
  - model_name: llama-70b
    litellm_params:
      model: openai/llama-70b
      api_base: http://vllm-llama.default.svc:8000/v1

router_settings:
  routing_strategy: "usage-based"       # 负载均衡
  allowed_fails: 3
  num_retries: 2
  cooldown_time: 30                      # 后端故障冷却30s

litellm_settings:
  drop_params: true                       # 自动忽略不支持的参数
  set_verbose: false
  request_timeout: 600                    # 推理超时 (秒)
  max_parallel_requests: 1000

general_settings:
  master_key: os.environ/LITELLM_MASTER_KEY

3.2 K8s 部署 LiteLLM

apiVersion: apps/v1
kind: Deployment
metadata:
  name: litellm
spec:
  replicas: 2
  selector:
    matchLabels:
      app: litellm
  template:
    metadata:
      labels:
        app: litellm
    spec:
      containers:
      - name: litellm
        image: ghcr.io/berriai/litellm:main-v1.52
        args:
        - "--config"
        - "/app/config.yaml"
        - "--port"
        - "4000"
        ports:
        - containerPort: 4000
        env:
        - name: LITELLM_MASTER_KEY
          valueFrom:
            secretKeyRef:
              name: litellm-secret
              key: master-key
        volumeMounts:
        - name: config
          mountPath: /app/config.yaml
          subPath: config.yaml
        resources:
          limits:
            cpu: 2
            memory: 4Gi
          requests:
            cpu: 500m
            memory: 1Gi
      volumes:
      - name: config
        configMap:
          name: litellm-config
apiVersion: v1
kind: Service
metadata:
  name: litellm
spec:
  selector:
    app: litellm
  ports:
  - port: 4000

# 测试推理网关
# curl http://litellm.default.svc:4000/v1/chat/completions \
#   -H "Authorization: Bearer sk-your-key" \
#   -H "Content-Type: application/json" \
#   -d '{"model":"qwen-7b","messages":[{"role":"user","content":"你好"}]}'

3.3 推理限流策略

# LiteLLM 内置限流
litellm_settings:
  rpm_per_key: 100           # 每个 API Key 每分钟最多 100 请求
  rpm_per_api_key: 200       # 总速率限制

# 或使用 K8s Ingress + Envoy rate limiting
# 保护 GPU 推理后端不被突发流量打挂

4. 向量数据库运维

4.1 选型对比

数据库定位索引算法GPU加速K8s友好推荐场景
Milvus分布式向量库IVF/HNSW/DiskANN⚠️ 组件多千万级+ 生产RAG
Qdrant轻量高性能HNSW✅ 单二进制百万级 中小规模
Chroma开发友好HNSW✅ 极简原型开发
Weaviate多模态搜索HNSW/Flat⚠️混合搜索

4.2 Qdrant 部署(推荐入门)

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: qdrant
spec:
  serviceName: qdrant
  replicas: 1
  selector:
    matchLabels:
      app: qdrant
  template:
    spec:
      containers:
      - name: qdrant
        image: qdrant/qdrant:v1.11
        ports:
        - containerPort: 6333
          name: http
        - containerPort: 6334
          name: grpc
        resources:
          limits:
            memory: 8Gi
            cpu: 4
          requests:
            memory: 2Gi
            cpu: 1
        volumeMounts:
        - name: storage
          mountPath: /qdrant/storage
        livenessProbe:
          httpGet:
            path: /health
            port: 6333
  volumeClaimTemplates:
  - metadata:
      name: storage
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 100Gi

4.3 向量数据库运维 checklist

# 健康检查
curl http://qdrant:6333/health

# 查看集合状态
curl http://qdrant:6333/collections

# 查看集群信息
curl http://qdrant:6333/cluster

# 备份:Qdrant 支持快照
curl -X POST http://qdrant:6333/collections/my_collection/snapshots

# 监控关键指标
# - 索引构建时间
# - 查询延迟 (P50/P99)
# - 磁盘使用量
# - 向量数量

5. AI 服务可观测性

5.1 推理服务关键指标

# 需要采集的指标维度
维度1 - 模型推理性能:
  - TTFT (Time To First Token):       首个 token 延迟
  - TPOT (Time Per Output Token):     每个 token 生成时间
  - E2E latency:                      端到端延迟
  - Throughput:                       tokens/s / requests/s

维度2 - GPU 资源:
  - GPU 利用率、显存占用、温度         (DCGM)
  - GPU 计算利用率 / 显存带宽利用率    (DCGM)

维度3 - 服务质量:
  - 请求成功率
  - 排队等待时间
  - OOM 事件次数

5.2 vLLM 暴露的 Prometheus 指标

# vLLM metrics endpoint
curl http://vllm-qwen:8000/metrics

# 核心指标:
vllm:num_requests_running           # 正在处理的请求数
vllm:num_requests_waiting           # 排队等待的请求数
vllm:gpu_cache_usage_perc          # KV Cache 使用率
vllm:time_to_first_token_seconds   # TTFT 直方图
vllm:time_per_output_token_seconds # TPOT 直方图
vllm:request_success_total         # 成功请求数

5.3 告警规则示例

groups:
- name: ai_inference_alerts
  rules:
  - alert: HighQueueDepth
    expr: vllm:num_requests_waiting > 100
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "模型 {{ $labels.model_name }} 排队请求 > 100,可能需要扩容"

  - alert: HighTTFT
    expr: histogram_quantile(0.95, vllm:time_to_first_token_seconds) > 3
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "P95 TTFT > 3s,用户感知延迟明显"

  - alert: OOMEvents
    expr: increase(vllm:request_failure_total{reason="OOM"}[10m]) > 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "推理 OOM,可能是并发过高或模型显存不足"

  - alert: KVCacheNearFull
    expr: vllm:gpu_cache_usage_perc > 0.95
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "KV Cache 接近满载,请求可能被阻塞"

6. 常见故障排查

6.1 GPU Pod 无法启动

# 现象
kubectl describe pod gpu-pod | grep Events
# "0/3 nodes are available: 3 Insufficient nvidia.com/gpu"

# 排查步骤
# 1. 确认节点有 GPU
kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, gpu: .status.capacity."nvidia.com/gpu"}'

# 2. 确认 Device Plugin 正常
kubectl get pods -n kube-system | grep nvidia-device-plugin

# 3. 确认 GPU 未被其他 Pod 占用
kubectl describe node <gpu-node> | grep -A5 "Allocated"

# 4. 确认无污点阻止调度
kubectl describe node <gpu-node> | grep Taints

6.2 CUDA OOM

# 现象: RuntimeError: CUDA out of memory. Tried to allocate XXX MiB

# 原因排查
# 1. 检查显存碎片(nvidia-smi 显示显存占用但无活跃进程)
nvidia-smi

# 2. 僵尸进程占用
sudo fuser -v /dev/nvidia*

# 3. 检查是否多个容器共享同一 GPU 导致超卖
kubectl get pods -A -o json | \
  jq '[.items[] | select(.spec.containers[].resources.limits."nvidia.com/gpu" != null and .spec.nodeName == "<node>") | {name: .metadata.name, ns: .metadata.namespace, gpu: .status.hostIP}]'

# 缓解措施
# - 降低 --gpu-memory-utilization (vLLM): 0.90 → 0.85
# - 降低 --max-model-len (减少 KV Cache 预留)
# - 降低 --max-num-seqs (减少并发)
# - 量化模型: bf16 → int8

6.3 NCCL 通信超时

# 现象: Watchdog caught collective operation timeout
#       NCCL WARN Net plugin not found

# 排查
# 1. 确保使用 hostNetwork 或正确的网络接口
export NCCL_SOCKET_IFNAME=eth0    # 指定 NCCL 使用的网卡

# 2. 检查防火墙/NAT 规则
kubectl run nccl-test --rm -it --image=nvidia/cuda:12.4.0-runtime-ubuntu22.04 -- \
  bash -c "apt update && apt install -y netcat-openbsd && nc -zv <peer-ip> 22"

# 3. NCCL 详细日志
export NCCL_DEBUG=INFO
export NCCL_DEBUG_SUBSYS=INIT,NET,GRAPH

# 4. 常见 NCCL 错误码
# NCCL WARN Net plugin not found → 缺少 libnccl-net.so
# NCCL WARN Failed to open libnccl-net.so → LD_LIBRARY_PATH 设置不对
# ncclSystemError → GPU 间通信链路中断

6.4 推理延迟突增

# 逐层排查
# L1: 推理服务层
kubectl logs -l app=vllm-qwen --tail=50
# 看是否有 "Preemption" "swap" 等

# L2: K8s 层
kubectl top pods -l app=vllm-qwen
# 看是否 CPU throttling / 内存压力

# L3: GPU 层
kubectl exec -it <gpu-pod> -- nvidia-smi
# 看 GPU 利用率、显存、温度、功耗

# L4: 网络层
# 推理网关 → vLLM 延迟
# 检查 Service mesh / CNI 是否有异常

# 常见根因:
# - KV Cache 满 → 请求在排队 → 扩容或降低 max-model-len
# - CPU throttling → 请求调度开销大 → 提升 CPU limits
# - GPU 降频 (温度 > 85°C) → 检查散热
# - 模型加载中 (preemption) → 加 readiness probe 延迟

7. GPU 集群运维 SOP

7.1 GPU 节点上下线

# === 新增 GPU 节点 ===
# 1. 安装驱动(如果 GPU Operator 没有 driver daemonset)
# 2. 添加节点标签
kubectl label node <new-gpu-node> \
  nvidia.com/gpu.present=true \
  accelerator=nvidia

# 3. 验证
kubectl get node <new-gpu-node> -o json | jq '.status.capacity."nvidia.com/gpu"'
kubectl -n gpu-operator logs -l app=nvidia-device-plugin

# === 下线 GPU 节点(有 GPU Pod 运行中)===
# 1. Cordon + Drain
kubectl cordon <node>
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --timeout=600s

# 2. 如果 Pod 无法驱逐(无其他 GPU 节点可调度)
# 先确认有无 GPU Pod
kubectl get pods -A --field-selector spec.nodeName=<node> -o json | \
  jq '.items[] | select(.spec.containers[].resources.limits."nvidia.com/gpu" != null)'

# 3. 手动通知用户/迁移,或缩容后再 drain

7.2 GPU 故障处理流程

GPU 告警触发

    ├─ 温度告警 → 检查机房散热、清洁风扇、降低负载

    ├─ ECC 错误 → 立即隔离节点
    │   └─ kubectl cordon <node>
    │   └─ 运行 nvidia-smi -q -d ECC 查看详情
    │   └─ 申请硬件更换

    ├─ XID 错误 → 查看 XID 码含义
    │   ├─ XID 48: Double Bit ECC Error → 硬件故障,更换GPU
    │   ├─ XID 79: GPU has fallen off the bus → PCIe 问题
    │   └─ XID 13: Graphics Engine Exception → 软件/驱动问题

    └─ Pod OOM → 不存在 GPU 硬件问题
        └─ 参考 6.2 CUDA OOM 排查

7.3 常见 XID 错误码速查

XID含义处理
13Graphics Engine Exception重启驱动,如反复出现则硬件问题
31GPU memory page fault应用 bug 或显存故障
43GPU stopped processing通常为硬件问题
45Preemptive cleanup (ECC)ECC 内存页退役,监控趋势
48Double Bit ECC Error立即更换 GPU
61Internal micro-controller error尝试重启,反复出现则更换
79GPU has fallen off the busPCIe 连接问题,检查插槽
119GPU recovery action驱动自动恢复,监控频率

8. AI 运维岗位面试高频考点

8.1 技术问题速查

问题要点
”GPU Pod 启动不了怎么排查?“Node GPU 容量 → Device Plugin 状态 → Taint/Toleration → NodeAffinity
”怎么在 K8s 上部署大模型推理?“vLLM Deployment + GPU Operator + HPA + 模型存储策略
”CUDA OOM 怎么处理?“降低 gpu-memory-utilization、降低 max-model-len、量化、增加 GPU
”GPTQ/AWQ/FP8 量化怎么选?“GPTQ(平衡)、AWQ(速度优先)、FP8(H100),需硬件支持
”多 GPU 推理怎么做?“tensor-parallel-size=N,需要 NVLink 互联
”怎么降低 GPU 成本?“MIG 分片、Spot 实例、时间片共享、量化、自动回收
”AI 推理 vs 传统 API 运维区别?“状态ful(KV Cache)、显存管理、冷启动慢、GPU 不可超卖

8.2 开放题表达框架

“你们公司的 AI 基础设施是什么架构?”

回答框架(即使没实际做过也能量化表达理解):

  1. 硬件层:A100/H100 GPU 集群 + InfiniBand/RoCE 网络
  2. 调度层:K8s + NVIDIA GPU Operator(Device Plugin + MIG + DCGM)
  3. 推理层:vLLM Deployment per model + LiteLLM 统一网关
  4. 存储层:模型仓库(S3) + PVC 热缓存 + 向量数据库(Milvus/Qdrant)
  5. 监控层:DCGM GPU 指标 + vLLM 推理指标 → Prometheus + Grafana
  6. 成本控制:MIG 多租户推理 + Spot 实例训练 + 闲置 GPU 自动回收

9. 动手实践路线

第1周: 本地 GPU 环境
├── 装 GPU 驱动 + CUDA Toolkit
├── 跑 nvidia-smi 熟悉 GPU 状态
└── docker run --gpus all nvidia/cuda nvidia-smi

第2周: K8s GPU 环境
├── 用 kind/minikube 搭建有 GPU 支持的 K8s (或用云GPU实例)
├── 装 GPU Operator
└── 部署一个 vLLM 实例,跑通推理

第3周: 推理服务化
├── 给 vLLM 加 Service + HPA
├── 用 Locust/wrk 压测,观察 GPU 指标
└── 配置 Prometheus + Grafana GPU Dashboard

第4周: 进阶
├── 部署 LiteLLM 推理网关
├── 尝试 MIG 分片
└── 部署 Qdrant 向量数据库