模型部署层
Model Deployment Layer — 推理引擎管理、一键部署、弹性伸缩、灰度发布,将模型权重转化为高性能推理服务
2. 层级定位与边界
L2 模型部署层位于 L1 基础设施层之上、L3 模型市场之下,是连接物理算力与模型资产的核心桥梁。它的核心职责是将模型权重文件转化为可供外部调用的高性能推理服务,并管理这些服务的全生命周期——部署、监控、扩缩容、灰度、下线。
L2 不直接操作物理 GPU 设备,也不管理模型元数据版本,这些分别由 L1 和 L3 负责。L2 的焦点在于推理引擎的编排与运行时管理。
3. 边界规范
不提供:模型元数据存储、模型版本管理、模型评测执行。这些是 L3 的核心职责,L2 只消费不管理。
不操作:物理 GPU 设备驱动、存储硬件配置、网络硬件配置。L2 只使用 L1 暴露的软件抽象层。
扩缩容控制器 ↔ 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 原生
TensorRT-LLM v0.13.0
NVIDIA 官方优化引擎,极致 GPU 性能。通过图编译和 kernel 融合实现最低延迟。
- 图编译优化 — 静态图编译器减少 kernel launch 开销
- FP8/INT4/INT8 量化 — 原生权重压缩支持
- Inflight Batching — 请求级动态调度
- 多节点流水线并行 — PP > 1 的大模型部署
- NVIDIA 生态深度集成 — Triton + NIM
TGI v2.3.0
HuggingFace 官方推理引擎,与 HF 生态原生集成,开箱即用。
- HF 原生集成 — 自动下载 tokenizer/config
- Continuous Batching — 与 vLLM 类似的动态调度
- Watermarking — 生成文本水印(IWSLM)
- Message API — Chat Template 原生支持
- 安全护栏 — 敏感词过滤、内容审核
SGLang v0.4.0
新一代推理引擎,RadixAttention 技术实现极致结构化生成和 JSON Mode 性能。
- RadixAttention — 前缀树缓存,共享前缀零开销
- Structured Generation — JSON Schema / Regex 约束解码
- Function Calling 原生 — OpenAI 工具调用模式
- 多模态 — LLaVA-NeXT、Qwen2-VL
- 数据流 DAG 编程模型
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 Manager、Worker 进程和API Server 四部分组成。调度器负责任务调度和抢占,Block Manager 实现 PagedAttention 的显存管理,Worker 执行实际的模型推理,API Server 提供 OpenAI-compatible 的 HTTP 接口。
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 Size | Input Len | Output Len | 吞吐 (tokens/s) | P50 TTFT | P99 TTFT | P50 ITL | P99 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 |
4.1.4 LoRA 热加载机制
LoRA (Low-Rank Adaptation) 热加载允许在不重启推理服务的情况下动态切换模型行为(如领域微调、角色扮演、风格迁移)。vLLM 通过独立的 LoRA 管理器维护多个 adapter,每个推理请求可按需选择使用不同的 adapter。
LoRA 架构设计
- LoRA 管理器:常驻进程,维护 adapter 池(最多 256 个活跃 adapter),管理显存中的 LoRA 权重
- adapter 存储:权重文件存储于 L1 对象存储(MinIO),启动时懒加载到 GPU 显存
- 请求级路由:每个 /v1/chat/completions 请求可通过 model 参数指定 base model @ adapter
- 版本管理:每个 adapter 支持多版本,热切换零中断
# 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 引擎选型决策树
选择一个推理引擎需要在吞吐、延迟、显存效率、生态兼容和运维复杂度之间权衡。以下是平台推荐的选型决策路径。
5. 一键部署
L2 模型部署层提供一键部署 (One-Click Deployment) 能力,用户只需选择模型、引擎和资源配置,平台自动完成推理 Pod 创建、权重挂载、Service 暴露和监控集成。
5.1 部署流程
启动时间目标
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 步骤示例
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% | 冷启动场景 |
9. SLA / SLO 目标
L2 模型部署层的 SLO 直接影响上层 L3 模型市场和 L4 模型网关的服务质量。以下指标是 L2 团队承诺的关键 SLO,按月度和季度进行评估。
| 类别 | SLI | SLO 目标 | 测量方式 | 窗口期 |
|---|---|---|---|---|
| 可用性 | 推理服务可用性 | ≥ 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 | 周度 |
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 体验。仅实验/低频场景使用。 |