早几年前我在一家数据部门做平台组负责人,当时业务方提了个很真实的需求:算法工程师的模型已经跑通了,准确率也不错,但模型一直只能躺在开发机上,靠手动导数据、手动训练、手动出结果。业务要的是每天自动跑、数据要用数仓里最新的、结果要回流到线上。听上去不难,真正去做的时候才发现,把一个单机跑通的训练脚本接进生产级大数据架构,中间隔着的东西比想象中多得多。
这篇内容主要面向两类人:一类是正在做数据平台或机器学习平台建设的工程师,想知道集成方案怎么设计才不踩坑;另一类是算法团队里那些“被迫”要自己搞定训练数据链路的人,想搞明白数据仓库、调度系统、特征存储和模型训练之间到底是什么关系。我会从实际落地的角度,把整个集成链路拆开讲,包括选型逻辑、架构设计、元数据打通、回填机制、推理上线这些环节,以及我们踩过的一些不太容易从文档里看出来的坑。
1. 为什么模型训练必须和数仓/调度体系打通:绕不开的“数据流闭环”
先聊一个经常被忽略的前提问题:机器学习平台为什么要嵌进大数据架构里,而不是独立跑一套?很多团队的初始形态都是算法团队自己搭一套环境,数据从业务库直接拉,或者从数仓导一份快照到训练服务器上,然后就开始调参。这套模式在实验阶段没有任何问题,但一旦涉及常态化产出模型和预测结果,问题一个接一个地冒出来。
1.1 实验环境到生产环境的“最后一公里”断裂
数据快照的手工导出看起来很省事,但会导致三个问题。第一是数据集不可追溯,同一个模型训练了两版,用的分别是哪天的数据、哪个SQL逻辑生成的样本,完全取决于当时导出的那个人还记得多少。第二是数据时效性失控,模型上线之后业务数据一直在涨,但训练集停留在一个固定时间点,训练和线上之间的分布漂移会越来越大。第三是调度缺失,训练任务没有挂在统一调度系统上,今天跑没跑、跑成功了没有,完全靠人肉盯。
后来我们统计过,几乎百分之七十以上的模型效果波动,最后追根溯源都不是算法本身的问题,而是训练数据链路出了岔子——要么某张源表的分区没跑出来、要么样本生成任务的SQL里过滤条件和上次不一样。这些问题一旦进入生产,排查成本极高。所以一个最朴素的结论就是:训练任务要变成和数仓ETL一样“有调度、有依赖、有血缘”的一等公民,而不是游离在体系之外的野任务。
1.2 数据闭环的几个必要环节
要回答“集成方案应该覆盖哪些环节”,我觉得可以先把机器学习从数据到最终产出的完整链条拆出来。它大致分七段:
- 数据源接入:业务库、日志、消息队列里的原始数据,通过各种同步通道进入数仓或数据湖。
- 数据加工与特征工程:在数仓/数据湖里完成清洗、关联、聚合、特征计算。这一步是数据工程最核心的地盘。
- 样本生成与版本管理:把宽表或特征集转换成模型训练所需的样本文件,记录版本、时间范围、特征口径。
- 模型训练与调参:训练任务读取样本,产出模型文件和相关指标。
- 模型评估与发布:离线评估、A/B实验、模型注册、灰度发布。
- 在线推理或批量推理:模型上线到服务,或者跑批量预测任务。
- 监控反馈:预测结果回流到数据体系,记录真实反馈,用于模型迭代和漂移监测。
这七个环节里面,第一个和第二个基本已经在数据平台的掌控范围之内,第三个到第七个才是机器学习平台要负责的,但恰恰是这几个环节,和大数据架构的耦合度最高。所谓“集成”,本质上就是把第三条以后的部分“焊死”在现有的数据管道上,让数据和模型之间形成自动循环。
1.3 集成带来的实际收益
我们后来常说一句大白话:集成的结果不是多了一个平台,而是让数据资产长出了“决策能力”。具体到收益上,真正能落到纸面的有这些:
- 样本可追溯:每个模型都能查到它用的是哪一批数据、哪个特征版本、哪个训练代码版本,出问题能快速定位是数据变了还是代码变了。
- 训练时效性可控:训练任务挂到调度系统上,源表分区就绪后自动触发训练,业务看到的预测结果延迟从“周级”降到“天级”甚至“小时级”。
- 运维成本下降:特征计算逻辑收敛到统一的特征存储或数据模型中,不会被算法工程师各写一套互相不一致的SQL。
- 模型迭代速度提升:数据更新自动触发训练,模型效果劣化能被监控发现,整个迭代闭环不再依赖人力推动。
这些收益换算成技术指标,就是数据延迟、样本准确率、模型更新频率、异常恢复速度。而实现这些收益,需要从选型开始就想清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 集成路径选型:从Spark到Feature Store的取舍逻辑
技术选型是集成方案里最容易被“看着主流就选了”的部分。主流的开源组件,比如Spark、Flink、Airflow、Ray、MLflow、Feast,每个单独拎出来都很好用,但组合在一起是否适合你的团队和场景,需要仔细权衡。这块我打算分成两条主线来拆:一条是计算引擎选型,另一条是元数据和工作流选型。
2.1 计算引擎选型:训练和特征处理到底在哪一层算
业界常见的做法是训练特征的计算分成几个阶段:原始数据清洗和聚合在数仓层面完成(通常是SQL),更复杂的特征变换放在样本生成环节做(Spark任务),模型训练本身在训练集群上完成(GPU或CPU集群)。这个分层是必要的,因为在数仓里直接做特征变换通常依赖数据库自定义函数,开发和调试效率都偏低,而全部拿到训练端用Pandas处理又会碰到数据量瓶颈。
选型上,我建议遵循一个原则:训练代码里能少碰数据就少碰数据,把绝大部分数据加工尽量前移到Spark或SQL中完成。这样做的好处是特征计算可以利用数仓现有的资源和调度,而且数据量再大都不至于把训练进程撑爆。给个具体配置参考,我们当时用Spark做样本生成任务时的典型参数:
- 执行模式:yarn-client或yarn-cluster,看训练集群是否和Hadoop共用。
- 资源规格:executor数量8-16个,每个executor 8-16核
