可扩展 ML 系统的微服务架构模式 (Microservice Architecture Patterns for Scalable ML Systems)

2022年12月01日 9 min read

在学习机器学习时,有一种非常常见的误解:我们认为做出一个好模型就万事大吉了。

但在实际产品中,模型只是很小的一部分。剩下的部分是:数据从哪里来,模型如何部署 (deploy),哪个服务调用模型,我们如何知道它出错了,新版本是否会破坏旧的工作流,以及如果流量激增,系统能承受得住吗?

这就是为什么我想阅读有关 ML 系统的微服务架构 (microservice architecture) 的文章。不是因为微服务总是好的,而是因为它迫使我们将 ML 视为一个生产系统,而不仅仅是一个运行一次就放在那里的 notebook。

1. 真正的问题

一个简单的 ML 系统通常是这样开始的:

数据 → 训练模型 → 保存模型 → API 预测 → 前端显示结果

在 Demo 阶段,这个流程很好。

但是进入生产环境后,事情开始变得更加复杂:

  • 数据随时间变化;
  • 模型有多个版本;
  • 推理 (inference) 需要低延迟 (latency);
  • 某些任务需要在后台运行;
  • 某些服务需要比其他服务扩展 (scale) 更多;
  • 错误可能出在数据、模型、API、队列、数据库或前端;
  • 如果没有良好的监控 (monitoring),模型可能会在无人知晓的情况下悄悄崩溃。

论文 Microservice Architecture Patterns for Scalable Machine Learning Systems 描述了将 ML 工作流分解为独立服务,而不是将所有内容保留在单体应用 (monolith) 中的方向。其主要思想是:可以将训练、推理、预处理、监控和部署打包成独立的组件,使其更易于扩展和运营。

2. 不应将微服务仅仅视为一种趋势

微服务并不意味着拆分得越小越好。

如果项目很小,过早地拆分会使系统更加混乱:更多的 repo,更多的 API,更多的配置,更多的故障点。但是,如果系统开始具有许多不同类型的工作负载 (workloads),微服务就变得有意义了。

例如,在 AI 工作流中:

前端 CRM

后端 API

工作流服务 (Workflow Service)

LLM 服务 / ML 推理服务 (Inference Service)

数据库 + 向量数据库 + 日志 (Logging)

在这里,后端 APIML 推理服务 不一定以相同的方式扩展。CRM 仪表板可能会有许多读取数据的请求,而推理服务可能会更消耗 GPU/CPU。如果将它们放在同一个应用程序中,优化将会更加困难。

3. 一种易于理解的服务拆分方法

对于一个实际的 ML 系统,它可以分为以下几组:

数据服务 (Data Service)

负责获取数据、验证 schema、清理数据和保存元数据。

例如:

lead_events
customer_profiles
conversation_logs
product_catalog

在 CRM 中,该服务确保线索 (lead) 数据不会缺少电子邮件、电话、来源、阶段或时间戳。

训练服务 (Training Service)

负责训练或微调 (fine-tune) 模型。该服务不一定持续运行。它可以按计划或由触发器 (trigger) 运行。

新的标记数据 → 训练模型 → 评估 → 注册版本

推理服务 (Inference Service)

这是接收请求并返回预测的部分。

例如:

POST /predict/lead-score
{
  "lead_source": "website",
  "industry": "restaurant",
  "last_message": "I need a CRM demo"
}

响应:

{
  "score": 0.82,
  "priority": "high",
  "reason": "Lead requested a demo and provided business context"
}

监控服务 (Monitoring Service)

跟踪延迟、错误率、输入分布、输出分布和业务指标。

这是许多人容易跳过的部分。但是没有监控的生产 ML 就像在夜间不开车灯开车。

工作流服务 (Workflow Service)

负责将模型连接到业务操作。

例如:

线索得分 > 0.8
→ 创建交易 (deal)
→ 发送跟进 (follow-up)
→ 提醒销售回拨电话
→ 更新 CRM 活动

模型本身并不创造价值。工作流才是价值产生的地方。

4. 小例子:CRM 中的 AI 线索评分 (Lead Scoring)

假设我为 OneClick CRM 构建一个工作流:

当客户在网站上填写表单时,系统会自动分析线索、对其进行评分、创建交易并建议跟进。

一个简单的设计可能是:

网站表单

线索 API 服务

数据库

线索评分服务 (Lead Scoring Service)

工作流自动化服务

通知 / 电子邮件 / CRM 更新

如果线索评分失败,系统仍应保存线索。你不应该让模型故障导致客户数据丢失。

我学到的一个原则是:

ML 服务应该为工作流增加价值,但如果模型失败,它不应该让整个工作流瘫痪。

因此可以使用后备方案 (fallback):

如果模型失败 → 临时使用基于规则的得分 → 标记以供审查

5. ML 系统中的监控需要关注多个层级

对于普通的后端,我们通常监控:

  • 请求数;
  • 错误率;
  • 延迟 (latency);
  • CPU/RAM;
  • 数据库查询时间。

对于 ML 系统,我们需要添加:

  • 输入数据是否倾斜 (skewed)?
  • 输出是否异常?
  • 正在运行的是哪个模型版本?
  • 预测是否创造了正确的业务操作?
  • 离线指标是否仍然反映了真实指标?

例如,一个线索评分模型突然将 95% 的线索评为 high priority。后端仍在运行,API 仍然返回 200 OK,但产品可能出错了。

6. 权衡 (Trade-offs)

微服务有助于:

  • 独立地扩展各个部分;
  • 将模型与主后端分开部署;
  • 更容易回滚 (rollback);
  • 明确各个服务的责任;
  • 更容易监控每一层。

但它们也增加了:

  • 运营的复杂性;
  • 网络延迟;
  • 日志记录/监控成本;
  • 版本不匹配的风险;
  • 需要更高的 DevOps 技能。

因此,对于一个小项目,我认为我们应该先从模块化单体架构 (modular monolith) 开始:

一个 repo,一个后端,但模块清晰:
- leads
- workflows
- inference
- monitoring
- notifications

当某一部分真正需要独立扩展时,那时再去拆分服务。

7. 结论

ML 中的微服务不仅仅是为了看起来像“企业级”。只有当它们使系统更容易部署、扩展、调试和回滚时,它们才有意义。

我学到的最重要的一点是:生产 ML 不仅仅是一个模型。它是一系列共同运行的服务、数据、API、监控和业务工作流。

如果一个好模型没有得到正确的部署,没有得到正确的监控,或者没有与具体的行动联系起来,它仍然只是一个实验。

参考资料

New posts, shipping stories, and nerdy links straight to your inbox.

2x per month, pure signal, zero fluff.


分享这篇文章: