L2

模型部署层

Model Deployment Layer — 推理引擎管理、一键部署、弹性伸缩、灰度发布,将模型权重转化为高性能推理服务

层级编号 L2 对外接口 Inference API (OpenAI-compatible) 依赖方向 ↓ L1 (K8s API) 关键用户 MLOps 工程师 · 算法工程师 运维节奏 模型部署(分钟级) / 弹性伸缩(秒级) / 灰度发布(小时级) 主推引擎 vLLM (v0.6.3)

2. 层级定位与边界

L2 模型部署层位于 L1 基础设施层之上、L3 模型市场之下,是连接物理算力模型资产的核心桥梁。它的核心职责是将模型权重文件转化为可供外部调用的高性能推理服务,并管理这些服务的全生命周期——部署、监控、扩缩容、灰度、下线。

L2 不直接操作物理 GPU 设备,也不管理模型元数据版本,这些分别由 L1 和 L3 负责。L2 的焦点在于推理引擎的编排与运行时管理

L2 在七层架构中的定位 · 上下游边界 (B1 & B2) L2 边界规范摘要 B1 · 向上层 (L3) 提供 推理服务注册端点至 L3 部署状态实时同步 推理服务原生指标暴露 LoRA adapter 热加载状态 B1 · 不提供 (L3 职责) 模型元数据存储与版本管理 模型评测结果管理 模型权重文件管理 B2 · 向下层 (L1) 调用 K8s API: 创建/删除 GPU Pod PVC: 挂载模型权重存储 节点查询: GPU 拓扑与健康状态 监控指标: GPU 利用率/显存/温度 B2 · 不直接操作 物理 GPU 设备 (驱动/固件) 存储硬件 (Ceph OSD / NVMe) 网络硬件 (交换机/网卡) 内部组件边界 引擎管理 ↔ 部署 CRD 控制器 扩缩容控制器 ↔ K8s HPA/KEDA 灰度控制器 ↔ Istio VirtualService 关键 KPI 推理服务部署 < 30s (7B 缓存) 扩缩容响应 < 60s 灰度回滚 < 5min 推理服务可用性 ≥ 99.95% L7 · 业务应用层智能问数 · 数字人 · 智能客服 · AI 编程 L6 · 多 Agent 管理平台Agent 编排 · Skill 市场 · Tool 注册 L5 · 模型基础应用平台Agent 平台 · Dify · RAG · MCP 接入 L4 · 模型网关智能路由 · 统一鉴权 · 限流熔断 · 语义缓存 L3 · 模型市场开源模型库 · 自训练模型 · 评测平台 · 版本管理 边界 B2 (L3↔L2) 接口: Model Registry API L3 注册模型版本至 L2 部署目标 L2 将部署状态同步回 L3 L2 不管理模型元数据 L2 · 模型部署层 ★ (当前层级) 核心引擎: vLLM (主推) · TensorRT-LLM · TGI · SGLang · Triton · Xinference · Ollama · FastChat 部署管理: ModelDeployment CRD · 一键部署 · 弹性伸缩 (HPA/KEDA) · 灰度发布 (Canary/BlueGreen) · LoRA 热加载 边界 B1 (L2↔L1) 接口: K8s API L2 创建 GPU Pod 请求推理资源 L2 通过 PVC 挂载模型权重 L2 不操作物理 GPU 硬件 ▲ L1 对外接口层 (K8s API / Prometheus / CSI) L1 · 基础设施与算力管理层 K8s 编排 · GPU/NPU 算力池 · Ceph/MinIO 存储 · 高性能网络 · Prometheus + DCGM 监控 L2 通过 K8s API 创建 Pod 请求 GPU · 通过 PVC 挂载权重 · 查询 Prometheus 指标做扩缩容决策 硬件底座 NVIDIA A100-80G · H100-80G · AMD MI300X · 华为昇腾 910B · InfiniBand NDR200 · NVMe SSD · Ceph 存储集群

3. 边界规范

上游 → L3 模型市场 提供:推理服务端点注册(L2 部署成功后自动将 Service 端点注册到 L3 模型市场)、部署状态 API(L3 可查询任意模型版本的部署状态与健康情况)、LoRA adapter 热加载能力(L3 可通过 L2 API 上线/下线 adapter)。
不提供:模型元数据存储、模型版本管理、模型评测执行。这些是 L3 的核心职责,L2 只消费不管理。
下游 → L1 基础设施 调用:K8s API(创建/删除运维推理 Pod、查询节点 GPU 资源与拓扑信息、创建挂载模型权重的 PVC)、Prometheus API(查询 GPU 利用率/显存等指标用于扩缩容决策)、Istio API(配置灰度发布流量路由规则)。
不操作:物理 GPU 设备驱动、存储硬件配置、网络硬件配置。L2 只使用 L1 暴露的软件抽象层。
内部组件 引擎控制器 ↔ CRD 控制器:CRD 控制器监听到 ModelDeployment 资源变化,将期望状态转换为推理引擎 Pod 的 K8s Deployment 和 Service。
扩缩容控制器 ↔ HPA/KEDA:扩缩容控制器根据 Prometheus 指标(QPS、GPU 利用率、P99 延迟、排队深度)计算期望副本数,通过 KEDA ScaledObject 触发 HPA。
灰度控制器 ↔ Istio:灰度控制器管理 Canary/BlueGreen 策略,通过更新 Istio VirtualService 和 DestinationRule 实现流量切分。

4. 推理引擎矩阵

L2 层支持多种推理引擎,覆盖从高性能生产部署到本地开发调试的全场景需求。每种引擎有明确的选型定位和推荐用途。

vLLM v0.6.3

高性能推理引擎,PagedAttention 解决 KV Cache 显存碎片问题。平台主推引擎。

  • PagedAttention — 零显存碎片,KV Cache 利用率 >95%
  • Continuous Batching — 动态 Batch,最高吞吐
  • Prefix Caching — 相同前缀请求共享 KV Block
  • LoRA 热加载 — 在线切换 adapter 无需重启
  • 多模态支持 — LLaVA、Qwen-VL
  • OpenAI-compatible API 原生
生产主推7B-70BA100/H100
TensorRT-LLM v0.13.0

NVIDIA 官方优化引擎,极致 GPU 性能。通过图编译和 kernel 融合实现最低延迟。

  • 图编译优化 — 静态图编译器减少 kernel launch 开销
  • FP8/INT4/INT8 量化 — 原生权重压缩支持
  • Inflight Batching — 请求级动态调度
  • 多节点流水线并行 — PP > 1 的大模型部署
  • NVIDIA 生态深度集成 — Triton + NIM
极致性能70B+仅 NVIDIA
TGI v2.3.0

HuggingFace 官方推理引擎,与 HF 生态原生集成,开箱即用。

  • HF 原生集成 — 自动下载 tokenizer/config
  • Continuous Batching — 与 vLLM 类似的动态调度
  • Watermarking — 生成文本水印(IWSLM)
  • Message API — Chat Template 原生支持
  • 安全护栏 — 敏感词过滤、内容审核
快速验证HF 生态
SGLang v0.4.0

新一代推理引擎,RadixAttention 技术实现极致结构化生成和 JSON Mode 性能。

  • RadixAttention — 前缀树缓存,共享前缀零开销
  • Structured Generation — JSON Schema / Regex 约束解码
  • Function Calling 原生 — OpenAI 工具调用模式
  • 多模态 — LLaVA-NeXT、Qwen2-VL
  • 数据流 DAG 编程模型
结构化输出JSON Mode
Triton Inference Server v24.05

NVIDIA 多框架推理服务框架,支持多模型并发部署和动态批处理。

  • Multi-framework — TensorRT/ONNX/PyTorch/自定义后端
  • Multi-model colocation — 同一 GPU 部署多个模型
  • Dynamic Batching — 自适应合并请求
  • Model Ensemble — 模型管线编排
  • Prometheus 原生监控
多模型托管生产级
Xinference v0.14.0

多模态模型统一管理与部署平台,提供可视化管理界面。

  • 多模态统一管理 — LLM + Embedding + Rerank + Image
  • 内置模型市场 — 一键下载 HuggingFace 模型
  • Web UI — 非工程师可操作的可视化界面
  • LoRA 管理 — adapter 上传与切换
  • OpenAI-compatible API
快速实验多模态
Ollama v0.3.12

本地模型运行工具,一键拉起模型。适用于开发调试和小规模场景。

  • 一键启动 — ollama run llama3.1:70b
  • Modelfile — 自定义模型配置
  • 内置模型库 — 千种模型可用
  • 多平台 — Mac/Windows/Linux
  • OpenAI-compatible API
本地开发轻量
FastChat v0.2.36

轻量级对话模型推理框架,OpenAI API 兼容度高。

  • OpenAI API 兼容 — 无缝适配现有工具链
  • 多模型管理 — Controller + Worker 架构
  • Gradio Web UI — 交互式对话界面
  • Benchmark 工具 — MT-Bench 评测
  • 多轮对话优化
轻量推理兼容性

4.1 vLLM 深度剖析(主推引擎)

4.1.1 架构设计

vLLM 的核心架构由调度器 (Scheduler)Block ManagerWorker 进程API Server 四部分组成。调度器负责任务调度和抢占,Block Manager 实现 PagedAttention 的显存管理,Worker 执行实际的模型推理,API Server 提供 OpenAI-compatible 的 HTTP 接口。

vLLM 核心架构图 — Scheduler · Block Manager · Worker · API Server API Server (FastAPI / OpenAI-compatible API) /v1/chat/completions · /v1/completions · /v1/embeddings /v1/models · /v1/loRA/models · /v1/loRA/adapters Streaming · Tokenize · Async Engine 调用 Scheduler (调度器) 等待队列 → Scheduling Policy → 序列组管理 抢占策略 (preemption-mode: swap/recompute) max-num-seqs · max-num-batched-tokens · 调度间隔 Continuous Batching: 每个 forward pass 动态填入/移除序列 调度 Block Manager (PagedAttention 显存管理器) Block 1 Block 2 Block 3 Block 4 Block 5 Block 6 ... 逻辑 KV Block 池 Block size: 16 tokens/block · 支持 Prefix Caching Copy-on-Write · All-or-Nothing 预分配 · 显存利用率 >95% 分配/释放 Block Worker 进程组 (Ray / MP 分布式推理) Worker 0 (GPU 0) TP Rank 0 · PP Stage 0 Attention Layer 0-15 Worker 1 (GPU 1) TP Rank 1 · PP Stage 0 Attention Layer 0-15 ... Worker 2 (GPU 2) TP Rank 2 · PP Stage 0 Attention Layer 0-15 Worker N-1 TP Rank N-1 TP=8 / PP=1 模型权重: L1 对象存储 (MinIO) → PVC 挂载 → 显存加载 权重格式: safetensors · 量化格式: FP8/INT4/AWQ/GPTQ · LoRA adapter 存储: 独立 S3 路径 监控指标 (Prometheus) vllm:num_requests_running · vllm:num_requests_waiting · vllm:gpu_cache_usage · engine:request_throughput · engine:generation_tokens_per_second LoRA 热加载 (可选模块) LoRA 管理器 · adapter 上传 API · 请求级别路由 · 热切换零中断 序列任务 KV Block + 序列 调度器 显存管理 Worker 进程 API Server 监控 LoRA 热加载

4.1.2 启动配置详解

vLLM 的启动参数直接影响推理性能、显存利用率和吞吐。以下展示推理 API 服务的完整启动命令和关键参数说明:

# vLLM 启动命令 — Llama 3.1 70B (8×A100-80G, TP=8)
python -m vllm.entrypoints.openai.api_server \
  --model /models/llama3.1-70b \
  --tensor-parallel-size 8 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.95 \
  --max-num-seqs 256 \
  --max-num-batched-tokens 8192 \
  --enable-prefix-caching \
  --enable-lora \
  --max-lora-rank 64 \
  --lora-extra-vocab-size 256 \
  --lora-dtype auto \
  --dtype bfloat16 \
  --kv-cache-dtype fp8 \
  --port 8000 \
  --host 0.0.0.0 \
  --trust-remote-code \
  --enforce-eager \
  --seed 42

# 参数说明表:
# --tensor-parallel-size      张量并行度, 每张卡处理一部分 hidden dimension
# --max-model-len             最大序列长度 (prompt + generation), OOM 保护
# --gpu-memory-utilization    KV Cache 使用的显存比例, 剩余留给模型权重
# --max-num-seqs              最大并发序列数, 越大吞吐越高但延迟增加
# --max-num-batched-tokens    每个 batch 最大 token 数
# --enable-prefix-caching     相同前缀请求共享 KV Block, 减少重复计算
# --enable-lora               LoRA adapter 热加载支持
# --max-lora-rank             最大 LoRA rank 值 (8/16/32/64)
# --kv-cache-dtype fp8        使用 FP8 格式存储 KV Cache, 节省 50% 显存
# --enforce-eager             禁用 CUDA graph, 减少显存占用 (调试用)

4.1.3 性能基准测试

以下数据基于平台内部测试环境(A100-80G SXM, NVLink Full Mesh, InfiniBand NDR200)采集。测试工具使用 vLLM benchmark 套件,数据集为 ShareGPT 真实请求跟踪。

模型GPU 配置Batch SizeInput LenOutput Len吞吐 (tokens/s)P50 TTFTP99 TTFTP50 ITLP99 ITL
Llama 3.1 8B 1×A100-80G 128 512 256 4,820 38ms 142ms 8ms 32ms
Llama 3.1 8B 1×H100-80G 128 512 256 7,150 26ms 98ms 5ms 21ms
Llama 3.1 70B 4×A100-80G 64 1024 512 2,340 185ms 620ms 42ms 168ms
Llama 3.1 70B 8×A100-80G 128 1024 512 3,890 120ms 410ms 26ms 105ms
Llama 3.1 70B 8×H100-80G 128 1024 512 6,200 82ms 290ms 17ms 68ms
Mixtral 8×22B 4×A100-80G 64 1024 512 1,850 210ms 720ms 55ms 195ms
Qwen3 235B-A22B 8×A100-80G 128 2048 512 2,680 260ms 890ms 38ms 152ms
注意事项:以上数据为实验室环境测试结果。生产环境中实际吞吐受网络延迟、并发模型数量、输入长度分布、Prefix Cache 命中率等综合因素影响,通常为实验室数据的 60%-80%。建议基于真实负载做压测后确定容量规划。

4.1.4 LoRA 热加载机制

LoRA (Low-Rank Adaptation) 热加载允许在不重启推理服务的情况下动态切换模型行为(如领域微调、角色扮演、风格迁移)。vLLM 通过独立的 LoRA 管理器维护多个 adapter,每个推理请求可按需选择使用不同的 adapter。

LoRA 架构设计

# LoRA adapter 上传 API
POST /v1/loRA/adapters
Content-Type: multipart/form-data

# 请求体
{
  "lora_name": "my-custom-adapter",
  "lora_path": "s3://lora-adapters/finance-v2/adapter.safetensors",
  "base_model": "llama3.1-70b",
  "max_lora_rank": 64,
  "version": "v2.1.0"
}

# 响应
HTTP/1.1 201 Created
{
  "lora_name": "my-custom-adapter",
  "status": "loading",
  "estimated_load_time": "12s",
  "adapter_id": "lora-abc123-def456"
}

---

# LoRA adapter 列表查询
GET /v1/loRA/adapters

# 响应
HTTP/1.1 200 OK
{
  "adapters": [
    {
      "name": "my-custom-adapter",
      "status": "active",          # active | loading | error
      "base_model": "llama3.1-70b",
      "rank": 64,
      "version": "v2.1.0",
      "gpu_memory_mb": 128,
      "created_at": "2026-06-01T10:30:00Z",
      "loaded_at": "2026-06-01T10:30:15Z",
      "request_count": 1520
    }
  ]
}

---

# 请求级别 LoRA 路由示例
POST /v1/chat/completions
Content-Type: application/json

{
  "model": "llama3.1-70b@my-custom-adapter",  # base@adapter 路由
  "messages": [
    {"role": "user", "content": "What is the RSI of AAPL?"}
  ],
  "temperature": 0.1
}

# 响应 (使用 LoRA adapter 微调后的模型回复)
HTTP/1.1 200 OK
{
  "model": "llama3.1-70b@my-custom-adapter",
  "choices": [{
    "message": {
      "content": "Based on the latest data, AAPL's RSI(14) is 58.3, indicating neutral momentum..."
    }
  }],
  "usage": {
    "prompt_tokens": 18,
    "completion_tokens": 42,
    "total_tokens": 60
  }
}

4.2 引擎选型决策树

选择一个推理引擎需要在吞吐延迟显存效率生态兼容运维复杂度之间权衡。以下是平台推荐的选型决策路径。

模型部署引擎选型决策树 ┌─ 是否需要多框架支持 (TensorRT/ONNX/PyTorch/自定义)? │ ├─ 是 → Triton Inference Server │ └─ 否 → 继续 │ ├─ 是否要求极致 GPU 性能 (NVIDIA 专用)? │ ├─ 是 → TensorRT-LLM │ └─ 否 → 继续 │ ├─ 是否需要结构化生成 (JSON Schema / Regex 约束)? │ ├─ 是 → SGLang (RadixAttention + 约束解码) │ └─ 否 → 继续 │ ├─ 是否是多模态/可视化部署? │ ├─ 是 → Xinference (Web UI + 多模态统一管理) │ └─ 否 → 继续 │ ├─ 是否为本地开发/测试场景? │ ├─ 是 → Ollama (一键启动, 模型库丰富) │ └─ 否 → 继续 │ ├─ 是否仅需轻量对话 API 测试? │ ├─ 是 → FastChat (OpenAI 兼容度高) │ └─ 否 → 继续 │ └─ 默认选择 → vLLM (主推引擎) PagedAttention 极致显存利用率 Continuous Batching 最高吞吐 Prefix Caching 减少重复计算 LoRA 热加载 灵活微调 OpenAI-compatible API 开箱即用 HuggingFace 生态原生支持 多模态逐步完善 (LLaVA/Qwen-VL) 社区最活跃, 迭代最快 ───────────────────────────────────────────── 组合推荐 (多引擎混合部署): ├─ 生产主力: vLLM (80% 模型) ├─ 性能优先: TensorRT-LLM (15% 模型, 70B+ 高 QPS 场景) ├─ 特殊需求: SGLang (结构化输出场景) ├─ 多模型托管: Triton (模型 Ensemble / 多框架共存) └─ 开发调试: Ollama / FastChat (非生产环境)
推荐策略:vLLM 作为平台默认推理引擎,覆盖 80% 以上的模型部署场景。对于需要极致 GPU 性能的 70B+ 大模型高并发场景选用 TensorRT-LLM。对于 JSON Schema 约束的结构化输出场景选用 SGLang。对于需要同时部署多个框架模型的场景选用 Triton Inference Server。

5. 一键部署

L2 模型部署层提供一键部署 (One-Click Deployment) 能力,用户只需选择模型、引擎和资源配置,平台自动完成推理 Pod 创建、权重挂载、Service 暴露和监控集成。

5.1 部署流程

1 选择模型权重
2 选择推理引擎
3 配置资源 (GPU/显存/TP/PP)
4 配置扩缩容策略
5 配置灰度策略
6 执行部署
7 自动完成 (注册到 L3 + 监控接入)

启动时间目标

< 30s
7B 模型 (镜像缓存)
镜像已缓存, 权重热加载
< 2min
70B 模型 (镜像缓存)
TP=4/8, 镜像已缓存
< 5min
7B 模型 (冷启动)
首次拉取镜像 + 下载权重
< 15min
70B 模型 (冷启动)
首次拉取镜像 + 权重 140GB+

5.2 ModelDeployment CRD

平台通过自定义 CRD (Custom Resource Definition) 定义模型部署的期望状态。CRD 控制器将期望状态同步为 K8s 原生资源(Deployment、Service、HPA 等)。

# ModelDeployment CRD 完整定义示例
apiVersion: ai.platform/v1
kind: ModelDeployment
metadata:
  name: llama3-1-70b-production
  namespace: inference
  labels:
    model: llama3.1-70b
    engine: vllm
    environment: production
    team: ai-platform
spec:
  # ── 模型与引擎 ──
  model:
    name: llama3.1-70b
    version: "v1.0.0"
    source:
      type: S3
      path: s3://model-weights/llama3.1-70b/
      format: safetensors
      size: 140Gi                    # 权重文件总大小
    quantization: bf16               # bf16 | fp8 | int4 | awq | gptq
    engine:
      type: vllm                     # vllm | tensorrt-llm | tgi | sglang
      version: "0.6.3"
      image: registry.internal/vllm:v0.6.3-cuda12.4
      args:
        tensor-parallel-size: 8
        max-model-len: 8192
        gpu-memory-utilization: 0.95
        max-num-seqs: 256
        max-num-batched-tokens: 8192
        enable-prefix-caching: true
        enable-lora: true
        max-lora-rank: 64
        kv-cache-dtype: fp8
        dtype: bfloat16
        trust-remote-code: true

  # ── 资源规格 ──
  resources:
    replicas: 2                      # 初始副本数
    gpu:
      type: nvidia-a100-80g
      count: 8                       # 每副本 GPU 数量
    cpu: "64"
    memory: "512Gi"
    ephemeral-storage: "100Gi"
    nodeSelector:
      accelerator-model: "A100-SXM-80GB"
      accelerator-count: "8"

  # ── 存储 ──
  storage:
    model-weight:
      storageClass: minio-csi
      size: 200Gi
      existingClaim: ""              # 空则自动创建 PVC
    lora-adapters:
      storageClass: minio-csi
      size: 50Gi
    cache:
      storageClass: nvme-local
      size: 100Gi
      mountPath: /mnt/cache

  # ── 网络 ──
  network:
    serviceType: ClusterIP
    ports:
    - name: http
      port: 8000
      targetPort: 8000
    ingress:
      enabled: true
      host: llama3-70b.api.internal
      annotations:
        nginx.ingress.kubernetes.io/proxy-read-timeout: "600"

  # ── 扩缩容 ──
  scaling:
    minReplicas: 2
    maxReplicas: 10
    metrics:
    - type: QPS
      target: 100                    # 每副本 QPS > 100 扩容
    - type: GPUUtilization
      target: 70                     # GPU 利用率 > 70% 扩容
    - type: P99Latency
      target: 3000                   # P99 延迟 > 3s 扩容 (ms)
    - type: QueueDepth
      target: 50                     # 排队请求 > 50 扩容
    scaleDownStabilization: 300      # 缩容稳定窗口 (秒)
    scaleUpStabilization: 60         # 扩容稳定窗口 (秒)

  # ── 灰度发布 ──
  rollout:
    strategy: RollingUpdate           # RollingUpdate | BlueGreen | Canary
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    canary:                           # Canary 策略配置
      steps:
      - weight: 10
        duration: 10m                 # 10% 流量验证 10 分钟
      - weight: 50
        duration: 30m                 # 50% 流量验证 30 分钟
      - weight: 100
        duration: 10m                 # 全量
      metrics:
        - errorRate < 0.01            # 错误率 < 1%
        - p99Latency < 3000           # P99 延迟 < 3s
        - gpuUtilization < 90         # GPU 利用率 < 90%

  # ── 健康检查 ──
  health:
    readinessProbe:
      httpGet:
        path: /health
        port: 8000
      initialDelaySeconds: 60
      periodSeconds: 10
      timeoutSeconds: 5
    livenessProbe:
      httpGet:
        path: /health
        port: 8000
      initialDelaySeconds: 120
      periodSeconds: 30
      timeoutSeconds: 10

  # ── 监控集成 ──
  monitoring:
    metrics:
      enabled: true
      port: 8000
      path: /metrics
    logs:
      enabled: true
      collector: fluent-bit
    traces:
      enabled: false

  # ── 安全 ──
  security:
    serviceAccount: inference-sa
    networkPolicy:
      enabled: true
      allowedSources:
      - namespace: gateway
    podSecurityContext:
      runAsUser: 1000
      fsGroup: 2000

---
# 部署状态 (由控制器更新)
apiVersion: ai.platform/v1
kind: ModelDeployment
metadata:
  name: llama3-1-70b-production
  namespace: inference
status:
  phase: Running                     # Pending | Deploying | Running | Scaling | Upgrading | Failed
  replicas: 2
  readyReplicas: 2
  availableReplicas: 2
  endpoint: "http://llama3-1-70b-production.inference:8000"
  engineStatus: Healthy
  conditions:
  - type: Deployed
    status: "True"
    lastTransitionTime: "2026-06-02T10:30:00Z"
  - type: Scaled
    status: "True"
    reason: "QPS threshold not reached"
  currentScale: 2
  targetScale: 2
  observedGeneration: 3

6. 自动扩缩容

L2 层支持多层次自动扩缩容策略,覆盖不同的业务场景和负载模式。扩缩容决策基于多个维度的指标综合判断,避免单一指标误触发。

6.1 HPA (水平扩缩) 与 VPA (垂直扩缩)

维度HPA (Horizontal Pod Autoscaler)VPA (Vertical Pod Autoscaler)
调整对象 Pod 副本数 Pod 的 CPU/Memory 资源 request/limit
适用场景 QPS 波动、GPU 利用率变化、延迟变化 CPU/Memory 长期配置不合理(不推荐调整 GPU)
GPU 适配 ✅ 通过 KEDA Prometheus 触发器支持 GPU 指标 ⚠️ 不推荐调整 GPU 显存。GPU 分配是设备级资源,VPA 无法热调整
推荐策略 主力推荐。配合 KEDA 实现 GPU 感知弹性伸缩 仅 CPU/Memory 维度。GPU 资源建议通过 HPA 增减副本

6.2 KEDA ScaledObject 配置

KEDA 通过 Prometheus 触发器实现 GPU 感知自动伸缩,支持同时监控多个指标维度:

# KEDA ScaledObject — 推理服务 GPU 感知自动伸缩
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: llama3-70b-scaler
  namespace: inference
spec:
  scaleTargetRef:
    name: llama3-1-70b-deployment
    apiVersion: apps/v1
    kind: Deployment
  pollingInterval: 15                # 每 15 秒查询一次指标
  cooldownPeriod: 120                # 触发条件消失后等待 2 分钟再缩容
  minReplicaCount: 2
  maxReplicaCount: 10
  advanced:
    horizontalPodAutoscalerConfig:
      behavior:
        scaleDown:
          stabilizationWindowSeconds: 300
          policies:
          - type: Percent
            value: 50                 # 每次最多缩容 50% 副本
            periodSeconds: 60
        scaleUp:
          stabilizationWindowSeconds: 60
          policies:
          - type: Pods
            value: 4                  # 每次最多扩容 4 个副本
            periodSeconds: 60
          - type: Percent
            value: 100
            periodSeconds: 60
          selectPolicy: Max           # 取最大值

  triggers:
  # 触发器 1: GPU 利用率
  - type: prometheus
    metricType: AverageValue
    metadata:
      serverAddress: http://prometheus-server.monitoring:9090
      query: |
        avg(
          avg_over_time(
            DCGM_FI_DEV_GPU_UTIL{
              pod=~"llama3-1-70b-deployment-.*"
            }[2m]
          )
        ) by (pod)
      threshold: "70"                 # GPU 利用率平均值 > 70% 扩容
      activationThreshold: "10"       # GPU 利用率 < 10% 缩容时忽略

  # 触发器 2: QPS (每秒请求数)
  - type: prometheus
    metricType: AverageValue
    metadata:
      serverAddress: http://prometheus-server.monitoring:9090
      query: |
        sum(rate(
          vllm:request_prometheus_requests_total{
            pod=~"llama3-1-70b-deployment-.*"
          }[1m]
        )) by (pod)
      threshold: "100"                # 每副本 QPS > 100 扩容
      activationThreshold: "5"

  # 触发器 3: P99 延迟
  - type: prometheus
    metricType: AverageValue
    metadata:
      serverAddress: http://prometheus-server.monitoring:9090
      query: |
        histogram_quantile(0.99,
          sum(rate(
            vllm:request_prometheus_ttft_seconds_bucket{
              pod=~"llama3-1-70b-deployment-.*"
            }[2m]
          )) by (le)
        )
      threshold: "3"                  # P99 TTFT > 3s 扩容 (单位: 秒)
      activationThreshold: "0.5"

  # 触发器 4: 排队深度
  - type: prometheus
    metricType: AverageValue
    metadata:
      serverAddress: http://prometheus-server.monitoring:9090
      query: |
        avg(
          vllm:num_requests_waiting{
            pod=~"llama3-1-70b-deployment-.*"
          }
        ) by (pod)
      threshold: "50"                 # 排队请求 > 50 扩容
      activationThreshold: "5"

6.3 Scale to Zero (缩零能力)

对于非核心或实验性模型服务,平台支持 Scale to Zero 能力,在不使用时自动将副本数缩减至零,节省 GPU 资源。当请求到来时通过 Knative/KEDA 冷启动恢复。

特性说明配置
零副本休眠 无请求时 Pod 数归零,释放 GPU minReplicaCount: 0
冷启动恢复 请求到达时自动创建 Pod 并加载模型 KEDA ScaledObject + Knative
冷启动时间 7B < 30s, 70B < 2min (镜像缓存) Stargz 镜像懒加载 + 模型预热
适用场景 实验模型、低频调用模型、开发测试环境 按需启用
# KEDA ScaledObject — Scale to Zero 配置
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: experimental-model-scaler
  namespace: inference-dev
spec:
  scaleTargetRef:
    name: experimental-model-deployment
  minReplicaCount: 0                  # 缩零
  maxReplicaCount: 3
  triggers:
  - type: prometheus
    metricType: AverageValue
    metadata:
      serverAddress: http://prometheus-server.monitoring:9090
      query: |
        sum(rate(
          istio_requests_total{
            destination_workload="experimental-model",
            destination_service_namespace="inference-dev"
          }[5m]
        ))
      threshold: "1"                  # 只要有请求就扩容
      activationThreshold: "0"
  advanced:
    horizontalPodAutoscalerConfig:
      behavior:
        scaleDown:
          stabilizationWindowSeconds: 600   # 无请求 10 分钟后缩零
          policies:
          - type: Pods
            value: 1
            periodSeconds: 60

6.4 定时弹性扩缩

可预见的业务高峰(如上班早高峰、促销活动)通过定时弹性策略预先扩容,消除冷启动延迟的影响。

# KEDA ScaledObject — 定时弹性 (Cron 触发器)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: scheduled-scale-pre-warm
  namespace: inference
spec:
  scaleTargetRef:
    name: llama3-1-70b-deployment
  minReplicaCount: 2
  maxReplicaCount: 20
  triggers:
  - type: cron
    metadata:
      timezone: Asia/Shanghai
      start: 0 8 * * *               # 早 8 点开始扩容
      end: 0 10 * * *                # 早 10 点结束
      desiredReplicas: "15"          # 高峰前预扩到 15 副本
  - type: cron
    metadata:
      timezone: Asia/Shanghai
      start: 0 18 * * *              # 晚 6 点开始扩容
      end: 0 22 * * *                # 晚 10 点结束
      desiredReplicas: "12"
  - type: cron
    metadata:
      timezone: Asia/Shanghai
      start: 0 0 * * *               # 夜间缩容
      end: 0 6 * * *
      desiredReplicas: "3"

6.5 预热策略

新启动的推理 Pod 在接入真实流量前需要预热,确保模型权重完全加载、KV Cache 填充到工作状态、CUDA kernel 编译完成。预热不充分会导致首个请求延迟极高(tail latency spike)。

# 预热配置 — 嵌入 ModelDeployment 中
spec:
  warmup:
    enabled: true
    strategy: prewarm-requests        # prewarm-requests | prewarm-mock | prewarm-cached
    requests:
    - prompt: "Hello, this is a warmup request. Please generate a short response."
      maxTokens: 128
      count: 10                       # 发送 10 个预热请求
    concurrency: 4                    # 预热并发数
    timeout: 120                      # 预热超时 (秒)
    readinessCondition:               # 预热完成才能就绪
      minSuccessfulRequests: 8        # 至少 8 个请求成功
      maxP95LatencyMs: 5000           # P95 延迟 < 5s

7. 灰度发布

模型服务的升级(引擎版本变更、模型权重替换、配置参数调整)采用灰度发布机制,逐步将流量切到新版本,在可观测指标异常时自动回滚。

7.1 发布策略对比

策略机制流量切分回滚速度适用场景
RollingUpdate 逐 Pod 替换 N/A 分钟级 小版本更新、Bugfix、配置变更
BlueGreen 新版本全量部署 → 一次切换 全部切换到新版本 秒级 (DNS/Service 切换) 模型权重替换、引擎升级、大规模变更
Canary 逐步增加新版本流量百分比 10% → 50% → 100% 秒级 (调权重) 重大变更、需要真实流量验证

7.2 Canary 步骤示例

10%
10 min
初始验证
25%
15 min
扩大范围
50%
30 min
半数验证
100%
10 min
全量完成

7.3 Canary 灰度发布 YAML 配置

# Istio VirtualService + DestinationRule — Canary 灰度
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: llama3-70b-canary
  namespace: inference
spec:
  hosts:
  - llama3-70b.inference.svc.cluster.local
  http:
  - match:
    - headers:
        x-canary:
          exact: "true"              # 特定 Header 流量到新版本
    route:
    - destination:
        host: llama3-70b-v2
      weight: 100
  - route:
    - destination:
        host: llama3-70b-v2          # 新版本 v2
      weight: 10
    - destination:
        host: llama3-70b-v1          # 旧版本 v1
      weight: 90
    timeout: 60s
    retries:
      attempts: 2
      perTryTimeout: 30s
---
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: llama3-70b-destination
  namespace: inference
spec:
  host: llama3-70b-v2
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 128
        maxRequestsPerConnection: 100
    outlierDetection:
      consecutive5xxErrors: 5
      interval: 30s
      baseEjectionTime: 5m
      maxEjectionPercent: 50

7.4 自动回滚机制

灰度发布过程中,控制器持续监控关键指标。当检测到异常时自动回滚到上一版本,无需人工介入。

# 自动回滚配置 (嵌入 ModelDeployment rollout 策略)
spec:
  rollout:
    strategy: Canary
    canary:
      steps:
      - weight: 10
        duration: 10m
        metrics:                      # 每个 step 的验证指标
        - name: error-rate
          query: |
            sum(rate(
              istio_requests_total{
                destination_workload="llama3-70b-v2",
                response_code=~"5.."
              }[5m]
            )) / sum(rate(
              istio_requests_total{
                destination_workload="llama3-70b-v2"
              }[5m]
            ))
          threshold: 0.01              # 错误率 > 1% 回滚
        - name: p99-latency
          query: |
            histogram_quantile(0.99,
              sum(rate(
                istio_request_duration_milliseconds_bucket{
                  destination_workload="llama3-70b-v2"
                }[5m]
              )) by (le)
            )
          threshold: 5000              # P99 延迟 > 5s 回滚 (ms)
        - name: gpu-utilization
          query: |
            avg(
              DCGM_FI_DEV_GPU_UTIL{
                pod=~"llama3-70b-v2-.*"
              }
            )
          threshold: 95                # GPU 利用率 > 95% 回滚
      - weight: 50
        duration: 30m
        metrics:
        - name: error-rate
          query: "..."
          threshold: 0.01
        - name: p99-latency
          threshold: 5000
      rollback:
        action: immediate              # immediate | gradual (逐步撤流)
        notification:
          channel: feishu
          severity: critical

8. 性能优化

推理服务的性能优化涉及引擎配置硬件利用请求调度模型优化四个维度。以下是经验证的 10 项优化技术及其预期收益。

#优化技术说明预期收益适用场景
1 PagedAttention (vLLM) 将 KV Cache 划分为固定大小的 Block 管理,消除显存碎片。对比 HuggingFace 原生实现,KV Cache 利用率从 ~40% 提升至 >95% 吞吐 +150% 所有模型
2 Continuous Batching 每个 forward pass 动态决定哪些序列参与计算。完成生成的序列立即移除,新序列立即加入。对比 Static Batching 减少 GPU 空闲等待 吞吐 +80% 所有模型
3 Prefix Caching 相同前缀(如 System Prompt、Few-shot Examples)的请求共享 KV Block,避免重复计算 Multi-Head Attention 的前缀部分 TTFT -60% 共享 system prompt / few-shot
4 FP8 KV Cache 将 KV Cache 从 FP16 降为 FP8 存储,显存占用减半。支持更大 Batch Size 或更长序列。vLLM 通过 --kv-cache-dtype fp8 启用 吞吐 +40% H100 (原生 FP8) / A100 (模拟 FP8)
5 CUDA Graph 优化 将模型 forward pass 编译为 CUDA Graph,消除 kernel launch 开销。vLLM 默认启用(除非 --enforce-eager) 延迟 -30% 所有模型,小 batch 场景
6 模型量化 (FP8/INT4/AWQ) 将模型权重从 FP16 量化到 FP8(损失 <0.5%)或 INT4/AWQ(损失 <1%),显存减半或减 75%。70B 模型量化到 INT4 后可用单张 A100 部署 吞吐 +50% ╱ 显存 -50% 量化后可用更少 GPU
7 Tensor Parallelism 调优 TP 在 GPU 间切分 attention 头和 FFN 参数。TP=2 时性能最优(NVLink 高带宽),超过 8 时通信开销增加。建议 70B 使用 TP=4 或 TP=8 吞吐 +30% 多 GPU 部署
8 max-num-seqs 调整 增加并发序列数可以提高吞吐,但超过阈值会因显存不足导致 OOM 或延迟剧增。建议通过实验确定:7B: 256-512, 70B: 64-128 吞吐 +25% 高 QPS 场景
9 PD 分离部署 (Prefill/Decode) 将 Prefill(计算密集, GPU 利用率高)和 Decode(访存密集, 利用率低)分离到不同 GPU。减少阶段间互扰,提升整体吞吐 吞吐 +35% 70B+ 大模型, 高并发
10 GPU Direct RDMA 存储 模型权重直接从对象存储加载到 GPU 显存,绕过 CPU 内存拷贝。配合 Stargz 镜像懒加载,大幅缩短模型启动时间 启动 -70% 冷启动场景
优化建议:对于新部署的模型服务,建议按照以下优先级进行性能调优:① 启用 PagedAttention + Continuous Batching(引擎自带)→ ② 调整 max-num-seqs 和 max-num-batched-tokens → ③ 开启 Prefix Caching(共享前缀场景)→ ④ 量化模型权重 → ⑤ FP8 KV Cache → ⑥ TP 调整。每项优化后应做压测验证实际收益。

9. SLA / SLO 目标

L2 模型部署层的 SLO 直接影响上层 L3 模型市场和 L4 模型网关的服务质量。以下指标是 L2 团队承诺的关键 SLO,按月度和季度进行评估。

类别SLISLO 目标测量方式窗口期
可用性 推理服务可用性 ≥ 99.95% K8s Deployment availableReplicas == desiredReplicas 月度
推理请求成功率 ≥ 99.5% 非 5xx 响应 / 总请求数 周度
健康检查通过率 ≥ 99.9% /health 端点探针成功率 月度
API 端点可用性 ≥ 99.95% OpenAI-compatible API 端点可达性 月度
性能 P50 TTFT (7B 模型) < 200ms vLLM metrics: vllm:request_prometheus_ttft_seconds 周度
P99 TTFT (7B 模型) < 1s vLLM metrics: vllm:request_prometheus_ttft_seconds 周度
P50 TTFT (70B 模型) < 500ms vLLM metrics 周度
P99 TTFT (70B 模型) < 3s vLLM metrics 周度
推理吞吐 (7B, 单 A100) ≥ 3000 tokens/s vLLM engine:generation_tokens_per_second 月度
弹性 扩容响应时间 < 60s KEDA 触发 → Pod Ready 周度
缩容响应时间 < 120s 指标低于阈值 → Pod Terminating 周度
冷启动时间 (7B, 镜像缓存) < 30s Pod 创建 → /health 返回 200 周度
部署 部署成功率 ≥ 99% ModelDeployment 状态→Running 月度
灰度发布回滚时间 < 5min 检测异常 → 流量恢复到旧版本 月度
LoRA adapter 加载时间 < 30s adapter 上传 → 状态 active 周度
SLA 承诺:L2 对 L3 和 L4 的 SLA 保证通过推理服务可用性请求成功率两个核心指标反映。当 L2 无法满足 SLO 时,上层应启动降级逻辑(如 L4 切换到备份模型、L3 标记此部署为 degraded)。

10. 技术选型

以下表格列出了 L2 层所有技术组件的选型结果、版本和选型理由:

领域选型版本备选选型理由
主推理引擎 vLLM 0.6.3 TGI · TensorRT-LLM PagedAttention 显存效率行业最高;Continuous Batching 吞吐领先;Prefix Caching 有效;LoRA 热加载支持;社区最活跃(GitHub 40k+ stars);OpenAI API 开箱即用。
高性能推理引擎 TensorRT-LLM 0.13.0 NVIDIA 官方优化,图编译 + Kernel 融合实现极致性能;FP8/INT4 量化原生支持;多节点 PP 并行;与 Triton 生态深度集成。适用于 70B+ 高 QPS 场景。
结构化生成引擎 SGLang 0.4.0 Outlines · Guidance RadixAttention 实现前缀树共享缓存;JSON Schema / Regex 约束解码性能业界最优;Function Calling 原生支持。
多框架推理服务 Triton Inference Server 24.05 BentoML · MLServer 支持 TensorRT/ONNX/PyTorch/自定义后端;多模型同一 GPU 共部署;Dynamic Batching 自适应;Model Ensemble 编排;生产级监控集成。
多模态管理平台 Xinference 0.14.0 LocalAI · Ollama LLM + Embedding + Rerank + Image 统一管理;Web UI 降低使用门槛;内置模型市场一键下载。
本地开发引擎 Ollama 0.3.12 llama.cpp · GPT4All 一键启动 ollama run;千种模型库;多平台支持;开发者零配置体验。
轻量推理引擎 FastChat 0.2.36 OpenAI API 兼容度高;Controller + Worker 架构;附赠 MT-Bench 评测工具。
模型部署 CRD Kubernetes CRD (自研) v1 KFServing · BentoDeployment 自研 CRD 与平台七层架构深度绑定;支持 L2 独有的规格(引擎配置、LoRA、灰度步骤、预热策略)。KFServing 功能重叠且运维复杂度高。
GPU 感知自动伸缩 KEDA 2.14+ HPA · Cluster Autoscaler KEDA 支持 Prometheus 触发器,可根据 GPU 利用率/QPS/P99 延迟/排队深度等多维指标做弹性伸缩。原生 HPA 不支持外部指标。
服务网格 (灰度) Istio 1.21+ Linkerd · Consul VirtualService + DestinationRule 实现精细流量切分;OutlierDetection 自动熔断;请求级别灰度 Header 路由;Envoy 成熟生态。
推理监控 Prometheus + vLLM Metrics 2.52+ Grafana Beyla · OpenTelemetry vLLM 原生暴露 Prometheus 格式指标(请求数/延迟/KV Cache 利用率/排队深度);Grafana 预置推理仪表盘;无需额外 exporter。
镜像加速 Stargz Snapshotter 0.15+ Nydus · OverlayBD Containerd 原生集成;懒加载减少大模型镜像拉取时间 90%;与现有镜像仓库兼容。
冷启动加速 Knative Serving (可选) 1.14+ OpenFaaS · Nuclio Scale to Zero 原生支持;自动冷启动恢复;Serverless 体验。仅实验/低频场景使用。