我们在 Besttech 构建首个大型 ML pipeline 时出现的 5 件问题(以及我们如何修复它们)

发布: (2026年1月5日 GMT+8 13:36)
6 min read
原文: Dev.to

Source: Dev.to

机器学习的 “Hello World” 很简单。你只需导入 Scikit‑Learn,在干净的 CSV 上拟合模型,就能得到一个不错的准确率。

而生产环境下的机器学习却是一场噩梦。

在 Besttech,我们最近把客户的预测分析模型从一堆混乱的本地 Jupyter Notebook 中迁移到了一个全自动、云原生的流水线。我们以为已经把全局规划好了。我们以为自己懂 MLOps。

结果我们错了。我们把很多东西弄坏了——而且是大事。过程中我们构建了一个强大的引擎,现在它可以毫不迟疑地处理数 TB 的数据。

我们弄坏了:时间概念(数据泄漏) ⏳

失败

我们最初的模型在训练期间表现惊人——准确率 98%。但部署到线上环境后,准确率骤降至 60%。

根本原因

我们不小心使用了在预测时不存在的特征进行训练(例如,用于月初流失模型的 “Total Monthly Spend”)。模型实际上通过看到未来数据在“作弊”。

解决方案

实现了严格的特征库(使用 Feast),为每个特征打上时间戳。创建训练集时,系统执行点时间正确的关联,确保模型只能看到当时可用的数据。

我们弄坏了:云费用(资源囤积) 💸

失败

我们为整个流水线——提取、清洗、训练和部署——都启动了巨大的 GPU 实例。

根本原因

流水线中 90% 的工作是简单的数据清洗(CPU 工作),但我们却一直在为昂贵的 GPU 付费。

解决方案

使用 Kubernetes 容器将各步骤解耦:

  1. ETL – 在廉价的高内存 CPU 节点上运行。
  2. Training – 启动 GPU 节点进行模型训练,训练完成后立即关闭。
  3. Inference – 在轻量级无服务器函数上运行。

结果:计算成本降低约 65%。

我们弄坏了:Python 依赖(经典的 “在我机器上可以运行”) 🐍

失败

数据科学家使用 pandas 1.3.0,而生产服务器上是 pandas 1.1.5。由于函数签名变化,流水线悄然崩溃。

解决方案

禁止手动环境配置,转向严格的 Docker 化。每个流水线步骤现在都在自己的 Docker 容器中运行,并使用冻结的 requirements.txt。只要容器能构建,代码就能运行——就这么简单。

我们弄坏了:信任(静默失败) 🤫

失败

某个源数据流出现故障,开始对特定列发送全零。流水线没有崩溃,而是把零值读入,训练出一个垃圾模型并部署。客户收到的预测毫无意义。

根本原因

测试只关注代码错误,而没有覆盖数据错误。

解决方案

在摄取层引入 Data Expectations,使用 Great Expectations,例如:

  • age 是否在 18 到 100 之间?
  • transaction_value 是否为非负数?
  • 空值比例是否 < 5%?

如果数据违反任何规则,流水线会停止并在 Besttech 的 Slack 频道发出警报,防止进一步损害。

我们弄坏了:反馈循环(模型漂移) 📉

失败

部署后,三个月后客户报告说预测每周都在变差。

根本原因

市场已经变化,静态模型不再匹配当前的数据分布。

解决方案

自动化重新训练循环。我们现在使用 Evidently AI 等工具监控漂移指标。当线上数据的统计分布相对于训练数据的偏差超过阈值时,会自动触发新的训练任务。流水线现在具备自我修复能力。

结论

构建模型是科学,构建流水线是工程。

在 Besttech,我们弥合了这两者的差距。我们不仅仅交给你一个 Notebook 并祝你好运;我们还搭建了那套凌乱、复杂、并不光鲜的基础设施,让你的智能系统持续运行。

Back to Blog

相关文章

阅读更多 »

RGB LED 支线任务 💡

markdown !Jennifer Davishttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%...

Mendex:我为何构建

介绍 大家好。今天我想分享一下我是谁、我在构建什么以及为什么。 早期职业生涯与倦怠 我在 17 年前开始我的 developer 生涯……