第7章:推理与高性能部署

一、推理服务架构

1.1 Serving形态对比

Serving形态
单机单卡
单机多卡
集群多节点
Serverless
适用: 开发测试
成本: 最低
QPS: <10
适用: 中小规模
成本: 中等
QPS: 10-100
适用: 生产环境
成本: 高
QPS: 100-10000+
适用: 波动负载
成本: 按需
冷启动: 数秒

1.2 通信协议选择

协议选择
HTTP/REST
gRPC
WebSocket/SSE
优点: 通用/调试方便
缺点: 性能一般
适用: 外部API
优点: 高性能/流式
缺点: 客户端复杂
适用: 内部服务
优点: 实时流式
缺点: 连接维护
适用: 聊天界面

1.3 典型部署架构

辅助服务
GPU资源
推理服务
接入层
Redis
缓存
Milvus
向量检索
Prometheus
监控
GPU Node 1
8xA100
GPU Node 2
8xA100
vLLM Pod 1
Replica 1
vLLM Pod 2
Replica 2
vLLM Pod N
Replica N
Nginx/Envoy
API Gateway

二、高性能推理引擎

2.1 主流引擎对比

引擎 特性 性能 易用性 适用场景
vLLM PagedAttention、Continuous Batching ★★★★★ ★★★★ 生产环境
TGI HuggingFace官方、Token流式 ★★★★ ★★★★★ 快速部署
TensorRT-LLM NVIDIA优化、极致性能 ★★★★★ ★★★ 专业优化
llama.cpp CPU推理、量化 ★★★ ★★★★★ 边缘设备
SGLang 结构化生成 ★★★★ ★★★★ 复杂约束

2.2 vLLM核心技术

PagedAttention
传统KV Cache
连续内存块
内存碎片化
利用率60-70%
PagedAttention
分页管理
按需分配
利用率90%+
Continuous Batching
请求队列 推理引擎 GPU Req1(prompt=100) 开始生成 Req1 生成中... Req2(prompt=50) 动态加入批处理 Req1+Req2 并行 Req1完成 返回结果1 Req3(prompt=80) 继续批处理 Req2+Req3 并行 请求队列 推理引擎 GPU

2.3 TensorRT-LLM优化

PyTorch模型
模型转换
TensorRT优化
算子融合
Layer Fusion
精度优化
FP16/INT8
内存优化
显存复用
kernel优化
CUDA优化
推理引擎
性能提升
2-4倍

三、性能优化策略

3.1 KV Cache优化

KV Cache优化
内存管理
复用策略
压缩技术
PagedAttention
分页内存
内存池
预分配
Prefix Cache
系统提示复用
Prompt Cache
相似查询
量化
FP16/INT8
稀疏化
剪枝
Prefix Caching
固定System Prompt
500 tokens
一次计算
缓存KV
用户请求1
复用缓存KV
用户请求2
用户请求N
仅计算新Token
节省计算
50%+

3.2 批处理策略

批处理策略
静态批处理
Static Batching
动态批处理
Dynamic Batching
连续批处理
Continuous Batching
固定批大小
等待凑齐
延迟不可控
超时或满batch
减少等待
延迟可控
即时加入
完成即移除
吞吐最大化

3.3 请求调度

FIFO
优先级
最短作业
公平共享
请求到达
调度策略
先进先出
公平
VIP优先
分层服务
SJF
最小化延迟
Fair Share
用户配额
队列管理
GPU执行

3.4 模型并行

Tensor Parallelism(张量并行)
大模型参数
70B
切分到多GPU
GPU 0
分片1
GPU 1
分片2
GPU 7
分片8
All-Reduce通信
聚合结果
输出
Pipeline Parallelism(流水线并行)
输入
GPU 0
Layer 1-8
GPU 1
Layer 9-16
GPU 2
Layer 17-24
GPU 3
Layer 25-32
输出

四、资源使用优化

4.1 GPU资源画像

GPU监控指标
计算指标
内存指标
通信指标
GPU利用率
SM占用
Tensor Core利用
显存使用
已用/总量
显存带宽
碎片率
PCIe带宽
NVLink带宽
NCCL吞吐

4.2 显存优化

显存占用
模型权重
KV Cache
激活值
量化
FP16/INT8
权重共享
PagedAttention
量化缓存
梯度检查点
推理不需要
激活重计算
显存计算公式
总显存需求 = 模型参数 + KV Cache + 激活 + 操作系统

# 示例: LLaMA-13B FP16推理
模型参数 = 13B × 2 bytes = 26GB
KV Cache (seq=2048, batch=32) = 2 × 40层 × 32batch × 5120hidden × 2048seq × 2bytes / 1024³ ≈ 10GB
激活值 ≈ 2GB
总计 ≈ 40GB (需要48GB显存GPU)

4.3 网络优化

网络优化
拓扑优化
通信优化
协议优化
NUMA感知
本地GPU优先
NVLink直连
高速互联
All-Reduce算法
Ring/Tree
通信计算重叠
异步
NCCL优化
GPU通信库
RDMA
内核旁路

五、可靠性保障

5.1 超时与重试

graph TB
    A[请求] --> B[设置超时<br/>30秒]
    
    B --> C{处理结果}
    
    C -->|成功| D[返回结果]
    C -->|超时| E[重试策略]
    C -->|错误| E
    
    E --> F[指数退避]
    F --> F1[第1次: 1s后]
    F --> F2[第2次: 2s后]
    F --> F3[第3次: 4s后]
    
    F --> G{重试次数}
    G -->|<3| B
    G -->|≥3| H[返回失败]
    
    H --> I[降级处理]
    I --> I1[返回缓存]
    I --> I2[简化响应]
    I --> I3[人工介入]

5.2 熔断与限流

超过QPS
正常
熔断开启
正常
>50%
正常
请求
限流检查
限流拒绝
429
熔断检查
快速失败
推理服务
错误率
触发熔断
返回结果
等待冷却
60秒
半开状态
尝试恢复

5.3 灰度发布

graph TB
    A[新模型v2.0] --> B[金丝雀发布]
    
    B --> C[5%流量]
    C --> D[监控指标]
    
    D --> E{健康检查}
    E -->|正常| F[10%流量]
    E -->|异常| G[自动回滚]
    
    F --> H{持续监控}
    H -->|正常| I[25%→50%→100%]
    H -->|异常| G
    
    I --> J[全量发布]
    
    G --> K[回退v1.0]
    K --> L[问题分析]

5.4 健康检查

Liveness失败
Readiness失败
健康检查
Liveness探针
存活性
Readiness探针
就绪性
Startup探针
启动检查
进程存活
30秒超时
能否服务
推理测试
模型加载
5分钟超时
检查失败
重启Pod
摘除流量

六、弹性伸缩

6.1 HPA配置

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: vllm-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: vllm-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: nvidia.com/gpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Pods
    pods:
      metric:
        name: request_queue_length
      target:
        type: AverageValue
        averageValue: "50"
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 50
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 1
        periodSeconds: 60

6.2 伸缩策略

GPU利用率>80%
队列长度>100
P95延迟>3s
GPU利用率<30%
队列长度<10
监控指标
触发条件
扩容
缩容
计算目标副本数
启动新Pod
模型加载
2-5分钟
健康检查
加入流量
优雅关闭
停止接收新请求
处理完现有请求
释放资源

七、流式传输

7.1 流式推理流程

客户端 推理服务 模型 POST /generate (stream=true) 开始生成 Token 1 data: {"token": "Hello"} Token 2 data: {"token": " World"} Token N data: {"token": "!"} loop [每生成一个token] data: [DONE] 关闭连接 客户端 推理服务 模型

7.2 SSE vs WebSocket

流式协议
SSE
Server-Sent Events
WebSocket
优点: 简单/HTTP
缺点: 单向
适用: LLM流式输出
优点: 双向/低延迟
缺点: 复杂
适用: 实时对话

八、部署最佳实践

8.1 资源配置建议

模型规模 GPU配置 显存需求 批大小 并发数
7B 1×A10 (24GB) ~16GB 32-64 10-20
13B 1×A100 (40GB) ~30GB 16-32 5-10
34B 2×A100 (80GB) ~70GB 8-16 2-5
70B 4×A100 (80GB) ~140GB 4-8 1-2

8.2 性能调优检查清单

graph TB
    A[性能调优] --> B[模型层面]
    A --> C[系统层面]
    A --> D[代码层面]
    
    B --> B1[✓ 量化FP16/INT8]
    B --> B2[✓ KV Cache优化]
    B --> B3[✓ Speculative Decoding]
    
    C --> C1[✓ GPU亲和性绑定]
    C --> C2[✓ NUMA优化]
    C --> C3[✓ 网络带宽]
    
    D --> D1[✓ 批处理最大化]
    D --> D2[✓ 异步IO]
    D --> D3[✓ 连接池]

8.3 监控指标

推理监控
吞吐指标
延迟指标
资源指标
QPS请求数
Token/s生成速度
批处理大小
TTFT首Token时间
P50/P95/P99延迟
端到端耗时
GPU利用率
显存使用率
队列长度

九、故障排查

9.1 常见问题

OOM
抖动
性能问题
症状
显存不足
吞吐低
延迟不稳定
减小batch_size
启用量化
减少max_tokens
增加GPU数量
优化批处理
检查IO瓶颈
排查GC停顿
检查网络抖动
CPU绑核

9.2 性能剖析

# NVIDIA Nsight Systems
nsys profile -o report python inference.py

# 查看GPU利用率时间线
# 定位空闲时段、通信瓶颈

# CUDA Profiler
nvprof --print-gpu-trace python inference.py

# PyTorch Profiler
import torch.profiler as profiler
with profiler.profile(
    activities=[profiler.ProfilerActivity.CPU, profiler.ProfilerActivity.CUDA]
) as prof:
    model.generate(...)
prof.export_chrome_trace("trace.json")

十、总结:推理优化关键点

推理优化
算法优化
系统优化
工程优化
KV Cache复用
Continuous Batching
Speculative Decoding
GPU并行
显存管理
网络优化
负载均衡
熔断限流
弹性伸缩

关键要点

  1. 选对引擎:vLLM生产环境、TGI快速部署
  2. 批处理优化:Continuous Batching最大化吞吐
  3. 显存管理:PagedAttention + 量化
  4. 可靠性:健康检查、熔断、灰度发布
  5. 监控完善:TTFT、吞吐、GPU利用率

本章提供了LLM推理服务从部署到优化的完整指南。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐