Skip to content

推理系统总体架构解剖:七层全景图

本页速览 一个生产级推理系统由哪些部分组成?本文用一张全景图解剖推理系统的七层结构——请求入口、服务层、推理引擎、资源层、数据与版本、可观测性、治理——讲清每层职责、常见故障点与层间协作。

推理系统总体架构解剖:七层全景图

一个生产级推理系统(inference system)不是「一个模型 + 一个 Flask」,而是七层结构的系统工程:请求入口、服务层、推理引擎、资源层,以及横切的三个支撑面——数据与版本、可观测性、治理。本文先用一张全景图立住框架,再逐层拆解职责、选型与常见故障,最后用一个请求的生命周期把七层串起来。

一句话:推理系统 = 让「请求 → 预测」稳定、低成本、可观测地发生的所有组件之和。

一、整体架构:七层全景图

text
                          客户端(App / Web / 上游服务)


┌───────────────────────────────────────────────────────────────────┐
│ ① 请求入口层                                                       │
│   网关/负载均衡:路由、鉴权、限流、超时(Nginx / Envoy / API 网关)    │
├───────────────────────────────────────────────────────────────────┤
│ ② 服务层                                                           │
│   API(REST/gRPC)→ 预处理(tokenize/归一化)→ 推理调度 → 后处理      │
│   FastAPI / Triton / KServe / vLLM                               │
├───────────────────────────────────────────────────────────────────┤
│ ③ 推理引擎层                                                       │
│   图优化、量化内核、批处理执行器(ONNX Runtime / TensorRT / vLLM)    │
├───────────────────────────────────────────────────────────────────┤
│ ④ 资源层                                                           │
│   GPU / CPU / 内存 / 网络,K8s 节点与调度                            │
├───────────────────────────────────────────────────────────────────┤
│ ⑤ 数据与版本层(横切)                                              │
│   模型注册(MLflow)、特征版本、tokenizer/vocab 版本                  │
├───────────────────────────────────────────────────────────────────┤
│ ⑥ 可观测性层(横切)                                                │
│   指标(Prometheus)、日志、链路追踪、漂移检测                        │
├───────────────────────────────────────────────────────────────────┤
│ ⑦ 治理层(横切)                                                    │
│   灰度、回滚、容量规划、安全与配额                                    │
└───────────────────────────────────────────────────────────────────┘

读图顺序建议:先看懂纵向主线 ①→④(请求怎么被打成预测),再理解三个横切面 ⑤⑥⑦(它们不参与计算,但决定了系统能不能长期活着)。

主线的记忆锚点

入口管进、服务管编、引擎管算、资源管跑——四层主线的职责一次记住。

二、逐层拆解:职责、选型与故障

1. 请求入口层:管「谁可以进来」

  • 职责:负载均衡、路由、鉴权、限流(rate limiting)、超时熔断、TLS 终止。
  • 典型选型:Nginx、Envoy、Kong;K8s Ingress;云上 API 网关。
  • 常见故障:入口层健康检查探活失败导致全部流量被摘除;限流配置过松,请求洪峰直接打穿到服务层。
  • 排查方向:看网关访问日志与延迟分布,区分「没进来」与「进来后慢」。

2. 服务层:管「把请求编成一次推理」

  • 职责:解析请求、输入校验、预处理(图像 resize、文本 tokenize)、组装推理请求、后处理(softmax 转分数、decode)、组装响应。动态批处理(dynamic batching)策略也在这层编排。
  • 典型选型:FastAPI、Triton、vLLM、KServe;LLM 场景由 vLLM/Triton 直接承担服务与调度。
  • 常见故障:请求 schema 不匹配(缺字段、类型错)、预处理慢于推理、批处理策略不当导致长尾延迟(head-of-line blocking)。
  • 排查方向:把「预处理耗时 / 推理耗时 / 后处理耗时」拆开埋点,见 可观测性实践

服务层的两种形态

传统 CV/NLP 模型常是「自己写 FastAPI 调用引擎」;LLM 模型则普遍用 vLLM 这类「引擎+服务一体化」框架,服务层与引擎层被合并。形态不同,但「编排」职责不变。

3. 推理引擎层:管「算得快」

  • 职责:把模型图优化成高效执行计划——算子融合(operator fusion)、量化内核(INT8/FP16)、显存复用、批处理内核执行。
  • 典型选型:ONNX Runtime(跨平台)、TensorRT(NVIDIA GPU 极致性能)、vLLM(LLM 调度 + PagedAttention)、OpenVINO(Intel CPU)。选型对比见 推理引擎对比
  • 常见故障:引擎不支持某算子导致回退到慢路径(fallback);显存碎片/OOM;量化后精度漂移。
  • 排查方向:引擎 profiling 工具(NVIDIA Nsight、ONNX Runtime profiler)定位到算子级耗时,详见 性能优化

4. 资源层:管「有机器可跑」

  • 职责:GPU/CPU 算力、显存、内存、网络带宽的供给与调度;节点扩缩容。
  • 典型选型:Kubernetes 节点池、GPU 共享调度(如 MIG、时间片)、Serverless 自动伸缩。
  • 常见故障:GPU 显存被邻居 Pod 打满、节点 OOM 导致 Pod 被杀、冷启动拉镜像慢。
  • 排查方向:看 K8s 事件与节点指标,区分「资源不足」与「代码浪费资源」。

5. 数据与版本层(横切):管「用的是哪一版模型」

  • 职责:模型版本登记(model registry)、镜像标签、特征版本、tokenizer/vocab 对齐。这是模型系统最容易「静默出错」的一层:模型换了,特征没跟上。
  • 典型选型:MLflow Model Registry、Hugging Face Hub、自建版本表。
  • 常见故障:线上推理用的特征口径与训练不一致;新模型上线但缓存了旧特征。
  • 排查方向:对比模型/特征版本的 git commit 与上线时间戳。完整流程见 MLOps 流水线

6. 可观测性层(横切):管「有没有在悄悄变坏」

  • 职责:指标(延迟、吞吐、错误率、GPU 利用率)、日志、链路追踪、漂移检测、告警。
  • 典型选型:Prometheus + Grafana、OpenTelemetry、ELK/Loki、漂移检测脚本。
  • 常见故障:指标采样过粗抓不到偶发尖峰;没有告警,漂移发生数周无人察觉。
  • 排查方向:先看 SLO 指标再下钻日志,指标体系设计见 监控

7. 治理层(横切):管「变更和风险」

  • 职责:灰度发布、回滚、容量规划、配额、安全与合规(模型权限、数据脱敏)、模型审计。
  • 典型选型:K8s 滚动更新、Argo Rollouts、网关灰度(A/B、金丝雀)、模型审计日志。
  • 常见故障:全量发布新版本出问题只能整体回滚;灰度流量切分不均影响实验结论。
  • 排查方向:灰度实践见 网关灰度发布,安全基线见 模型安全

三、一个请求的生命周期走查

把七层串起来,看一个 HTTP 请求如何变成预测:

text
1. App 发起 POST /predict(JSON:{feature_a: 0.7, text: "..."})
     ↓ ① 请求入口层
2. 网关:鉴权通过 → 限流计数 → 按路由转发到服务 Pod
     ↓ ② 服务层
3. API 解析请求、校验 schema;不合法返回 422
4. 预处理:文本 tokenize / 图像 resize + 归一化
5. 组装 batch(动态批处理把 4 个请求合成一个 batch)
     ↓ ③ 推理引擎层
6. 引擎执行图:算子融合后的前向计算,INT8 内核,显存复用
7. 返回原始输出(logits / embedding)
     ↓ ② 服务层
8. 后处理:softmax → top-k 分数 / detokenize 文本
9. 组装响应 JSON(含延迟头信息)→ 返回 App
     ↓ ⑥ 可观测性层(全程旁路记录)
10. 上报 latency 直方图、batch 大小、错误码到 Prometheus
     ↓ ⑤ 数据与版本层(旁路校验)
11. 记录本次请求使用的模型版本与特征版本,供审计与回放

关键观察:①→④ 决定快不快,⑤→⑦ 决定稳不稳。面试中被问「请求会经过哪些层」,按主线 ①→④ 答完,再补三个横切面,就是满分结构。

四、层间契约:系统稳定靠协议,不靠自觉

层与层之间必须有明确契约(contract),否则任何一层升级都可能震碎上下游:

契约点内容破坏后的表现
输入输出 schema字段名、类型、取值范围、缺省策略(JSON Schema / gRPC proto)上游新老版本混发,解析报错
批处理协议单条 vs 批量、batch 上限、超时语义批处理错乱,长尾延迟失控
错误语义4xx/5xx 划分、错误码、重试安全(幂等性)重试放大故障(重试风暴)
版本对齐模型版本 ↔ 特征版本 ↔ 引擎版本 ↔ 镜像标签静默精度退化,难以定位

最容易忽略的契约:重试

网关层通常会重试 5xx。如果推理接口不幂等(如重复扣费类推理),一次超时可能触发三次执行。契约里必须写清「哪些错误可以重试、重试几次、是否退避」

服务层契约的完整设计见 模型服务

五、故障在每层的表现:从症状定位到层

同一个故障症状,可能来自不同层。排查的第一步是用症状反定位到层

症状最可能所在层验证方法
全部请求超时① 入口层(网关配置/上游不可达)网关日志 + 健康检查状态
偶发 P99 飙升② 服务层(批处理排队)分阶段耗时拆分
稳定变慢③ 引擎层(fallback 到慢算子)引擎 profiler
OOM / 显存溢出④ 资源层节点指标 + 引擎显存日志
结果对但偶尔错⑤ 版本层(特征口径漂移)版本对比 + 样本回放
线上静默变差⑥ 可观测性层(漂移未告警)漂移检测指标趋势
新版本上线后异常⑦ 治理层(灰度没拦住)灰度日志 + 回滚

排查口诀

先分阶段再下钻:先把「请求进来到出去」拆成网关、服务、引擎、资源四段埋点,哪段慢就进哪段;不要一开始就怀疑引擎算子,八成问题在服务层与资源层。完整排查方法论见 常见坑点

六、七层架构怎么用:三类人三种用法

  • 部署工程师:把 ①→④ 当「性能与稳定性地图」,把 ⑥⑦ 当「日常操作面板」,优化永远从量化过的瓶颈出发。
  • 算法工程师:理解 ⑤ 的关键性——「我训好的模型为什么线上不灵」,一半答案在特征与版本对齐。
  • 面试者:本文的架构图与生命周期走查就是一份可复述的「系统设计」框架,配合 面试题 练到能默画。

延伸阅读

参考资料