4. 模型 Serving 基础:模型部署方式、版本管理与推理模式

在风险定价流式决策系统中,模型 Serving 是连接离线训练与在线决策的核心桥梁。本章聚焦于模型部署的两种主流通信协议(REST 与 gRPC)、模型版本管理策略以及在线推理与批处理的适用场景,帮助你在生产环境中构建稳定、高效的模型服务层。

4.1 模型部署方式:REST vs gRPC

模型 Serving 的通信协议直接影响推理延迟、吞吐量和系统复杂度。REST(Representational State Transfer)和 gRPC(gRPC Remote Procedure Call)是当前最主流的两种选择,它们在数据格式、传输效率和生态支持上存在显著差异。

对比维度 REST (HTTP/JSON) gRPC (HTTP/2 + Protobuf)
数据格式 JSON(文本,可读性强) Protobuf(二进制,压缩率高)
传输协议 HTTP/1.1 或 HTTP/2 HTTP/2(支持多路复用、流式传输)
序列化/反序列化性能 较慢(JSON 解析开销大) 极快(预定义 Schema,零拷贝)
延迟(P99) 通常 5-20ms(受 JSON 大小影响) 通常 1-5ms(二进制传输更高效)
流式支持 有限(需 SSE 或 WebSocket 扩展) 原生支持(Server/Client/Bidirectional Streaming)
生态与工具 广泛(curl、Postman、浏览器直接调试) 需 gRPC 工具(grpcurl、BloomRPC)
适用场景 外部 API、低并发、快速原型、跨语言简单集成 内部微服务、高并发、低延迟、流式推理
选型建议:在风险定价场景中,额度决策通常要求 P99 延迟低于 50ms,且请求特征维度多(上百个特征)。推荐内部服务间调用使用 gRPC,外部合作伙伴或前端接入可使用 REST 网关做协议转换。

4.2 模型版本管理

模型版本管理是 Serving 层的核心治理能力,直接影响线上决策的稳定性和回滚效率。一个成熟的版本管理方案需要覆盖版本注册、灰度切换、回滚与监控四个环节。

4.2.1 版本管理核心要素

  • 版本号规范:采用语义化版本(SemVer),例如 v2.1.0,其中主版本号表示不兼容的模型架构变更,次版本号表示新增特征或策略调整,补丁号表示 bug 修复或参数微调。
  • 模型注册中心:使用 MLflow Model Registry、Seldon Core 或自建元数据表,记录每个版本的模型路径、输入/输出 Schema、训练时间、评估指标(AUC、KS、PSI)和上线状态。
  • 灰度发布策略:支持按流量比例(如 10% → 50% → 100%)或按用户维度(如白名单、地域)逐步切换版本,配合实时监控自动回滚。
  • 回滚机制:保留至少最近 3 个稳定版本,当新版本触发告警(如拒绝率飙升、PSI 超过阈值)时,自动或手动切回上一版本。
实践要点:每次模型上线前,必须在预发环境执行 Shadow 推理(即同时运行新旧版本,仅返回旧版本结果),对比两个版本的输出分布差异,确保新版本不会引入意外行为。

4.2.2 版本管理流程示例

# 模型注册与版本切换伪代码(Python + MLflow)
import mlflow

# 注册新模型版本
mlflow.register_model(
    model_uri="runs:/<run_id>/model",
    name="credit_risk_model"
)

# 将版本 v2.1.0 设置为 Staging(预发)
client = mlflow.tracking.MlflowClient()
client.transition_model_version_stage(
    name="credit_risk_model",
    version=2,
    stage="Staging"
)

# 灰度切换:将 20% 流量指向 v2.1.0
# 实际生产可通过配置中心(如 Apollo、Nacos)动态调整路由权重
routing_config = {
    "v2.0.0": 0.8,
    "v2.1.0": 0.2
}

4.3 在线推理与批处理

风险定价决策系统需要同时支持两种推理模式:在线推理处理实时请求(如用户点击申请按钮时的额度计算),批处理用于离线或近线场景(如每日批量额度重算、策略回测)。

4.3.1 在线推理

  • 请求模式:单条或少量请求(通常 < 100 条/次),要求毫秒级响应。
  • 部署架构:模型服务通常以无状态容器部署在 Kubernetes 上,通过 Service Mesh(如 Istio)做流量管理和灰度路由。
  • 优化手段:特征预计算、模型量化(INT8/FP16)、GPU 推理加速、请求级缓存(相同特征组合直接返回缓存结果)。
  • 典型框架:Triton Inference Server、TorchServe、BentoML、Seldon Core。

4.3.2 批处理推理

  • 请求模式:大规模数据集(百万至亿级),分钟到小时级完成。
  • 部署架构:通常由 Spark/Flink 作业或 Airflow DAG 触发,从 Hive/ClickHouse 读取特征,调用模型服务批量推理。
  • 优化手段:批量请求合并(将多条请求打包为一次 gRPC 调用)、动态批处理(Dynamic Batching)、模型并行分片。
  • 典型框架:Spark MLlib、Ray Serve、Triton 的 Dynamic Batcher。
避坑提示:不要将在线推理服务直接暴露给批处理任务。批处理的高并发请求会打爆在线服务的连接池,导致正常用户请求超时。建议为批处理部署独立的推理服务实例,或使用消息队列(Kafka)做流量削峰。

4.4 模型 Serving 架构总览

下图展示了风险定价场景下模型 Serving 的完整架构,涵盖 REST/gRPC 双协议接入、版本管理、在线与批处理两条推理链路。

模型 Serving 架构图 风险定价模型 Serving 架构 上游业务系统 API 网关 (REST/gRPC) 流量路由 & 版本管理 在线推理服务 Triton / TorchServe 批处理推理服务 Spark / Ray Serve 模型存储 / 注册中心 监控 & 告警 (Prometheus/Grafana) 说明:在线推理与批处理共享同一模型注册中心,但部署独立实例以避免资源争抢;版本管理在路由层实现灰度与回滚。

4.5 在线推理与批处理对比总结

对比维度 在线推理 批处理推理
响应时间要求 毫秒级(P99 < 50ms) 分钟~小时级
请求规模 单条或小批量(< 100) 百万~亿级
部署实例 常驻容器,弹性伸缩 临时作业,按需启动
资源需求 低延迟优先(GPU/CPU 混合) 高吞吐优先(大规模 CPU 集群)
典型触发方式 用户实时事件(点击、申请) 定时调度(每日/每小时)
失败处理 快速失败 + 降级策略 重试 + 死信队列
架构原则:在线推理服务应保持无状态,方便水平扩展;批处理作业应幂等,支持失败重跑。两者通过统一的模型版本管理保持决策一致性,避免因版本不同导致额度结果冲突。