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

资讯详情

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

AI工程从零搭建实战:数据管道、特征存储与模型部署全流程

AI工程从零搭建实战:数据管道、特征存储与模型部署全流程 1. 从零搭建AI工程能力这个项目到底在解决什么问题第一次看到ai-engineering-from-scratch这个标题我脑子里蹦出来的第一个念头是又一个“从入门到放弃”的教程合集但翻了一圈社区讨论和实际动手跑过之后我发现它切中的是一个特别真实的痛点——市面上讲AI的教程要么只讲调包要么只讲论文中间那层“工程落地”的脏活累活几乎没人系统讲。你肯定遇到过这种情况跟着某个教程跑通了MNIST手写数字识别觉得自己会AI了结果一到真实项目面对数据清洗、特征管道、模型版本管理、推理延迟优化、线上监控这些事整个人是懵的。ai-engineering-from-scratch想干的事就是把这中间的断层给补上。它不是教你从零推导反向传播公式也不是教你背Transformer架构图而是教你怎么把一个AI想法变成能跑在生产环境里、能被人用、能持续迭代的系统。这个项目适合谁我梳理了一下大概三类人收益最大。第一类是刚转行做AI的软件工程师你有工程底子但不懂模型那套东西这个项目能帮你把两边接起来。第二类是做算法但缺工程经验的研究生或研究员你模型调得溜但让你部署一个API服务、搞一套数据版本控制你可能就抓瞎了。第三类是技术负责人或架构师你需要一套完整的AI工程checklist来评估团队的能力短板和项目风险。核心关键词ai-engineering-from-scratch里的“from scratch”我理解有两层意思。一层是从零开始学另一层是从零开始搭——不是用现成的MLOps平台一键部署而是自己动手把每个环节的轮子造一遍造的过程中你就理解每个环节为什么存在、解决什么问题、什么情况下会崩。这种“造轮子”的学习方式比看十篇综述文章都管用。我实际跟着走了一遍它的核心模块最大的感受是AI工程和传统软件工程最大的区别在于“不确定性”的管理。传统软件你写个函数输入A一定输出B但AI系统里同样的输入模型可能给你输出B、B、甚至C。这种不确定性会渗透到数据、训练、部署、监控每一个环节而ai-engineering-from-scratch的价值就是教你怎么在这种不确定性下依然能构建出可靠的系统。2. 核心模块拆解一个AI工程项目到底要过几道关2.1 数据工程别急着调模型先把数据管道搭明白我见过太多项目死在数据上。模型选型吵了三天结果数据清洗脚本写了一周还没跑通。ai-engineering-from-scratch把数据工程放在最前面这个顺序是对的。它讲的数据工程不是pandas的read_csv怎么用而是怎么构建一条可复现、可版本化、可扩展的数据管道。具体来说它覆盖了几个关键环节。数据摄取部分它对比了批处理和流式处理两种模式。批处理适合离线训练场景比如你每天凌晨跑一次ETL把前一天的业务数据抽出来做特征流式处理适合实时推理场景比如用户行为序列需要实时更新特征。它给了一个判断标准如果你的特征时效性要求在分钟级以内就必须上流式如果小时级甚至天级就够批处理更简单更稳。数据验证这块是我觉得最被低估的。很多人觉得数据验证就是检查有没有空值但实际项目里数据分布漂移才是隐形杀手。它介绍了一个做法对每个特征列维护一个统计基线均值、方差、分位数每次新数据进来先算统计量和基线对比超过阈值就告警。这个做法听起来简单但能拦住80%的线上事故。我自己的经验是数据验证的规则要写在管道里而不是写在文档里写在文档里的规则没人执行写在管道里的规则会自动拦截。数据版本控制是另一个痛点。代码可以用Git管但数据怎么管它推荐了两个思路小数据集直接存文件加哈希大数据集用DVC或者LakeFS这类工具做指针管理。核心原则是任何一次模型训练必须能追溯到用的哪份数据、哪个版本。我踩过的坑是有一次模型效果突然掉了排查了两天最后发现是数据管道里一个join逻辑改了但没人记录。从那以后我要求团队任何数据变更必须走PR流程和代码变更一样严格。注意数据管道的每个环节都要有幂等性。什么意思就是同一个任务跑一次和跑十次结果必须一样。否则你重跑任务时数据会重复或丢失排查起来极其痛苦。2.2 特征工程与特征存储把特征当产品来管特征工程这块ai-engineering-from-scratch提了一个很工程化的视角特征不是一次性代码而是可复用的资产。传统做法是每个模型项目自己写一套特征计算逻辑A项目算用户近7天点击率B项目又写一遍口径还可能不一致。特征存储Feature Store就是为了解决这个问题。它讲的特征存储核心能力有三点。第一是离线在线一致性离线训练用的特征和在线推理用的特征计算逻辑必须完全一致否则会出现“训练时AUC 0.9上线后效果腰斩”的经典事故。第二是时间点正确性做特征回填时必须保证用的是那个时间点之前的数据不能用到未来信息否则模型会“作弊”。第三是特征发现与复用让不同团队能搜索、复用已有特征减少重复劳动。我实际落地时的体会是特征存储不要一上来就搞大而全的平台。可以先从一张特征表开始把最核心的十几个特征管起来跑通离线在线一致性这个关键流程再逐步扩展。一上来就搭平台往往平台还没搭完业务需求已经变了。2.3 模型训练与实验管理让每次实验都可追溯模型训练部分它没有花太多篇幅讲算法原理而是聚焦在实验管理上。这个选择很务实。因为实际工作中你90%的时间不是在发明新算法而是在做对比实验换个特征、调个参数、加个正则看效果有没有提升。如果没有好的实验管理这些实验就是一团乱麻。它推荐的实验管理实践包括每次实验记录超参数、数据集版本、代码commit hash、评估指标、模型文件路径。这些信息看起来琐碎但当你需要复现三个月前某个效果最好的实验时没有这些记录就是大海捞针。我自己的做法是用MLflow或者Weights Biases这类工具自动记录不要靠手动填表格手动记录一定会漏。还有一个细节是随机种子的管理。深度学习训练有随机性同样的代码和数据跑两次结果可能差一个点。它的建议是固定随机种子并且在实验记录里注明。但也要注意固定种子不代表结果完全可复现因为GPU的并行计算本身有非确定性。所以更稳妥的做法是跑多次取平均用均值和方差来评估模型稳定性。2.4 模型部署与推理优化从notebook到生产服务模型部署是AI工程里最容易翻车的环节。notebook里跑得好好的模型一上线就各种问题延迟太高、内存爆了、并发上不去。ai-engineering-from-scratch在这块讲得很细我挑几个关键点说。推理服务的设计它对比了三种模式批推理、实时推理、流式推理。批推理适合对延迟不敏感的场景比如每天跑一次推荐列表实时推理适合用户交互场景要求毫秒级响应流式推理适合持续数据流场景比如传感器数据处理。选哪种模式取决于你的业务对延迟的要求而不是技术炫技。模型优化部分它介绍了量化、剪枝、蒸馏、编译优化几种手段。量化是把FP32权重转成INT8模型体积缩小4倍推理速度提升2-3倍精度损失通常在1%以内。剪枝是去掉不重要的权重连接蒸馏是用大模型教小模型。我的经验是优先试量化因为实现简单、收益明显蒸馏和剪枝需要重新训练成本更高除非量化后精度不达标否则不必上。服务监控是另一个重点。模型上线不是终点而是起点。你需要监控请求延迟分布、错误率、输入数据分布、输出分布、业务指标。其中输入数据分布监控最关键因为数据漂移是模型效果下降的头号原因。它建议对每个特征做PSIPopulation Stability Index计算PSI超过0.2就告警。提示推理服务的资源限制一定要设。我见过一个服务因为没设内存上限一个异常请求把整个节点拖垮连带其他服务一起挂。Kubernetes的resource limit是保命的东西。3. 实操路线我是怎么带着团队走完这一遍的3.1 环境准备与工具选型别追求最新追求最稳动手之前先把环境理清楚。ai-engineering-from-scratch没有强制指定工具栈但给了一个选型原则选社区活跃、文档齐全、和你现有技术栈兼容的工具。我按这个原则搭了一套环境跑下来比较顺。Python环境用uv或者conda管理比pip快很多依赖冲突也少。深度学习框架选PyTorch生态最全遇到问题好搜。实验管理用MLflow开源免费和PyTorch集成简单。数据版本控制用DVC和Git无缝配合。推理服务用FastAPI加Uvicorn轻量够用。容器化用Docker编排用Kubernetes如果规模小用Docker Compose也行。这里有个坑要提醒不要一上来就上Kubernetes。如果你的服务QPS不到100Docker Compose完全够用Kubernetes的运维复杂度会吃掉你大量精力。等业务量上来了再迁移迁移成本没有想象中那么高。工具选型对比我整理了一个表方便你参考环节轻量方案进阶方案选择建议实验管理手动记录ExcelMLflow/WB团队超过2人就用工具数据版本Git LFSDVC/LakeFS数据小于10GB用Git LFS特征存储数据库表Feast/自建特征复用需求强才上推理服务FlaskFastAPITriton延迟敏感用Triton监控告警日志脚本PrometheusGrafana有SLA要求就上3.2 第一个可运行管道从原始数据到推理API我带着团队做的第一个完整管道是一个文本分类服务。数据是业务侧的工单文本目标是自动打标签。这个任务不复杂但把AI工程的全流程都串了一遍。数据摄取阶段我们写了一个Python脚本从数据库拉取工单数据存成Parquet文件。Parquet比CSV好列式存储、压缩率高、读取快。脚本里加了数据验证逻辑检查文本字段非空、长度在合理范围、标签分布没有剧烈变化。验证不通过就中断发告警。特征工程阶段我们做了两件事文本清洗去特殊字符、统一编码和TF-IDF向量化。这里的关键是把特征计算逻辑封装成函数离线和在线共用同一份代码。我们把它打包成一个Python包训练脚本和推理服务都import这个包保证一致性。模型训练阶段我们用了一个简单的Logistic Regression做baseline然后试了BERT微调。实验记录用MLflow每次跑完自动记录参数和指标。这里有个经验先跑baseline再上复杂模型。baseline不仅给你一个效果下限还能帮你验证管道是否通畅。如果baseline都跑不通上BERT只会更乱。模型部署阶段我们用FastAPI包了一个推理接口输入文本输出标签和置信度。接口加了请求限流和超时控制防止异常请求拖垮服务。模型文件存在对象存储里服务启动时拉取版本号写在配置文件里方便回滚。监控阶段我们记录了每个请求的输入文本长度、输出标签分布、推理延迟。用Prometheus采集指标Grafana做面板。设了两个告警延迟P99超过500ms告警标签分布PSI超过0.2告警。整个管道跑通用了大概两周其中一半时间花在数据清洗和验证上。这个时间分配很典型AI工程项目里数据相关的工作占60%以上是常态。3.3 关键参数计算延迟、吞吐、资源怎么估做推理服务资源估算不能拍脑袋。我分享几个实际用到的计算方法。延迟估算单次推理延迟 预处理时间 模型前向时间 后处理时间。预处理包括分词、向量化通常几毫秒到几十毫秒模型前向时间取决于模型大小和硬件BERT-base在CPU上大概50-100ms在GPU上5-10ms后处理通常几毫秒。所以如果你的SLA是200ms用CPU跑BERT-base就很紧张得考虑GPU或者模型压缩。吞吐估算吞吐 并发数 / 平均延迟。比如你希望支持100 QPS平均延迟50ms那需要的并发数 100 * 0.05 5。但实际并发数要考虑峰值通常按平均值的3-5倍预留。所以你需要能支撑15-25个并发请求的实例数。资源估算模型内存占用 ≈ 参数量 * 4字节FP32。比如BERT-base有1.1亿参数FP32下约440MB。加上推理时的中间激活值实际内存占用可能是模型大小的2-3倍。量化到INT8后内存占用降到1/4左右。这些计算看起来简单但实际做容量规划时一定要留buffer。我见过太多服务因为没留buffer流量稍微涨一点就雪崩。4. 踩坑实录那些文档里不会写的教训4.1 数据漂移模型效果下降的隐形杀手上线三个月后模型效果开始缓慢下降。排查了一圈代码没改、模型没换最后发现是输入数据分布变了。业务侧改了一个产品流程用户提交的工单文本长度整体变短了而模型是在长文本上训练的对短文本的判别能力下降。这个坑让我意识到模型监控不能只看技术指标还要看数据分布。我们后来加了一个数据漂移检测模块对每个特征计算PSI每周出一份漂移报告。PSI的计算公式是PSI Σ (实际占比 - 预期占比) * ln(实际占比 / 预期占比)PSI小于0.1表示分布稳定0.1到0.2表示轻微漂移超过0.2表示显著漂移需要重新训练模型。这个阈值不是绝对的要根据业务容忍度调整。4.2 离线在线不一致训练AUC 0.9上线效果腰斩这是AI工程最经典的坑。离线评估AUC 0.9上线后业务指标几乎没提升。排查发现离线特征计算用了全量数据做归一化而在线推理时只能用当前请求的数据做归一化导致特征分布不一致。解决办法是特征计算逻辑必须离线在线统一。具体做法把特征计算封装成独立的服务或库离线训练和在线推理都调用同一个接口。归一化的统计量均值、方差在训练时算好存到特征存储里在线推理时直接读取不要实时计算。这个坑的代价很大我们花了三周才定位和修复。从那以后任何特征上线前必须做离线在线一致性测试用同一批样本分别走离线和在线管道对比特征值是否一致。不一致就不允许上线。4.3 模型版本管理混乱回滚时找不到旧模型有一次线上模型出问题需要紧急回滚。结果发现旧模型文件被覆盖了没有备份。最后只能临时用之前的checkpoint重新导出耽误了两个小时。这个教训是模型文件必须版本化且不可变。每次训练产出的模型存到对象存储时带上版本号和时间戳永远不覆盖。推理服务通过配置指定用哪个版本回滚就是改配置重启。我们后来用MLflow的Model Registry来管理每个模型有明确的阶段Staging、Production、Archived切换阶段就是改一个标签非常方便。4.4 常见问题速查表我把实际遇到的高频问题和解决方法整理成表方便你快速排查问题现象可能原因排查方法解决方案推理延迟突然升高流量突增/模型加载异常看QPS和延迟曲线扩容/重启服务模型效果缓慢下降数据漂移计算特征PSI重新训练模型离线在线效果不一致特征计算逻辑不同对比离线在线特征值统一特征计算代码服务OOM内存泄漏/批次过大看内存监控限制批次大小/修泄漏模型文件丢失未版本化/误覆盖检查存储路径启用版本管理训练结果不可复现随机种子未固定检查种子设置固定种子多次平均注意排查问题时先看监控再看日志最后看代码。很多人一上来就翻代码效率很低。监控能告诉你“发生了什么”日志能告诉你“哪里发生的”代码才能告诉你“为什么发生”。5. 从能跑到好用AI工程能力的进阶方向5.1 自动化训练管道让模型自己迭代跑通手动流程后下一步是自动化。ai-engineering-from-scratch提到了CI/CD/CT的概念持续集成、持续交付、持续训练。CT是AI工程特有的指模型能根据新数据自动触发训练和评估。我们落地的做法是每天凌晨自动拉取新数据跑数据验证验证通过后触发训练训练完自动评估评估指标超过当前生产模型就进入Staging人工审核后切到Production。整个流程用Airflow编排每个环节失败就告警并中断。自动化的收益很明显模型迭代周期从两周缩短到两天。但也要注意自动化不等于无人化关键决策点比如是否上线还是要人工把关。全自动上线风险太大一旦数据有问题可能批量产出错误模型。5.2 模型可解释性与公平性不只是技术问题模型上线后业务方会问“为什么这个工单被打了这个标签”如果你答不上来信任就建立不起来。可解释性工具比如SHAP、LIME能告诉你每个特征对预测结果的贡献度。我们把这个集成到推理服务里业务方在界面上能看到“因为文本中包含‘退款’关键词所以标签是‘售后’”。公平性则是另一个维度。如果模型对某些群体有系统性偏差会带来业务风险。我们定期做公平性评估检查不同群体上的模型表现差异。差异超过阈值就告警需要重新审视训练数据或调整模型。5.3 成本优化AI工程不只是技术活也是经济账GPU很贵推理服务跑起来就是钱。成本优化有几个方向模型压缩量化、剪枝降低单次推理成本弹性伸缩根据流量自动调整实例数混合部署把延迟不敏感的任务放到便宜硬件上缓存对重复请求直接返回缓存结果。我们做了一次量化优化把BERT-base量化到INT8推理成本降了60%精度只掉了0.5%。这个投入产出比很高。但要注意量化不是万能的有些模型对量化敏感精度掉得厉害那就得考虑蒸馏或者换更小的模型。5.4 团队协作AI工程不是一个人的事AI工程项目通常涉及多个角色数据工程师、算法工程师、后端工程师、运维工程师。协作不畅是项目延期的主要原因。我们的做法是用统一的实验管理平台所有人都在上面记录实验用统一的特征存储避免重复造轮子用统一的部署流程算法工程师提交模型后端工程师负责上线职责清晰。还有一个经验是文档要写在代码旁边。README、注释、设计文档都放在代码仓库里和代码一起版本化。写在外部wiki里的文档通常三个月后就过期了没人维护。6. 我个人在实际操作中的几点体会走完这一整套流程我最大的体会是AI工程的核心不是AI是工程。模型算法固然重要但决定项目成败的往往是数据管道稳不稳、部署流程顺不顺、监控告警全不全。ai-engineering-from-scratch这个项目最大的价值就是把这层工程能力系统地讲清楚了。第二个体会是不要追求一步到位。我见过团队一上来就想搭全套MLOps平台结果三个月过去了平台没搭好业务需求也没满足。正确的做法是先跑通最小闭环从数据到模型到服务哪怕用最土的办法然后逐步替换每个环节用工具替代手工。迭代式建设比大爆炸式建设靠谱得多。第三个体会是监控和回滚能力比模型精度更重要。一个AUC 0.85但监控完善、能快速回滚的模型比一个AUC 0.9但出了问题找不到原因的模型对业务的价值大得多。因为前者能持续迭代后者一旦出事就是灾难。最后分享一个小技巧每次上线新模型先跑shadow mode。就是新模型和旧模型同时跑新模型的输出只记录不生效对比两者的差异。跑一周没问题再切流量。这个做法能拦住大部分上线事故成本也不高强烈推荐。这个项目后续还可以往几个方向扩展一是加入更多行业案例比如推荐系统、风控、CV领域的工程实践二是深入讲一下大模型时代的AI工程比如RAG系统的工程挑战、推理加速、上下文管理三是补充团队协作和项目管理的内容毕竟AI工程从来不是纯技术问题。
返回列表