尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零搭建AI工程:数据、实验、部署与监控的完整实践指南

从零搭建AI工程:数据、实验、部署与监控的完整实践指南 直接从零开始搭一套AI工程的架子这活儿我干过不止一回。每次回头复盘都会发现同一个问题大多数人以为“AI工程”就是把模型训练完、能出个接口就完事结果模型上线之后没人管、数据一变就崩、实验记录一塌糊涂。今天就想借着“ai-engineering-from-scratch”这个话题把从零开始搭建AI工程能力这件事从头到尾拆一遍包括你真正该关注的环节、我自己踩过的坑以及一些实测有效的落地顺序。这套思路适合正在做算法想转工程、后端想转AI方向、以及小团队想搭基础设施的人不管你是刚起步还是已经被线上模型虐过都能找到点有用的东西。1. 先想清楚AI工程到底解决什么问题1.1 机器学习研究和AI工程的分界线很多项目死在第一步不是因为代码写得不好而是没搞明白自己做的到底是什么事。机器学习研究追求的是“在特定数据集上把指标刷高”AI工程追求的是“在不确定的现实环境里稳定可靠地产生价值”。这是两种完全不同的思维方式。研究阶段你拿到一份固定的训练集可以反复调整模型结构、调参、试错迭代空间很大。但到了工程阶段数据是流动的、分布是会变的、下游调用方是会把模型输出当真的你的目标变成“在多方约束下维持系统的健康”。举个生活化的类比研究阶段像是做一道拿手菜食材固定、火候可以慢慢调工程阶段是开一家餐厅要面对食材供应波动、顾客口味变化、后厨出菜节奏菜品能稳定端出来才是核心。所以“ai-engineering-from-scratch”中的“from scratch”强调的并不是把神经网络从反向传播开始手写一遍而是把“代码能跑”变成“系统能活”的整套能力。这包含数据管线的可靠性、实验的可复现性、模型服务的稳定性、线上指标的监控与反馈闭环。缺了任何一个环节模型都只是实验室里的摆设。1.2 从零搭建前必须先做的三个决策动手之前先花时间想清楚三件事能省下后面大量返工时间。第一件模型的交付形态。你是要做实时在线推理还是离线批量预测还是边缘端部署这个决定直接影响到服务架构、依赖管理、性能优化方向。我见过一个团队花了大力气把模型封装成高性能在线服务结果业务场景根本不需要毫秒级响应离线每天跑一次就够白白增加了一堆复杂度。第二件基础设施的选型边界。团队有没有专门的运维云平台能不能用托管的模型服务数据量级到了什么程度这些决定了你是用轻量方案快速跑通还是一次性搭出生产级平台。我的建议是从零开始不要追求“大而全”先把最小闭环跑通再逐步扩展后面会详细说这个策略怎么落地。第三件团队的角色分工。AI工程不是一个人能包揽所有环节的至少要覆盖数据、模型、服务三条线。小团队里可能一个人身兼数职但职责边界要清楚谁负责数据质量谁负责模型迭代谁负责线上稳定性。分工模糊是项目后期最痛苦的拖累很多上线事故回头看都是因为“都以为对方管了”。2. 从零搭建AI工程的地基数据与特征管线2.1 第一版数据管线避开这五种设计数据管线是最容易被低估的部分但它往往决定了工程的上限。第一次搭数据管线我建议刻意避开下面五种设计都是真实踩过的坑。第一种是“一次性脚本流”。为了赶进度用几个Python脚本串联起来跑数据清洗和特征工程没有调度、没有依赖管理、没有失败重试。一开始没问题但数据量上来或源数据Schema发生变化后脚本跑挂了你根本不知道它挂在哪一步也没法从断点续跑。第一版就引入一个简单的调度工具哪怕是cron加日志也比纯脚本强得多。第二种是“全量重新计算”。每天把历史数据全部重新处理一遍短期内没感觉但数据量增长后计算成本急剧上升而且处理时间越来越长最终变成深夜作业都跑不完。更好的做法是引入增量更新机制按时间分区、只处理新增和变更的数据配合数据版本管理。第三种是“训练集和线上特征逻辑不一致”。这是AI工程里最隐蔽、危害最大的问题。特征工程代码散落在训练脚本和推理服务里各写一份很可能出现线上用的特征处理方式和训练时不一致。解决方案是建立单一特征处理代码库训练和推理都调用同一份代码后面小节我会详细讲。第四种是“数据质量校验缺失”。源数据突然出现大量空值、范围异常、重复记录这些情况如果没有在管线入口处拦截模型输出就会悄悄变差而你往往要等很久才能从业务指标上发现。第一版数据管线就应该包含数据校验规则比如非空率、取值范围、枚举值合法性让坏数据在源头就被拦住。第五种是“没有数据版本的概念”。训练集被覆盖、预处理后的特征数据找不到对应版本导致模型无法复现。哪怕只是用快照目录的方式给每批数据打上时间戳也能解决绝大多数复现问题。2.2 特征存储与训练-推理一致性特征处理的一致性值得单独拎出来说。我自己第一次做推荐系统模型时就吃了大亏训练时用Python pandas处理特征上线时用Java重新实现了一遍结果特征分布对不上线上效果直接砍半。排查了两天才发现是某个特征在两种语言里的取整方式不同。解决这个问题的标准做法是用一套特征处理代码组件在训练流程和推理服务中复用。比如把特征工程封装成独立的Python包训练时直接调用推理时通过一个轻量的特征服务暴露出来。这样可以保证特征值在训练和推理两条链路上走完全相同的逻辑。另一个容易被忽略的点是特征快照。在线推理时有些特征会随时间变化比如用户最近浏览时长、商品实时库存。训练时用的特征值对应的是过去某个时间点的状态线上推理时也要用“假设在同一个时间点”能拿到的特征。如果训练时使用了未来信息在线服务根本拿不到的模型就会虚高。这类特征工程里的Leakage问题在工程落地时最容易暴露需要特别留意时间戳对齐。到这里你会明白数据管线和特征层已经占了AI工程一半的工作量。没有稳定可靠的数据管线后面所有的模型迭代都会像在流沙上盖楼。把这一层打好底子再谈实验管理和模型服务才是有意义的。我自己在这个阶段花的时间占比接近一半我认为是完全值得的。3. 实验管理没有实验追踪的AI工程等于盲飞3.1 实验追踪工具选型与参数记录规范两三个月后你回顾自己跑过的模型如果说不清每个实验用了什么数据集、什么超参数、当时为什么这么调那这个团队基本没有沉淀。做过AI工程的人都知道实验追踪不是“记录一下”这么简单它决定了你能不能高效迭代也决定了你能否向业务方解释模型效果的变化。工具层面推荐从MLflow、WB、Neptune这类成熟的实验管理工具里选一个开始。如果团队已经有使用习惯不换也行关键是统一。我自己用过几款从实用性角度讲MLflow因为开源、自部署方便、和Python生态契合度好适合大多数从零起步的团队。WB的交互界面更舒服但部分功能在私有化场景有依赖。Neptune适合大型团队团队不大的话可能比较重。核心指标只有一个能不能把每个实验的参数、代码版本、数据集版本、模型文件这四样东西完整关联起来。参数记录规范比工具选型更重要。我见过有人用MNIST跑通后又加了几个实验参数记录全部散落在各处的笔记本里一周之后就说不清哪个是当时效果最好的版本了。建议从第一天就定几条简单规矩每个实验要有唯一的命名命名里包含模型名和数据日期每次运行记录完整超参数训练结束后把最佳模型文件主动存档不要只靠文件名识别。这些看起来琐碎但在项目冲刺阶段能帮你省下大量时间。3.2 模型可复现性的完整方案实验追踪更底层的目标是模型可复现。所谓可复现不是说代码能跑通就行而是给定同一份数据、同一个代码版本、同一组参数任何人任何时间都能还原出相近的结果。这个要求比很多人想得要苛刻因为影响结果的因素太多了。首先是随机性问题。深度学习训练里涉及随机初始化、数据Shuffle、Dropout等随机过程。要保证可复现需要固定全局随机种子并且对数据加载器的Shuffle顺序做控制。TensorFlow和PyTorch都提供了相关设置但不能只设置一个seed就觉得万事大吉还需要注意GPU算子本身可能引入不确定性这可以通过设置相关环境变量来缓解具体要看框架版本。其次是代码版本和数据集版本的强关联。训练代码要从版本控制库里拉取数据要从带版本标记的位置读取。最简单的方式是让实验追踪系统记录代码的Git提交哈希和数据集的校验值比如记录数据文件的MD5。这样任何一个历史实验都能快速还原出当时的上下文。第三是依赖环境的一致性。同一个代码在Python 3.8和3.10下可能运行结果就不一样PyTorch版本升级也会引入数值差异。建议在训练项目里使用依赖锁定文件把依赖库的精确版本固定下来。更进一步是整个训练环境用容器镜像来固化这是最稳妥的方案后面会详细说容器化的具体做法。依赖环境的一致性对可复现性的帮助非常明显这一点我现在特别强调——因为挺多做AI工程的朋友一开始都容易忽略它。4. 模型上线把训练好的模型变成稳定服务4.1 模型服务化的三种方式与选型模型训练完只是万里长征走完一半如何把模型高效、稳定地暴露给上层业务是AI工程的核心交付环节。模型服务化主要有三种形态我分别说下适用场景和要注意的点。第一种是离线批量预测。适用于用户画像、风控名单、每日推荐候选池等对时效性要求不高的场景。实现方式通常是定时任务从数仓取数据批量调用模型预测结果写回存储。这种方式的优点是逻辑简单、容易重试、方便追溯缺点是结果有延迟实时性差。第二种是在线实时推理服务。适用于搜索、推荐、实时风控等需要毫秒级响应的场景。一般通过REST或gRPC接口对外提供预测能力服务内部完成特征拼接、模型推理、结果后处理。这里有个容易踩的坑模型推理框架和Web服务框架的线程模型要协调好否则并发一上来就出现大量超时。我通常会把模型推理和后端业务逻辑拆开模型单独部署成推理实例再在前面加一层网关避免模型加载和请求处理互相干扰。实际测试下来这种方式更稳扩展也灵活。第三种是边缘端部署。把模型压缩后部署到手机、嵌入式设备上。这块涉及量化、剪枝、推理引擎选型等额外工作如果只是从零起步一般可以先不做边缘端等业务验证跑通了再考虑。选型时有一个很实际的标准优先使用成熟的推理框架和部署方案而不是自己写推理代码。Triton、TorchServe、TensorFlow Serving这类工具把模型加载、并发管理、动态批处理都封装好了直接减少了自己实现时可能踩的坑稳定性也更有保障。4.2 灰度发布与回滚机制模型上线最怕的事情是你以为新模型效果好结果线上表现很差甚至影响核心业务。所以从第一次上线起就必须建立灰度发布与快速回滚机制。灰度发布的核心思路是“小流量验证”。先把新模型部署到独立的环境用一小部分真实流量做对比测试。流量切分的比例可以从1%开始逐步扩大到5%、10%、50%每一步都要等业务指标稳定后再继续。如果发现异常需要能一键切回旧模型。这里有一个容易忽略的细节模型服务的版本管理。同一个服务可能同时存在新旧两个模型版本需要通过服务配置或路由规则来控制流量分配。如果用的是Triton这类推理框架可以利用它的模型版本管理能力直接通过配置切换版本而不需要重新发布整个服务。如果是自研服务建议在代码里保留多版本模型加载能力避免切换模型需要重启进程。另外回滚机制不只要“切回旧模型”还要考虑数据回放的问题。如果新模型在线上跑了几天产生的结果已经写入业务库那回滚后这些数据如何处理也要提前想好。否则会出现模型切回去了但历史结果还是新模型产出的不一致状态。这块虽然没有标准答案但在设计系统时留个心眼能省去后续很多麻烦。5. 模型监控与持续迭代AI工程的验收标准5.1 线上监控指标怎么定模型一旦上了线监控就成了头等大事。AI工程的验收标准不是“模型指标多高”而是“线上系统是否一直健康”。如果一个模型线上使用了半年你连它的效果什么时候开始下滑都不知道那这个工程基本算是失败的。监控指标分两类。第一类是系统层指标推理延迟、吞吐量、错误率、服务可用性。这些和普通后端服务的监控一样可以用Prometheus加Grafana这类工具来做但必须针对每个模型单独区分不能所有模型混在一起统计。第二类是模型层指标这部分更有AI工程的特色。最基础的是预测分布监控比如模型输出的类别分布、分数均值、分数标准差是否发生明显变化。如果某个二分类模型历史平均分数一直稳定在0.3附近突然连续多天跳到0.6那说明线上输入分布可能变了或是模型本身出了问题。更直接的是业务反馈型指标比如推荐系统的点击率、搜索的转化率。这类指标能反映模型效果但存在延迟和噪声——用户行为需要时间积累并受外部活动影响。所以比较好的监控方案是“系统指标兜底和模型指标预警分层结合”系统指标保证服务有响应分布指标提示变更发生业务指标验证效果真伪。5.2 数据漂移的完整处理流程数据漂移是模型上线后最普遍却又最容易被忽视的问题。所谓数据漂移是线上真实数据的分布和训练数据的分布出现了显著差异。比如电商大促期间用户购买意愿整体提高模型看到的特征分布就和平时不同原来预测的准确率也就自然下降。处理数据漂移首先要能及时发现。实践中可以通过定期比较线上实时特征分布和训练特征分布来实现常用的统计量包括PSI族群稳定性指数或KL散度。给每个关键特征设置阈值当漂移指标超过阈值时触发告警这算是一个可落地的第一步方案。发现问题后接下来要做的是找漂移根源。这个环节需要业务知识和数据排查结合是不是近期有新的用户群体进入某个特征的数据来源是否发生了变化上游业务是否调整了规则我通常会让负责这个模型的人先从业务侧排查再看特征分布的变化细节因为很多漂移的根因并不在模型本身。找到根因后再决定处理方案有时需要重训模型有时只需要调整特征工程有时则要增加新数据源。这里特别想强调处理好一次数据漂移之后一定要把根因和处理过程沉淀成文字别让团队成员反复踩同一个坑。而且随着接入的模型越来越多一个公共的漂移监控平台比每个模型各自写一套脚本要省心得多这个平台的价值会在规模上来之后体现得格外明显。6. 从零到一的落地路径我个人推荐的顺序6.1 小步快跑的路线图从零开始搭AI工程最大的忌讳是想一次到位。我见过不少团队上来就规划数据平台、特征平台、模型平台、推理平台结果半年过去连一个能上线的模型都没有。比较好的路径是先跑通一个垂直场景的端到端闭环再横向复制能力。第一步是选择一个具体的业务场景最好是一个有明确数据、有清晰效果衡量的场景比如给用户做流失预警。围绕这个场景把数据读取、特征工程、训练脚本、实验记录、简单部署全部跑通。这个阶段不需要完美只需要“麻雀虽小五脏俱全”。重点是让团队对AI工程的全流程有体感发现最容易卡住的地方。第二步是在第一个场景稳定运行的基础上提炼公共组件。比如数据校验、特征复用、模型版本管理、监控模板。这些组件在第一轮往往是“顺便”做出来的验证有效后可以抽出来给更多场景复用。第三步才是平台化。当你有了三五个线上模型每个模型都要重复做一遍部署、监控、告警配置时自然会产生平台化的需求。这时再做统一管理就是顺水推舟的事整个方案也会更贴合实际。有明确的顺序感之后团队不会因为一次性铺太大而陷入混乱。6.2 过程中的关键经验心得做到这里已经算是一次比较完整的实践。最后说说我在反复经历“从零搭建、上线、踩坑、再搭建”之后沉淀下来的一些体会。第一AI工程的核心约束是“反馈闭环”。如果模型预测之后没有任何机制告诉你结果好不好那整个系统就是盲目的。所以哪怕最开始没有复杂监控平台也至少要有一个简单的数据回传渠道记录用户行为或业务结果。第二工程上不要追求“最新”要追求“最稳”。深度学习框架和部署工具的新版本往往伴随行为变化生产环境升级必须谨慎。我的习惯是线上环境锁定版本升级之前先在测试环境完整回归一遍模型指标和性能指标。第三文档和规范的价值会随着团队扩大而凸显。早期两三个人时口头沟通仿佛够用一旦加到五个以上没有实验记录规范、没有部署流程定义就会出现效率的指数级下降。这不是管理强迫症而是AI工程本身的复杂性决定了它必须依靠流程来约束。从零到一并没有多神奇无非是把数据、实验、部署、监控这个闭环一圈圈跑顺把该踩的坑提前踩掉。之后每接入一个场景都会比上一个更快更顺这也是做AI工程最有成就感的地方。
返回列表