3. Serving系统架构设计:请求入口层、路由层、推理引擎层、模型仓库层、监控与日志层

低延迟因子评分系统的核心在于分层解耦与流水线并行。每一层承担明确的职责,并通过轻量级协议(如 gRPC、共享内存)进行通信。本章将详细拆解 Serving 系统的五层架构,并给出每层的设计要点与选型建议。

架构设计原则: 每一层都必须是可水平扩展的(Horizontal Scalable),且层间延迟应控制在亚毫秒级(< 1ms),避免因层间通信成为瓶颈。

3.1 请求入口层(Ingress Layer)

请求入口层是系统的第一道防线,负责接收外部客户端的推理请求,并执行基础的预处理与流量控制。

  • 协议适配: 支持 HTTP/REST、gRPC、WebSocket 等多种协议,并将外部协议统一转换为内部 RPC 调用。
  • 身份认证与鉴权: 基于 API Key、JWT 或 mTLS 进行请求校验,拒绝非法请求。
  • 限流与熔断: 使用令牌桶(Token Bucket)或漏桶算法,防止突发流量冲垮下游服务。当错误率超过阈值时,自动熔断。
  • 请求校验与预处理: 检查请求体格式(如 JSON Schema)、字段完整性,并进行简单的数据清洗(如去除空值、截断超长文本)。
组件 推荐技术 关键指标
反向代理 Envoy / Nginx P99 延迟 < 1ms
API 网关 Kong / APISIX 吞吐量 > 10K QPS
限流组件 Redis + Lua / Guava RateLimiter 误差 < 5%

3.2 路由层(Routing Layer)

路由层根据请求的特征(如模型版本、业务线、用户 ID 哈希)将请求分发到正确的推理引擎实例。这是实现灰度发布、A/B 测试和多模型管理的核心。

  • 模型版本路由: 根据请求头中的 model_version 或 canary 标签,将流量按比例(如 90% v1, 10% v2)分发。
  • 一致性哈希路由: 对用户 ID 或请求 ID 进行哈希,确保同一用户的请求始终路由到同一推理实例,以利用本地缓存。
  • 动态权重调整: 实时读取监控数据,自动将流量从高延迟或高错误率的实例迁移到健康实例。
  • 请求复制(Shadow Traffic): 将生产流量复制一份发送到新模型,用于在线验证而不影响线上结果。
实践建议: 路由层应保持无状态(Stateless),所有路由规则存储在外部配置中心(如 etcd、Consul)中,支持热更新,避免重启服务。
路由层流量分发策略 请求入口 路由决策引擎 (版本/哈希/权重) 推理实例 v1.0 权重: 70% 推理实例 v2.0 权重: 20% 推理实例 v2.1 权重: 10%

3.3 推理引擎层(Inference Engine Layer)

推理引擎层是执行模型前向计算的核心。它负责加载模型、管理 GPU/CPU 资源、执行批处理(Batching)并返回结果。

  • 模型加载与热更新: 支持动态加载/卸载模型,无需重启进程。使用共享内存或 RDMA 加速模型权重传输。
  • 动态批处理(Dynamic Batching): 将多个请求合并为一个批次,提高 GPU 利用率。需设置最大延迟容忍度(如 5ms),避免单个请求等待过久。
  • 计算加速: 使用 TensorRT、ONNX Runtime、OpenVINO 等推理优化引擎,对模型进行图优化和量化(FP16/INT8)。
  • 资源隔离: 通过 MPS(Multi-Process Service)或 MIG(Multi-Instance GPU)实现 GPU 显存和算力的隔离,防止模型间互相干扰。
特性 TensorRT ONNX Runtime PyTorch Inductor
图优化 极强(层融合、常量折叠) 强(支持多种 EP) 中(动态图编译)
量化支持 INT8/FP8/FP16 INT8/FP16 FP16/BF16
延迟优化 P99 < 1ms(小模型) P99 < 2ms P99 < 3ms
生态兼容 NVIDIA 专属 跨平台/跨硬件 PyTorch 原生
避坑指南: 动态批处理并非越大越好。当批处理大小超过 32 时,延迟增长往往呈超线性。建议通过压测找到最优 Batch Size,并设置最大延迟预算(Latency Budget)。

3.4 模型仓库层(Model Repository Layer)

模型仓库层负责模型的版本管理、存储、分发与生命周期管理。它确保推理引擎能够快速、一致地获取到正确的模型文件。

  • 版本化存储: 每个模型包含多个版本,每个版本对应一组权重文件、配置文件和预处理逻辑。使用语义化版本号(如 1.2.3)。
  • 分布式存储后端: 支持 S3、GCS、HDFS 或本地 NAS。对于低延迟场景,推荐使用本地 SSD 缓存 + 远端对象存储的二级缓存架构。
  • 模型拉取策略: 支持懒加载(Lazy Loading,首次推理时拉取)和预加载(Eager Loading,服务启动时拉取)。低延迟场景推荐预加载。
  • 模型签名与校验: 使用 SHA256 校验模型完整性,防止文件损坏或篡改。
# 模型仓库目录结构示例
/models/
├── fraud_detection/
│   ├── 1.0.0/
│   │   ├── model.onnx
│   │   ├── config.json
│   │   └── preprocessor.py
│   ├── 1.1.0/
│   │   ├── model.onnx
│   │   ├── config.json
│   │   └── preprocessor.py
│   └── latest -> 1.1.0
└── credit_scoring/
    └── 2.0.0/
        └── model.pt

3.5 监控与日志层(Monitoring & Logging Layer)

监控与日志层是 Serving 系统的“眼睛”和“记忆”。没有可观测性,就无法定位延迟抖动和错误根因。

  • 指标采集(Metrics): 采集三大黄金信号:延迟(Latency)、流量(Traffic)、错误(Errors)。使用 Prometheus 客户端暴露 /metrics 端点。
  • 分布式追踪(Tracing): 为每个请求生成 Trace ID,贯穿入口层到推理引擎层。使用 OpenTelemetry 或 Jaeger 追踪各层耗时。
  • 结构化日志(Logging): 输出 JSON 格式的日志,包含 request_id、model_version、latency_ms、gpu_util 等关键字段,便于日志分析系统(如 ELK)检索。
  • 告警与自愈: 当 P99 延迟超过阈值(如 50ms)或错误率超过 1% 时,触发告警并自动执行降级策略(如切换到备用模型)。
可观测性数据流 Serving 应用 (各层组件) Metrics (Prometheus) Tracing (Jaeger) Logging (ELK) Grafana 仪表盘 (实时可视化) Alertmanager (告警与自愈)
关键指标清单:
  • 推理延迟: P50 / P99 / P999(单位 ms)
  • 吞吐量: QPS(每秒查询数)
  • GPU 利用率: 显存占用、算力利用率(%)
  • 批处理大小: 平均 Batch Size
  • 模型加载时间: 从请求到模型就绪的耗时(ms)