半年前我第一次把训练好的模型交给后端团队上线时,被问得哑口无言:这个接口延迟多少?QPS能扛多少?模型文件多大?特征怎么对齐?怎么回滚?我当时脑子里只有一份跑得通的notebook,其他全是空白。那一刻我才意识到,实验室里的准确率数字,离一个真正的AI工程还差着十万八千里。
这也是我想写这篇文章的原因。所谓ai-engineering-from-scratch,不是教你怎么训练一个模型,而是讲清楚从零开始,把一个模型变成一套稳定、可靠、可迭代的AI系统到底要经历什么。它适合两类人:一类是已经能跑通模型、但不知道下一步该怎么走的算法工程师,另一类是准备在团队里推动AI工程化落地、却没找到完整路线图的Tech Lead。
你不需要懂所有框架的源码,但需要对数据、训练、部署、监控这四个环节有一个整体性的框架认知。下面就是我完整的实操经验。
1. 从模型实验到AI工程的认知转换
AI工程这个词被说得太烂了,甚至有点被滥用。但真正做过的人都知道,它和算法研究是完全两种工作方式。理解这个区别,是建设AI工程的第一步。
1.1 跑通模型只是起点
在我接触的大量团队中,最容易出现的误判是:把notebook里的模型准确率当成了项目完成度。准确率90%,好像就可以交付了。但实际上,从跑通到生产可用,中间还横着好几座山:数据能不能持续流入?特征会不会在线上和离线算的不一致?模型服务能不能承受真实流量?出问题了怎么定位?
我见过一个项目,模型在线下测试的F1分数很高,但上线后业务反馈一塌糊涂。查到最后发现,线上请求经过网关时,部分字段被截断,进入模型的特征分布和训练时有明显差异。这种问题在notebook里永远发现不了,只有在真实系统里才会暴露。所以说,AI工程的核心工程对象,不是模型本身,而是围绕模型构建的一整套系统。
一个朴素但重要的判断标准:如果模型下线,团队能不能在一小时内让业务恢复原状?如果不能,说明你的AI工程还缺少关键环节。
1.2 AI工程的四个核心支柱
我习惯把AI工程拆成四块:数据、训练、部署、监控。这四块不是串联关系,更准确的说是互相咬合的齿轮。数据质量决定模型上限,训练流程决定迭代速度,部署方式决定服务稳定性,监控机制决定系统可持续性。
这也是为什么我不建议一上来就追最新的框架、最强的算力。先盘一下四个支柱里哪个最薄弱,然后集中精力补上。数据源头混乱,先搞数据治理;训练与复现靠运气,先搞实验管理;线上模型出问题无人知,先搞监控告警。把最弱的短板补齐,工程体系的稳定性会肉眼可见地提升。
这里有个关键认知:AI工程不是一次性的搭建工作,而是一个持续演进的过程。不要试图一步到位,先建立最小闭环,再逐轮加固。
2. 数据底座:AI工程的起点
如果说模型是马车,数据就是路。路不平,马车再好也跑不快。在我实操过的项目里,数据相关的问题占了整个AI工程周期里超过一半的时间,所以这部分必须最先聊透。
2.1 数据管线的分层设计与实现
从零开始搭数据管线,我推荐按"采集-存储-处理-发布"四层来组织。
- 采集层:统一收口业务数据、日志、外部接口数据,做到格式标准化、字段有schema约束。
- 存储层:原始数据存对象存储,中间结果存数仓,特征数据存特征库,各司其职互不污染。
- 处理层:用批处理做离线聚合,用流处理做实时特征刷新,两条链路共用一套数据定义。
- 发布层:通过数据版本管理工具为每个数据集打快照,训练作业只消费指定版本的数据。
这里很多人会问:一开始数据量不大,是不是可以从简?我的回答是:工具可以简单,结构不能乱。哪怕只有几百MB数据,也要把目录结构、命名规范、版本标记建立起来。因为数据管线的核心目的不是处理大数据,而是让每次模型训练的数据都可追溯。
我自己的一个实操习惯是:每个数据集快照都附带一个manifest文件,里面写清楚数据来源、采集时间、预处理操作和负责人。这样当模型效果异常时,我可以快速回溯是哪一批数据引入了问题,而不是在全量数据里大海捞针。
2.2 特征一致性:离线与在线对齐问题
这是AI工程里最隐蔽、也最容易翻车的坑。训练时,模型从离线特征表里读数据;推理时,模型从在线特征服务里拿实时特征。如果两边对同一个特征的加工逻辑不完全一致,那模型的输入分布就已经变了,再强的算法也救不回来。
我踩过最深刻的一次坑是时间戳处理。离线训练时,我们把时间戳转换成了本地时间的小时特征;上线时,服务部署在多台机器上,有的机器时区没设置对,导致小时特征偏移了8小时。那个模型上线后,每天晚上的预测准确率都下降,排查了三天才发现是时区问题。
要解决离线在线一致性问题,必须做到特征逻辑代码统一。最稳妥的做法是把特征计算函数打成公共包,离线和在线共用同一份代码。如果做不到,至少要建立一份特征逻辑文档,并通过离线回放的方式定期验证两个链路产出的特征分布是否一致。
一个建议:把"特征一致性检查"写入模型发布流程。新特征上线前,必须离线回放N天数据,比较在线特征与离线特征的分位数分布差异,差异超过阈值则禁止发布。
3. 训练端的工程化改造
数据问题上道之后,接下来就是训练端。很多算法工程师习惯在notebook里调参,跑出一个模型就导出,这种模式在小项目里没问题,但当模型需要每周迭代、多人协作时就完全不可行了。
3.1 从Notebook到可复现训练流程
Notebook本身不是敌人,不能复现才是敌人。我见过团队里的同学训练时用了某个随机种子,但没记录到底是什么;还有人手动改过训练脚本,但代码库里没有对应commit。这种状态下,一旦模型效果有波动,根本无从定位原因。
所以我对训练流程的工程化改造,第一件事就是制定"可复现三要素":代码版本、数据版本、超参配置。三者必须明确记录,缺一不可。
一个可复现训练流程的落地路径:
- 代码入库管理:训练脚本和特征代码全部纳入版本库,禁止在本地裸跑后不提交。
- 配置与代码分离:把超参、路径、模型结构参数写进YAML配置文件中,训练脚本只负责读取配置。
- 统一入口:用一个entrypoint脚本拉起训练,记录git commit、数据版本、启动时间、机器信息。
- 产物归档:训练结束后,把模型文件、评估报告、配置快照一起归档到模型注册中心。
这套流程看起来简单,但每一条都是我踩过坑之后才总结出来的。尤其是配置与代码分离,一开始觉得多此一举,直到有次需要复现一周前的一个实验,发现超参全写在代码里,而代码已经被改得面目全非,那才叫绝望。
3.2 实验追踪与算力资源管理
加上实验追踪工具,是训练端工程化的一个分水岭。我自己的经验是不管初期多忙,至少要记录三组信息:指标组(loss、accuracy、auc等)、参数组(学习率、batch size、模型层数)、元信息组(数据集版本、代码版本、GPU型号、框架版本)。
这些信息可以手工记录,也可以接入MLflow、WandB这类工具。我比较推荐从轻量方案开始,先保证有记录、能对比,再逐步规范化。等实验数量多了、参与的人多了,再统一到平台化管理。
算力资源管理是另一个容易被忽略的点。多个人同时训练,GPU资源怎么分配?怎么避免某个任务把显存占满拖垮别人?我建议至少在团队内形成一个简单的约定:训练任务统一使用资源调度工具拉起,限制单任务最大算力占用,超时未完成任务强制释放。
小技巧:训练任务结束前,自动把关键指标和配置发到团队聊天群。这样做的好处是,每个人都能看到实验趋势,省去反复询问“你跑得怎么样”的沟通成本。
4. 模型部署与推理服务化
模型训练好了,要真正产生业务价值,还得跨过部署这一关。部署的难点不在于把事情跑起来,而在于让它长期稳定地跑下去。
4.1 部署方式选型:在线服务、批处理与边缘端
部署方式没有银弹,只有适不适合。我通常会建议团队想清楚业务场景再选型:
| 部署方式 | 适用场景 | 优点 | 代价 |
|---|---|---|---|
| 在线API服务 | 实时推荐、风控、客服 | 低延迟、可扩展 | 需要运维基础设施 |
| 批处理预测 | 离线画像、报表分析 | 简单可靠 | 无法满足实时请求 |
| 嵌入式/边缘端 | 手机端、IoT设备 | 无网络依赖、隐私友好 | 模型压缩复杂、更新困难 |
从我实操过的项目来看,第一版模型上线,如果业务允许,优先选择批处理方式。因为它不需要考虑复杂的服务治理问题,跑完任务落库就行,成本最低。等到业务验证了模型价值,再演进到在线API服务。
在线API服务要注意的细节很多,最重要的三个是:模型加载预热、超时控制、优雅关闭。模型加载预热是为了避免第一个请求被模型初始化时间拖垮;超时控制是为了防止模型推理阻塞拖垮整个服务;优雅关闭是为了在发布更新时,正在处理的请求不能被硬生生掐断。
4.2 推理优化的关键参数
很多人在部署后才发现:模型离线测试很快,线上却反应慢。这里有几个关键参数需要提前算清楚。
- 单次推理耗时:用生产环境的CPU/GPU实测,而不是本地跑出来的数据。
- 吞吐量QPS:结合业务预估峰值,乘以冗余系数(我一般取1.5-2倍)。
- 服务实例数:由吞吐量和单实例处理能力计算,再考虑高可用的多副本冗余。
- 延迟分位数:不能只看平均延迟,要关注P95、P99,避免尾延迟拖垮体验。
我举一个实际算例。假设模型单次推理耗时20ms,单实例可以轻松支撑50 QPS。业务峰值预估是200 QPS,乘以1.5冗余系数就是300 QPS,所以需要6个实例。如果还要保证单个实例故障时不掉线,就要再加1个冗余实例,一共7个。
这个例子非常简单,但很多人上线前根本没算过。等流量冲进来了,才发现实例不够,扩容又来不及,只能干着急。
提示:上线前一定要做压测,而且要在和线上环境一致的机器上压测。用本地MBP跑出来的性能数据,和线上共享CPU环境下的表现,往往差别巨大。
5. 线上监控与迭代闭环
模型部署完成,很多团队就以为大功告成。其实真正的工程考验从这一刻才开始:模型在线上表现得好不好?数据分布变了吗?用户行为模式变了吗?这些都靠着监控来回答。
5.1 模型性能监控与漂移检测
监控不是只盯着服务器CPU、内存这些基础设施指标,更要盯模型业务指标和输入数据分布。
我推荐在监控体系里至少包含三类指标:
- 业务指标:如推荐点击率、风控拦截率、客服解决率,直接反映模型是否贡献了价值。
- 输入分布指标:特征的均值、方差、分位数分布,用于发现数据漂移。
- 运行时指标:单次推理耗时、请求量、错误率,用于发现服务稳定性问题。
漂移检测的落地方式,我比较常用的是:周期性计算线上特征分布与训练特征的PSI或KL散度。当漂移指标超过阈值时触发告警,并自动对比两端分布的差异,帮助定位是哪一批特征发生了变化。
线上业务指标下降时,先不要急着调模型,要先确认是数据漂移、特征逻辑变更、外部环境变化,还是模型本身上限不足。盲目重训模型,往往浪费算力却解决不了真实问题。
5.2 回滚、灰度与自动化运维
AI系统必须和其他系统一样,具备快速回滚能力。模型是有版本的,每一次发布都应该对应一个可回退的上一个版本。我建议在发布流程中强制加入灰度发布步骤:先切5%流量观察核心指标,稳定后逐步放量到20%、50%、100%。
这一步很多工程师嫌麻烦,尤其在业务方催促上线时,经常有人图省事直接全量。我理解压力,但灰度真的能救命。有一次我们的新模型在某个人群上表现极差,灰度阶段发现了问题,流量还停留在5%,10分钟内就回滚了,业务几乎无感知。如果当时直接全量,影响面会非常大。
自动化运维层面,至少要补齐三件事:健康检查、自动重启、故障告警。模型服务进程挂了,应该能在秒级自动拉起;拉不起来,系统要立刻通知到值班人。不要让用户比你先发现故障。
6. 从零搭建AI工程的常见坑
最后这一章,我整理一下这几年从零搭建AI工程时反复遇到的坑。这些内容很个人,但大概率你也会碰到。
6.1 数据治理的坑
数据治理最大的坑,就是觉得它不够性感、优先级低,拖到最后才来做。结果就是每个新模型都要重新写一遍数据清洗逻辑,每个数据源都在重复踩坑。
我的建议是,无论项目多小,第一个迭代就要引入数据schema校验和异常数据告警。数据字段缺失率超过阈值、取值超出枚举范围,都应该第一时间被发现。数据如果有毒,后面的模型、部署、监控全都是白搭。
另外提醒一下,不要过早追求复杂的实时数据架构。很多团队的实时需求并没有那么大,Kafka、Flink全套上马,维护成本翻了几倍。先用好离线批处理,在数据新鲜度确实无法满足业务时,再引入流处理。
6.2 评估与测试的坑
模型测试不只是看准确率。我在实践中养成的习惯是:每次训练完,至少看四类表现:整体指标、分人群指标、异常样本表现、新样本表现。只看整体指标,很容易被平均值骗了,某个群体的指标可能已经差到不能接受。
另一个容易被忽略的是离线与在线指标的对齐问题。离线评估涨了一个点,线上业务指标却可能纹丝不动。我建议在模型上线前就约定好离线指标与在线业务指标的映射关系,并在多个历史版本上验证这个映射是否稳定。
6.3 跨团队协作的坑
AI工程从来不是算法一个团队的事。我参与的项目里,顺畅推进的,都是算法、后端、数据、运维坐在一起磨合过的。这里有个非常实用的经验:把AI系统的接口契约、数据依赖、性能指标写清楚,并提前和相关团队对齐。
最怕的场景是:算法团队自嗨做了一大堆,后端团队直到上线前才第一次见面。那时候出任何问题,都只能加班救火。我建议把跨团队里程碑列出来,在关键节点同步一次。哪怕只是半小时的站会,也能把大量隐患消灭在早期。
最后一个经验是:从零开始做AI工程,不要贪大求全,先搞定最小闭环,把一个模型端到端跑通,再逐步叠加复杂度。我在第一个AI项目中,就是靠着一个简化但完整的闭环,建立了团队对工程化流程的信心。后面的迭代,反而越来越顺。希望这篇文章能让你少走一些弯路,哪怕是少加一次班,也算是值了。